停用词: 性能与精度

从早期的信息检索到如今,我们已习惯于磁盘空间和内存被限制为很小一部分,所以 必须使你的索引尽可能小。 每个字节都意味着巨大的性能提升。 (查看 stemming ) 词干提取的重要性不仅是因为它让搜索的内容更广泛、让检索的能力更深入,还因为它是压缩索引空间的工具。

一种最简单的减少索引大小的方法就是 索引更少的词。 有些词要比其他词更重要,只索引那些更重要的词来可以大大减少索引的空间。

那么哪些词条可以被过滤呢?我们可以简单分为两组:

低频词(Low-frequency terms)

在文档集合中相对出现较少的词,因为它们稀少,所以它们的权重值更高。

高频词(High-frequency terms)

在索引下的文档集合中出现较多的常用词,例如 theand、和is。 这些词的权重小,对相关度评分影响不大。

[TIP]

当然,频率实际上是个可以衡量的标尺而不是非 的标签。我们可以在标尺的任何位置选取一个标准,低于这个标准的属于低频词,高于它的属于高频词。


词项到底是低频或是高频取决于它们所处的文档。单词 and 如果在所有都是中文的文档里可能是个低频词。在关于数据库的文档集合里,单词 database 可能是一个高频词项,它对搜索这个特定集合毫无帮助。

每种语言都存在一些非常常见的单词,它们对搜索没有太大价值。在 Elasticsearch 中,英语默认的停用词为:

  1. a, an, and, are, as, at, be, but, by, for, if, in, into, is, it,
  2. no, not, of, on, or, such, that, the, their, then, there, these,
  3. they, this, to, was, will, with

这些 停用词 通常在索引前就可以被过滤掉,同时对检索的负面影响不大。但是这样做真的是一个较好的解决方案?

停用词的优缺点

现在我们拥有更大的磁盘空间,更多内存,并且还有更好的压缩算法。将之前的 33 个常见词从索引中移除,每百万文档只能节省 4MB 空间。 所以使用停用词减少索引大小不再是一个有效的理由。 (不过这种说法还有一点需要注意,我们在 stopwords-phrases讨论。)

在此基础上,从索引里将这些词移除会使我们降低某种类型的搜索能力。将前面这些所列单词移除会让我们难以完成以下事情:

  • 区分 happynot happy
  • 搜索乐队名称 The The。
  • 查找莎士比亚的名句 ``To be, or not to be’’ (生存还是毁灭)。
  • 使用挪威的国家代码: no

移除停用词的最主要好处是性能,假设我们在个具有上百万文档的索引中搜索单词 fox。或许 fox 只在其中 20 个文档中出现,也就是说 Elasticsearch 需要计算 20 个文档的相关度评分_score 从而排出前十。现在我们把搜索条件改为the OR fox,几乎所有的文件都包含the这个词,也就是说 Elasticsearch 需要为所有一百万文档计算评分_score`。 由此可见第二个查询肯定没有第一个的结果好。

幸运的是,我们可以用来保持常用词搜索,同时还可以保持良好的性能。首先我们一块学习如何使用停用词。