【问题标题】:Word Frequency in text using Python but disregard stop words使用 Python 的文本中的词频但忽略停用词
【发布时间】:2011-03-11 13:22:07
【问题描述】:

这给了我一个文本中单词的频率:

 fullWords = re.findall(r'\w+', allText)

 d = defaultdict(int)

 for word in fullWords :
          d[word] += 1

 finalFreq = sorted(d.iteritems(), key = operator.itemgetter(1), reverse=True)

 self.response.out.write(finalFreq)

这也给了我诸如“the”“an”“a”之类的无用词

我的问题是,python 中是否有一个停用词库可以删除所有这些常用词?我想在谷歌应用引擎上运行它

【问题讨论】:

标签: python google-app-engine frequency-analysis word-frequency


【解决方案1】:

有一个简单的方法可以通过稍微修改你的代码(编辑以反映约翰的评论)来处理这个问题:

stopWords = set(['a', 'an', 'the', ...])
fullWords = re.findall(r'\w+', allText)
d = defaultdict(int)
for word in fullWords:
    if word not in stopWords:
        d[word] += 1
finalFreq = sorted(d.iteritems(), key=lambda t: t[1], reverse=True)
self.response.out.write(finalFreq)

这种方法分两步构建排序列表:首先它过滤掉您想要的“停用词”列表中的任何单词(为了提高效率,已将其转换为set),然后对剩余条目进行排序。

【讨论】:

  • Ummmm:为什么要插入停用词,然后再把它们撕掉?修复两行:` if word not in stopwords: d[word] += 1` 后跟一个简单的finalFreq = d.items()
  • @John:我错过了。虽然根据定义,停用词的数量是有限的,所以这没什么大不了的。
  • 是您的最新编辑:您不需要 []sorted() 接受任何可迭代),而 (k,v) for k,v in d.iteritems() 只是 d.iteritems()
【解决方案2】:

我知道 NLTK 有一个包含语料库和多种语言(包括英语)停用词的包,请参阅here 了解更多信息。 NLTK 还有一个词频计数器,它是一个很好的自然语言处理模块,您应该考虑使用它。

【讨论】:

    【解决方案3】:

    您可以将停用词列表下载为各种格式的文件,例如来自here——所有Python需要做的就是读取文件(这些是csv格式,很容易用csv模块读取),创建一个集合,并使用该集合中的成员资格(可能有一些规范化,例如小写)以从计数中排除单词。

    【讨论】:

      【解决方案4】:
      stopwords = set(['an', 'a', 'the']) # etc...
      finalFreq = sorted((k,v) for k,v in d.iteritems() if k not in stopwords,
                            key = operator.itemgetter(1), reverse=True)
      

      这将过滤掉stopwords 集中的所有键。

      【讨论】:

      • 查看我对 DavidZ 答案的评论,你的也有同样的问题。
      • 这不是一个真正的问题 - 性能方面,您正在为每个结果键的集合查找交换正则表达式匹配的每个单词的集合查找。哪个更有效将取决于问题集的参数。无论如何,您已经在迭代要输出的结果键集,因此用于过滤的生成器表达式不会涉及太多额外的开销 - 没有创建额外的列表,并且没有修改 dict(所以你实际上并不是“把它们撕掉”;只是过滤它们,使它们永远不会进入排序列表)。
      猜你喜欢
      • 1970-01-01
      • 2012-09-22
      • 2015-07-20
      • 2013-02-18
      • 2018-03-30
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 2018-08-07
      相关资源
      最近更新 更多