如何使用NLTK tokenizer摆脱标点符号?

liz*_*isk 111 python nlp tokenize nltk

我刚刚开始使用NLTK,我不太明白如何从文本中获取单词列表.如果我使用nltk.word_tokenize(),我会得到一个单词和标点符号列表.我只需要单词代替.我怎样才能摆脱标点符号?也word_tokenize没有多话来:点加到硬道理.

rma*_*ouf 144

看看nltk 在这里提供的其他标记化选项.例如,您可以定义一个标记生成器,该标记生成器将字母数字字符序列选为标记并删除其他所有内容:

from nltk.tokenize import RegexpTokenizer

tokenizer = RegexpTokenizer(r'\w+')
tokenizer.tokenize('Eighty-seven miles to go, yet.  Onward!')
Run Code Online (Sandbox Code Playgroud)

输出:

['Eighty', 'seven', 'miles', 'to', 'go', 'yet', 'Onward']
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果使用此选项,则会丢失特殊于"word_tokenize"的自然语言功能,例如拆分收缩.你可以天真地拆分正则表达式`\ w +`而不需要NLTK. (50认同)
  • 为了说明@sffc评论,您可能会丢失诸如“先生”之类的词。 (3认同)

Sal*_*ali 43

你真的不需要NLTK来删除标点符号.你可以用简单的python删除它.对于字符串:

import string
s = '... some string with punctuation ...'
s = s.translate(None, string.punctuation)
Run Code Online (Sandbox Code Playgroud)

或者对于unicode:

import string
translate_table = dict((ord(char), None) for char in string.punctuation)   
s.translate(translate_table)
Run Code Online (Sandbox Code Playgroud)

然后在您的tokenizer中使用此字符串.

PS字符串模块具有一些可以删除的其他元素集(如数字).

  • 这种方法在 python >= 3.1 中不起作用,因为“translate”方法只接受一个参数。如果你仍然想使用“translate”方法。 (5认同)
  • 使用也可以使用列表表达式删除所有标点符号。`a =“ * fa,fd.1lk#$” print(“”。join([w代表w,如果w不在字符串中。标点符号])) (3认同)

Mad*_*eep 27

下面的代码将删除所有标点符号以及非字母字符.从他们的书复制.

http://www.nltk.org/book/ch01.html

import nltk

s = "I can't do this now, because I'm so tired.  Please give me some time. @ sd  4 232"

words = nltk.word_tokenize(s)

words=[word.lower() for word in words if word.isalpha()]

print(words)
Run Code Online (Sandbox Code Playgroud)

产量

['i', 'ca', 'do', 'this', 'now', 'because', 'i', 'so', 'tired', 'please', 'give', 'me', 'some', 'time', 'sd']
Run Code Online (Sandbox Code Playgroud)

  • 请注意,使用此方法,在"不能"或"不要"的情况下,您将失去"不"这个词,这对于理解和分类句子可能非常重要.最好使用sentence.translate(string.maketrans("","",),chars_to_remove),其中chars_to_remove可以是".,':;!?" (14认同)
  • @MikeL在进行kankaning之前,不能通过导入收缩和contractions.fix(sentence_here)绕过“不能”和“不要”之类的词。它将“不能”变成“不能”,将“不”变成“不”。 (3认同)

小智 15

正如注释中所注意到的那样,以sent_tokenize()开头,因为word_tokenize()仅适用于单个句子.您可以使用filter()过滤标点符号.如果你有一个unicode字符串,请确保它是一个unicode对象(不是'str'编码的某些编码,如'utf-8').

from nltk.tokenize import word_tokenize, sent_tokenize

text = '''It is a blue, small, and extraordinary ball. Like no other'''
tokens = [word for sent in sent_tokenize(text) for word in word_tokenize(sent)]
print filter(lambda word: word not in ',-', tokens)
Run Code Online (Sandbox Code Playgroud)

  • Penn Treebank令牌化程序涉及的大多数复杂性都与正确处理标点符号有关.为什么要使用昂贵的标记器来处理标点符号,如果你只是要删除标点符号? (13认同)
  • `word_tokenize`是一个函数,它返回`[在_treebank_word_tokenize(已发送)]中为令牌发送的sent_tokenize(text,language)令牌.所以我认为你的答案是做nltk已经做的事情:在使用`word_tokenize()之前使用`sent_tokenize()`.至少这是针对nltk3的. (2认同)
  • @rmalouf因为你不需要只有标点符号的令牌?所以你想要`did`和`n't`而不是`.` (2认同)

vis*_*ish 10

我刚刚使用了以下代码,删除了所有标点符号:

tokens = nltk.wordpunct_tokenize(raw)

type(tokens)

text = nltk.Text(tokens)

type(text)  

words = [w.lower() for w in text if w.isalpha()]
Run Code Online (Sandbox Code Playgroud)

  • 为什么将令牌转换为文本? (2认同)

Bor*_*per 9

诚恳的问一句,什么是字?如果你的假设,就是一个字只包含字母,你是因为词语,如错误can't会被破坏成碎片(如cant,如果你断词之前删除标点符号,这是非常有可能产生负面影响您的程序。

因此,解决方案是先标记然后删除标点符号

import string

from nltk.tokenize import word_tokenize

tokens = word_tokenize("I'm a southern salesman.")
# ['I', "'m", 'a', 'southern', 'salesman', '.']

tokens = list(filter(lambda token: token not in string.punctuation, tokens))
# ['I', "'m", 'a', 'southern', 'salesman']
Run Code Online (Sandbox Code Playgroud)

...然后如果你愿意,你可以'mam.


Nis*_*nga 7

您可以在一行中完成此操作,无需 nltk (python 3.x)。

import string
string_text= string_text.translate(str.maketrans('','',string.punctuation))
Run Code Online (Sandbox Code Playgroud)


小智 6

我认为你需要某种正则表达式匹配(以下代码在Python 3中):

import string
import re
import nltk

s = "I can't do this now, because I'm so tired.  Please give me some time."
l = nltk.word_tokenize(s)
ll = [x for x in l if not re.fullmatch('[' + string.punctuation + ']+', x)]
print(l)
print(ll)
Run Code Online (Sandbox Code Playgroud)

输出:

['I', 'ca', "n't", 'do', 'this', 'now', ',', 'because', 'I', "'m", 'so', 'tired', '.', 'Please', 'give', 'me', 'some', 'time', '.']
['I', 'ca', "n't", 'do', 'this', 'now', 'because', 'I', "'m", 'so', 'tired', 'Please', 'give', 'me', 'some', 'time']
Run Code Online (Sandbox Code Playgroud)

在大多数情况下应该可以正常工作,因为它会在保留"not"之类的标记时删除标点符号,这些标记无法从正则表达式标记符中获取wordpunct_tokenize.