5

我有一组搜索词,例如 [ +dog -“jack russels”+“fox terrier” ]、[ +cat +persian -tabby ]。这些可能很长,每个术语可能包含 30 个子术语。

我现在有一些在线新闻文章摘录,例如 [ “我的狐狸梗是世界上最可爱的狗……” ] 和 [ “有人看到我丢失的波斯猫了吗?他失踪了……” ]。它们不太长,每个最多 500 个字符。

在传统的搜索引擎中,人们期望大量的文章被预处理成索引,从而在搜索给定的“搜索词”时允许加速,使用集合理论/布尔逻辑将文章减少到仅与短语匹配的文章。但是,在这种情况下,我的搜索词的顺序是 ~10^5,我希望能够一次处理一篇文章,以查看该文章将匹配的所有搜索词集(即所有+项都在文本中,没有-项)。

我有一个可能的解决方案,使用两张地图(一张用于正面子短语,一张用于负面子短语),但我认为它不会非常有效。

一等奖将是解决这个问题的图书馆,二等奖是朝着解决这个问题的正确方向推动。

亲切的问候,

4

2 回答 2

1

假设匹配需要所有正子项:

将搜索词中的所有子词放入哈希表中。子项是键,值是指向完整搜索项数据结构的指针(应包括唯一的 id 和子项到布尔值的映射)。

此外,在处理新闻项目时,创建一个“候选人”地图,由术语 id 索引。每个候选结构都有一个指向术语定义的指针,一个包含看到的子术语的集合和一个“拒绝”标志。

遍历新闻文章的文字。

对于每个命中,查找候选条目。如果不存在,请创建并添加一个空的。

如果设置了候选拒绝标志,您就完成了。

否则,从术语数据结构中查找子术语。如果为负,则设置拒绝标志。如果是肯定的,则将该子项添加到所见子项的集合中。

最后,迭代候选者。所有未被拒绝且所见集合的大小等于该术语的正子术语数的候选者都是您的命中。

实施:https ://docs.google.com/document/d/1boieLJboLTy7X2NH1Grybik4ERTpDtFVggjZeEDQH74/edit

运行时间为 O(n * m),其中 n 是文章中的字数,m 是共享相同子词的最大词数(预计相对较小)。

于 2012-05-18T11:26:55.097 回答
0

首先,我认为制作文档的后缀树会使搜索速度更快,因为您需要构建一次,但您可以根据查询的长度多次使用它。

其次,您需要迭代所有搜索词(+ 和 - )以确保答案是否为“是”(即文档与查询匹配)。但是,对于“否”的答案,你不知道!如果答案是否定的,那么将搜索词与文档匹配的顺序真的很重要。也就是说,一个订单可能比另一个订单更快地给你一个“不”。现在的问题是“获得快速 NO 的最佳顺序是什么?”。这确实取决于应用程序,但一个好的起点是,与诸如“cat”之类的短术语相比,诸如“red big cat”之类的多词术语在文档中的重复频率较低,反之亦然。所以,首先使用+“Loo ooo ooo ooo ooo ong”和-“short”术语。

于 2012-05-18T10:50:29.830 回答