我刚开始使用NLTK,我不太明白如何从文本单词的列表。 如果我使用nltk.word_tokenize()
我得到词和标点符号的列表。 我只需要字来代替。 我怎样才能摆脱标点符号? 此外word_tokenize
并不多话来:点加到硬道理。
Answer 1:
看看那个NLTK提供其他标记化选择这里 。 例如,您可以定义挑选出的字母数字字符序列令牌和其他一切下降一个标记生成器:
from nltk.tokenize import RegexpTokenizer
tokenizer = RegexpTokenizer(r'\w+')
tokenizer.tokenize('Eighty-seven miles to go, yet. Onward!')
输出:
['Eighty', 'seven', 'miles', 'to', 'go', 'yet', 'Onward']
Answer 2:
你并不真的需要NLTK去除标点符号。 你可以用简单的Python将其删除。 对于字符串:
import string
s = '... some string with punctuation ...'
s = s.translate(None, string.punctuation)
或对Unicode:
import string
translate_table = dict((ord(char), None) for char in string.punctuation)
s.translate(translate_table)
然后在您的标记生成器使用这个字符串。
PS串模块有一些其它组可被移除(如数字)元件。
Answer 3:
下面的代码将删除所有标点符号以及非字母字符。 从他们的书抄。
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)
产量
['i', 'ca', 'do', 'this', 'now', 'because', 'i', 'so', 'tired', 'please', 'give', 'me', 'some', 'time', 'sd']
Answer 4:
正如评论注意到开始sent_tokenize(),因为word_tokenize()只适用于一个简单的句子。 你可以滤除带过滤器标点符号()。 如果你有一个Unicode字符串确保是一个Unicode对象(不喜欢“UTF-8”一些编码编码的“STR”)。
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)
Answer 5:
我只是用下面的代码,它删除了所有的标点符号:
tokens = nltk.wordpunct_tokenize(raw)
type(tokens)
text = nltk.Text(tokens)
type(text)
words = [w.lower() for w in text if w.isalpha()]
Answer 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)
输出:
['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']
在大多数情况下工作得很好,因为它消除了标点,同时保留标记,如“不”,不能从正则表达式断词,如获得wordpunct_tokenize
。
Answer 7:
我使用此代码删除标点:
import nltk
def getTerms(sentences):
tokens = nltk.word_tokenize(sentences)
words = [w.lower() for w in tokens if w.isalnum()]
print tokens
print words
getTerms("hh, hh3h. wo shi 2 4 A . fdffdf. A&&B ")
如果你想检查令牌是否是一个有效的英文单词或没有,你可能需要PyEnchant
教程:
import enchant
d = enchant.Dict("en_US")
d.check("Hello")
d.check("Helo")
d.suggest("Helo")
Answer 8:
除去punctuaion(它将删除。以及使用以下代码的标点处理部分)
tbl = dict.fromkeys(i for i in range(sys.maxunicode) if unicodedata.category(chr(i)).startswith('P'))
text_string = text_string.translate(tbl) #text_string don't have punctuation
w = word_tokenize(text_string) #now tokenize the string
样品输入/输出:
direct flat in oberoi esquire. 3 bhk 2195 saleable 1330 carpet. rate of 14500 final plus 1% floor rise. tax approx 9% only. flat cost with parking 3.89 cr plus taxes plus possession charger. middle floor. north door. arey and oberoi woods facing. 53% paymemt due. 1% transfer charge with buyer. total cost around 4.20 cr approx plus possession charges. rahul soni
['direct', 'flat', 'oberoi', 'esquire', '3', 'bhk', '2195', 'saleable', '1330', 'carpet', 'rate', '14500', 'final', 'plus', '1', 'floor', 'rise', 'tax', 'approx', '9', 'flat', 'cost', 'parking', '389', 'cr', 'plus', 'taxes', 'plus', 'possession', 'charger', 'middle', 'floor', 'north', 'door', 'arey', 'oberoi', 'woods', 'facing', '53', 'paymemt', 'due', '1', 'transfer', 'charge', 'buyer', 'total', 'cost', 'around', '420', 'cr', 'approx', 'plus', 'possession', 'charges', 'rahul', 'soni']