java - 短语查询和使用 shingle 过滤器有什么区别?

标签 java lucene information-retrieval

我目前正在使用 lucene 索引网页。目的是能够快速提取哪个页面包含某个表达式(通常是 1、2 或 3 个词),以及页面中还包含哪些其他词(或其中的 1 到 3 个词组)。 这将用于构建/丰富/更改词库(固定词汇)。

从我找到的文章来看,问题似乎是找到n-grams (或木瓦)。

Lucene 有一个 ShingleFilter , 一个 ShingleMatrixFilter , 和一个 ShingleAnalyzerWrapper ,这似乎与此任务有关。

从这里presentation ,我了解到 Lucene 还可以搜索由固定数量的单词(称为 slops)分隔的术语。提供了一个例子here .

但是,我不清楚这些方法之间的区别?它们是根本不同的,还是您必须做出的性能/索引大小选择?

ShingleMatrixFilter 和 ShingleFilter 有什么区别?

希望 Lucene 专家能找到这个问题,并回答 ;-) !

最佳答案

使用 phrase 和 shingle 的区别主要在于性能和评分。

当在索引中有单个单词的典型情况下使用短语查询(比如“foo bar”)时,短语查询必须遍历“foo”和“bar”的倒排索引,并找到同时包含这两个词的文档术语,然后遍历每个文档中的位置列表,以找到“foo”出现在“bar”之前的位置。

这对性能和评分都有一些影响:

  1. 必须对位置 (.prx) 进行索引和搜索,这就像倒排索引的附加“维度”,会增加索引和搜索时间
  2. 因为倒排索引中只出现个别术语,所以没有计算真正的“短语 IDF”(这可能不会影响您)。因此,这是基于术语 IDF 的总和来近似计算的。

另一方面,如果你使用 shingles,你也在索引单词 n-gram,换句话说,如果你使用 shingling 到 2,你也会在索引中有像“foo bar”这样的术语。这意味着对于这个短语查询,它将被解析为一个简单的 TermQuery,而不使用任何位置列表。由于它现在是一个“真正的术语”,因此 IDF 一词将是准确的,因为我们确切地知道这个“术语”存在多少文档。

但是使用带状疱疹也有一些成本:

  1. 增加了术语词典、术语索引和帖子列表的大小,尽管这可能是一个公平的权衡,尤其是当您完全使用 Field.setIndexOptions 完全禁用位置时。
  2. 索引分析阶段的一些额外成本:尽管 ShingleFilter 优化得很好并且速度非常快。
  3. 没有明显的方法来计算“草率的短语查询”或不精确的短语匹配,尽管这可以近似计算,例如对于带有大小为 2 的带状疱疹的短语“foo bar baz”,您将有两个标记:foo_bar、bar_baz,并且您可以通过一些 lucene 的其他查询(如 BooleanQuery)实现搜索以获得不精确的近似值。

一般来说,使用 Shingles 或 CommonGrams 索引 word-ngrams 只是一种权衡(相当专家),以降低位置查询的成本或提高短语评分。

但是这个东西有真实的用例,这里有一个很好的例子: http://www.hathitrust.org/blogs/large-scale-search/slow-queries-and-common-words-part-2

关于java - 短语查询和使用 shingle 过滤器有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8582531/

相关文章:

java - Wikipedia Dump 会在 Lucene 中变大吗?

lucene - Mahout 0.7 与 Lucene 4.0.0 兼容吗?

java - 在这种情况下我怎样才能最好地应用Hibernate-Search?

c# - 如何在我的 C# 项目中使用 Google 搜索?

information-retrieval - 用于在网站上查找联系方式的脚本或库

java - 打印在 Java 中旋转的图像会增加伪影

java - 如何以编程方式将两个文本文件中的 "changes"合并到一个文件中?

java - Android:通过 BLE 发送数据 >20 字节

java - chrome 应用程序和 pc 可执行软件之间的区别

java - 用于严格文档相似度的文本相似度函数