在 nltk (python) 中使用什么标准来构建英语停用词列表?

What criterion was used to build the list of english stop words in nltk (python)?

我想知道为什么像 "therefore" 或 "however" 或 "etc" 这样的词没有包括在内。 你能建议一个策略来自动使这个列表更通用吗? 一个显而易见的解决方案是包括所有文档中出现的每个单词。但是,可能在某些文档中 "therefore" 不会出现。 需要明确的是,我并不是在谈论通过包含特定数据集的词来扩充列表。例如,在某些数据集中,可能有兴趣过滤一些专有名称。我不是在谈论这个。我说的是包含可以出现在任何英文文本中的通用词。

修改停用词列表的问题在于,没有好的方法可以收集关于某个主题的所有文本,然后自动丢弃出现得太频繁的所有内容。这可能会导致无意中只删除了您正在寻找的主题 – 因为 在有限的语料库中它出现的频率相对较高。此外,任何停用词列表可能已经只包含您要查找的短语。例如,自动创建 1980 年代音乐组的列表几乎肯定会丢弃组 The The.

NLTK documentation 指的是他们的停用词列表的来源:

Stopwords Corpus, Porter et al.

但是,该参考文献写得不是很好。它似乎表明这是 1980 年代 Porter Stemmer 的一部分(PDF:link 的 http://stp.lingfil.uu.se/~marie/undervisning/textanalys16/porter.pdf; thanks go to alexis),但这实际上并没有提到停用词。另一个消息来源指出:

The Porter et al refers to the original Porter stemmer paper I believe - Porter, M.F. (1980): An algorithm for suffix stripping. Program 14 (3): 130—37. - although the et al is confusing to me. I remember being told the stopwords for English that the stemmer used came from a different source, likely this one - "Information retrieval" by C. J. Van Rijsbergen (Butterworths, London, 1979).
https://groups.google.com/forum/m/#!topic/nltk-users/c8GHEA8mq8A

Van Rijsbergen 的全文可在网上找到(PDF:http://openlib.org/home/krichel/courses/lis618/readings/rijsbergen79_infor_retriev.pdf);它提到了几种预处理文本的方法,因此很值得一读。快速浏览一下,生成停用词列表的首选算法似乎一直追溯到

等研究

LUHN, H.P., 'A statistical approach to mechanised encoding and searching of library information', IBM Journal of Research and Development, 1, 309-317 (1957).

可以追溯到自动文本处理的早期阶段。

您的问题标题询问了用于编制停用词列表的标准。查看 stopwords.readme() 会指向 Snowball source code,根据我在那里阅读的内容,我认为该列表基本上是 hand-compiled,其主要目标是排除不规则的单词形式为了向词干分析器提供更好的输入。所以如果排除掉一些无趣的词,对系统来说问题不大。

至于如何构建更好的列表,这是一个很大的问题。您可以尝试计算语料库中每个单词的 TF-IDF 分数。永远不会获得高 tf-idf 分数(对于任何文档)的词是无趣的,可以进入停用词列表。