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)
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字符串模块具有一些可以删除的其他元素集(如数字).
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)
小智 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)
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)
诚恳的问一句,什么是字?如果你的假设,就是一个字只包含字母,你是因为词语,如错误can't
会被破坏成碎片(如can
和t
),如果你断词之前删除标点符号,这是非常有可能产生负面影响您的程序。
因此,解决方案是先标记然后删除标点符号。
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)
...然后如果你愿意,你可以'm
用am
.
您可以在一行中完成此操作,无需 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
.