可以自动找到停用词吗?

Posted

技术标签:

【中文标题】可以自动找到停用词吗?【英文标题】:Can stop-words be found automatically? 【发布时间】:2014-04-17 16:29:02 【问题描述】:

在 NLP 中,去除停用词是一个典型的预处理步骤。它通常是根据我们认为停用词应该是什么,以经验的方式完成的。

但在我看来,我们应该概括停用词的概念。对于来自不同领域的语料库,停用词可能会有所不同。我想知道我们是否可以在数学上定义停用词,例如通过其统计特征。然后我们可以自动从特定领域的语料库中提取停用词。

在这方面有没有类似的想法和进展?有人能解释一下吗?

【问题讨论】:

简短回答:根据您的语料库和任务,您可以设置不同的停用词列表。获得截止词频率值很神奇。 【参考方案1】:

是的,可以自动检测停用词。

整体词频

一种方法是将词频视为一个整体。

计算组合文本中所有单词的频率。按降序排列,去掉前 20% 左右。

您可能还希望删除底部的 5%。这些不是停用词,但对于很多机器学习来说,它们是无关紧要的。甚至可能是拼写错误。

每个“文档”的字数

另一种方法是分析每个“文档”的单词。

在一组文档中,可以通过查找大量文档中存在的单词来检测停用词。它们对于在这个特定集合中对文档进行分类或聚类是无用的。

例如对科学论文进行分类的机器学习系统可能在分析后将“抽象”一词标记为停用词,即使每个文档可能只存在一次。但很可能几乎在所有这些人中。

对于仅在非常有限数量的文档中找到的单词也是如此。它们可能拼写错误或非常独特,可能再也见不到了。

但是,在这种情况下,重要的是学习集中的文档组之间的分布是均匀的,或者分成一大一小组的集合可能会丢失所有重要词(因为它们可能存在于太多文档中或太少了)。

另一种避免训练集中分布不均匀的问题的方法是只删除所有或几乎所有文档中存在的单词。 (即我们最喜欢的停用词,如“a”、“it”、“the”、“an”等将存在于所有英文文本中)。

齐夫定律

当我学习机器学习并讨论停用词时,提到了 Zipf 定律。但是,今天我无法告诉您如何或为什么,但也许这是您想要研究的一般原理或数学基础......

我在 Google 上搜索了“齐夫定律自动停用词检测”,快速挑选了两个可能感兴趣的 PDF...

"Automatically Building a Stopword List for an Information Retrieval System"; Rachel Tsz-Wai Lo, Ben He, Iadh Ounis "Automatically Generation and Evaluation of Stop Words List for Chinese Patents"; Deng Na, Chen Xu

【讨论】:

【参考方案2】:

我不是专家,但希望我的回答有意义。

从语料库中统计提取停用词听起来很有趣!我会考虑计算逆文档频率,如其他答案中所述,除了使用常见停用词列表中的常规停用词(如 NLTK 中的停用词)。停用词不仅因语料库而异,它们也可能因问题而异。例如,在我正在处理的一个问题中,我使用了一个新闻文章语料库,您可以在其中找到很多时间敏感和位置敏感的词。这些是至关重要的信息,从统计上删除“今天”、“这里”等词会严重影响我的结果。因为,新闻文章不仅谈论一个特定事件,还谈论过去或在另一个地方发生的类似事件。

简而言之,我的观点是,您还需要考虑正在解决的问题,而不仅仅是语料库。

谢谢, 拉姆亚

【讨论】:

【参考方案3】:

实际上,构建停用词的常用方法是只使用最常见的(在文档中,即 DF)词。建立前 100、200、1000 个单词的列表,然后复习它们。只需浏览列表,直到找到您认为不应成为停用词的词。然后考虑跳过它,或者在此时打破列表。

在许多数据集中,您会有特定领域的停用词。例如,如果您使用 ***,“java”和“c#”很可能是停用词(这实际上不会造成太大伤害;特别是如果您还使用标签)。其他特定领域的停用词可能是“代码”、“实现”、“程序”。

【讨论】:

【参考方案4】:

停用词无处不在。它们将出现在每个(或几乎每个)文档中。用数学方法为不同领域的语料库定义停用词的一个好方法是计算一个词的inverse document frequency (IDF)。

IDF 是一种优于频率计算来定义停用词的更好方法,因为简单的频率计算会多次受到包含特殊词的一些专门文档的不利影响。该方法已被用于自动学习外语停用词(参考Machine Learning with SVM and Other Kernel Methods)。

【讨论】:

【参考方案5】:

通常停用词比其他语义词更频繁地出现......所以在构建我的应用程序时,我使用了两者的组合;固定列表和统计方法。我正在使用 NLTK,它已经列出了一些常见的停用词;所以我首先删除了出现在这个列表中的单词,但是当然这并没有删除所有的停用词......正如你已经提到的,停用词因语料库而异。然后我评估了每个单词出现在语料库中的频率,并删除了频率高于“特定限制”的单词。我提到的这个特定限制是我在观察所有单词的频率后确定的值......因此,这个限制也取决于语料库......但是一旦你仔细观察所有单词的列表,你就可以轻松计算出这个单词按频率顺序排列...这种统计方法将确保您删除未出现在常见停用词列表中的停用词...之后我还使用 POS 标记来优化数据。 .并删除了前两个步骤之后仍然存在的专有名词..

【讨论】:

以上是关于可以自动找到停用词吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以以编程方式配置 PostgreSQL 以不消除全文搜索中的停用词吗?

NLTK 可用于停用词的语言

NLTK 和停用词失败 #lookuperror

英语的“停用词”列表? [关闭]

Elasticsearch的停用词(stopwords)

python使用jieba实现中文文档分词和去停用词