3 回答

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超4個(gè)贊
我建議你創(chuàng)建自己的操作詞單列表,你從禁用詞列表中取出。可以方便地減去集合,因此:
operators = set(('and', 'or', 'not'))
stop = set(stopwords...) - operators
然后,你可以簡單地測試一個(gè)字in或not in一組不依賴于你的運(yùn)營商是否停止字列表的一部分。然后,您可以稍后切換到另一個(gè)禁用詞列表或添加運(yùn)算符。
if word.lower() not in stop:
# use word

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊
@ alvas的答案可以完成這項(xiàng)任務(wù),但可以更快地完成。假設(shè)你有documents:一個(gè)字符串列表。
from nltk.corpus import stopwords
from nltk.tokenize import wordpunct_tokenize
stop_words = set(stopwords.words('english'))
stop_words.update(['.', ',', '"', "'", '?', '!', ':', ';', '(', ')', '[', ']', '{', '}']) # remove it if you need punctuation
for doc in documents:
list_of_words = [i.lower() for i in wordpunct_tokenize(doc) if i.lower() not in stop_words]
請注意,由于您在這里搜索集合(不在列表中),因此理論上速度會(huì)len(stop_words)/2快一些,如果您需要通過許多文檔操作,則速度很快。
對于5000個(gè)大約300個(gè)單詞的文檔,我的例子為1.8秒,@ alvas為20秒。
PS在大多數(shù)情況下,您需要將文本劃分為單詞以執(zhí)行其他使用tf-idf的分類任務(wù)。所以最有可能的是使用stemmer也會(huì)更好:
from nltk.stem.porter import PorterStemmer
porter = PorterStemmer()
并[porter.stem(i.lower()) for i in wordpunct_tokenize(doc) if i.lower() not in stop_words]在循環(huán)內(nèi)部使用。
添加回答
舉報(bào)