为了账号安全,请及时绑定邮箱和手机立即绑定

使用NLTK删除停用词

使用NLTK删除停用词

胡子哥哥 2019-08-31 10:34:03
我试图通过使用nltk工具包删除停用词来处理用户输入的文本,但是使用停用词删除时,会删除“和”,“或”,“不”之类的词。我希望在禁用词删除过程之后出现这些单词,因为它们是稍后将文本作为查询处理所需的运算符。我不知道哪些是文本查询中可以成为运算符的单词,我还想从文本中删除不必要的单词。
查看完整描述

3 回答

?
Helenr

TA贡献1780条经验 获得超4个赞

我建议你创建自己的操作词单列表,你从禁用词列表中取出。可以方便地减去集合,因此:


operators = set(('and', 'or', 'not'))

stop = set(stopwords...) - operators

然后,你可以简单地测试一个字in或not in一组不依赖于你的运营商是否停止字列表的一部分。然后,您可以稍后切换到另一个禁用词列表或添加运算符。


if word.lower() not in stop:

    # use word


查看完整回答
反对 回复 2019-08-31
?
慕仙森

TA贡献1827条经验 获得超7个赞

@ alvas的答案可以完成这项任务,但可以更快地完成。假设你有documents:一个字符串列表。


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]

请注意,由于您在这里搜索集合(不在列表中),因此理论上速度会len(stop_words)/2快一些,如果您需要通过许多文档操作,则速度很快。


对于5000个大约300个单词的文档,我的例子为1.8秒,@ alvas为20秒。


PS在大多数情况下,您需要将文本划分为单词以执行其他使用tf-idf的分类任务。所以最有可能的是使用stemmer也会更好:


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]在循环内部使用。


查看完整回答
反对 回复 2019-08-31
  • 3 回答
  • 0 关注
  • 1481 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信