【问题标题】:Algorithm for search in inverted index倒排索引中的搜索算法
【发布时间】:2014-03-02 05:38:53
【问题描述】:

假设人们在 google 中搜索了 100 亿个单词。相应的 对于每个单词,您都有所有文档 ID 的排序列表。该列表如下所示:

[Word 1]->[doc_i1,doc_j1,.....]
[Word 2]->[doc_i2,doc_j2,.....]
...
...
...
[Word N]->[doc_in,doc_jn,.....]

我正在寻找一种算法来查找 100 个稀有词对。 稀有词对是一对同时出现(不一定连续)的词 正好 1 个文档。

如果可能的话,我正在寻找比 O(n^2) 更好的东西。

【问题讨论】:

  • 复杂度必须也是文件数量的函数。您对文字和文档的复杂性要求是什么?
  • 假设一个词可以出现的最大文档数是m,那么在O(2*m)最坏的情况下可以找到两个词的交集(两个词都存在的文档)。在这种情况下,可以在 O(n^2*m) 中找到单个稀有词对(蛮力)。我正在寻找比这更好的东西。
  • 您可以轻松获得O(d * w^2 * m),其中w 是每个文档的最大字数,d 是文档数。这样更好吗?
  • @zvisofer:您可以使用散列得到O(m)。并且对所有列表进行排序是O(n log m) 甚至是使用整数排序的线性时间,因此如果需要,它很容易作为预处理步骤进行
  • @Microbotz:您枚举了O(d) 迭代中的所有文档。在每个文档中都有O(w) 单词,因此您枚举O(w^2) 中的所有对。现在,对于每一对,计算它们在O(m) 中的文档列表的交集,以检查它们是否恰好出现一次。整个算法是O(d * w^2 * m),但在实践中,您可能会多次找到许多单词对。如果发生这种情况,您可以跳过相交部分并在许多情况下保存因子m。这是否优于原始算法很大程度上取决于您的数据。我看不出你从哪里得到O(d^2)

标签: algorithm sorting set information-retrieval inverted-index


【解决方案1】:
  1. 您根据单词出现的文档数量对单词进行排序。这里的想法是,很少出现的单词也很少成对出现。如果您发现恰好出现在一个文档中的单词,只需从该文档中选择任何其他单词即可。
  2. 然后您开始反转索引,从最稀有的单词开始。这意味着您创建一个地图,其中每个文档都指向其中的一组单词。首先,您仅使用最稀有的单词创建该倒排索引。将与该最稀有词相关联的所有文档插入倒排索引后,您将拥有一张地图,其中每个文档都指向一个词。
  3. 然后添加下一个单词及其所有文档,仍然遵循 (1.) 中创建的顺序。在某些时候,您会发现与某个单词相关联的文档已经出现在您的倒排地图中。在这里,您可以检查与该文档相关的所有单词是否构成如此罕见的单词对。

事物的性能在很大程度上取决于找到 100 个这样的对要走多远,这个想法是在只处理了总数据集的一小部分之后就完成了。为了利用您只处理一小部分数据这一事实,您应该在 (1.) 中采用一种排序算法,该算法允许您在整个集合排序之前很久就找到最小的元素,例如快速排序。然后可以像 O(N*log(N1) ) 一样进行排序,其中 N1 是在找到 100 对之前实际需要添加到倒排索引中的单词数。其他操作的复杂性,即向倒排索引添加一个词检查一个词对是否出现在多个文档中也与每个文档的数量成线性关系word,所以这些操作在开始时应该很快,然后慢慢变慢,因为以后每个单词都有更多的文档。

【讨论】:

    【解决方案2】:

    这与“频繁项集挖掘”相反

    即查看最近的出版物:Rare pattern mining: challenges and future perspectives

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-06
      • 1970-01-01
      • 2012-05-12
      • 2011-04-26
      • 2012-02-19
      • 1970-01-01
      • 2012-02-18
      • 2013-09-30
      相关资源
      最近更新 更多