我有一组搜索字词,例如[ + dog - “jack russels”+“fox terrier”],[ + cat + persian -tabby ]。这些可能很长,每个学期可能有30个子学期。
我现在有一些在线新闻文章摘录如[“我的狐狸梗是世界上最可爱的狗......”]和[“有没有人见过我丢失的波斯猫?他失踪了......“]。它们不会太长,每个最多可能有500个字符。
在传统的搜索引擎中,人们期望大量的文章被预先处理成索引,允许在搜索给定的“搜索术语”时加速,使用集合论/布尔逻辑将文章减少到只匹配短语。但是,在这种情况下,我的搜索词的顺序是~10 ^ 5,我希望能够一次处理一篇文章,以查看该文章将与之匹配的所有搜索词集(即所有 + 术语都在文本中,而没有 - 术语。
我有一个可能的解决方案,使用两个地图(一个用于正面的子短语,一个用于负面的子短语),但我认为它不会非常有效。
一等奖将是一个解决这个问题的图书馆,二等奖是推动解决这个问题的正确方向。
亲切的问候,
答案 0 :(得分:1)
假设比赛需要所有正面的子条款:
将搜索字词中的所有子字词放入哈希表中。子项是关键,值是指向完整搜索项数据结构的指针(应包括唯一的id和布尔的子项映射)。
此外,在处理新闻项目时,创建一个“候选人”地图,由术语id索引。每个候选结构都有一个指向术语定义的指针,一个包含所见子项和“被拒绝”标志的集合。
重复新闻文章的内容。
对于每次点击,查找候选条目。如果没有,请创建并添加一个空的。
如果设置了候选拒绝标志,则表示您已完成。
否则,从术语数据结构中查找子术语。 如果为负数,则设置被拒绝的标志。 如果是肯定的,则将子项添加到所见的子项集中。
最后,迭代候选人。所有未被拒绝的候选人以及所看到的集合的大小等于该术语的正面子条款的数量都是您的命中。
实施:https://docs.google.com/document/d/1boieLJboLTy7X2NH1Grybik4ERTpDtFVggjZeEDQH74/edit
运行时间为O(n * m),其中n是文章中的单词数,m是共享相同子项的最大术语数(预计相对较小)。
答案 1 :(得分:0)
首先,我认为制作文档的Suffix Tree可以使搜索速度更快,因为您需要构建一次,但是您可以使用它作为查询长度的次数。
其次,您需要迭代所有搜索项(+和 - ),以确保答案是肯定的(即文档与查询匹配)。但是,对于“不”答案,你不要!如果答案为否,那么将搜索项与文档匹配的顺序确实很重要。这是一个订单可能会给你一个比另一个订单更快的“不”。现在的问题是“获得快速NO的最佳顺序是什么?”。这实际上取决于应用程序,但一个很好的起点是,与“cat”这样的短期术语相比,文档中重复使用诸如“红色大猫”之类的多词术语,反之亦然。所以,首先使用+“Loo ooo ooo ooo ooo ong”和 - “短”术语。