![]() |
1
3
在文本流中搜索多个关键字的经典方法是 Aho-Corasick finite automaton ,它在要搜索的文本中使用时间线性。您可能希望进行一些小的调整,以便只识别单词边界上的字符串,或者检查找到的关键字并确保它们没有嵌入到较大的单词中可能会更简单。
您可以在
所有提议的解决方案, 包括 Aho Corasick,有这些共同点:
Aho Corasick在搜索步骤中提供了更好的比例常数,但是如果你的文本很小,这无关紧要。事实上,如果你的文本很小,你的数据库很大,你可能想要最小化预处理步骤中使用的内存量。Andrew Appel的DAWG数据结构 the world's fastest scrabble program 可能会成功。 |
![]() |
2
1
一般来说,
缓存一个3或4个字母的散列数组来预过滤潜在的关键字可能是值得的;您将不得不进行实验,以找到内存大小和有效性之间的最佳折衷。 |
![]() |
3
0
我不是百分之百清楚你在问什么,但也许你在找的是 inverted index ? 更新: 可以使用反向索引一次匹配多个关键字。 将新文档拆分为标记,并将与文档标识符成对的标记插入到反向索引表中。一个(相当非规范化的)反向索引表:
如果手动搜索3个关键字:
如果有一个包含您关心的关键字的表,只需使用内部联接而不是in()操作:
有没有更接近你想要的? |
![]() |
4
0
|
![]() |
5
0
我会在这里做两件事。 首先(这与问题没有直接关系),我将按用户分解和划分用户关键字。具有较少数据的多个表,理想地在不同的服务器上进行分布式查找,其中用户的切片或范围存在于不同的切片上。AKA,所有的USERA的数据都存在于切片1,USEB在切片二上,等等。 第二,我有一些内存哈希表来确定关键字的存在。这也可能是联合的,以分发查找。对于N个关键字存在服务器,哈希关键字和mod它的N,然后分发这些键的范围在所有的MycChar服务器上。这个快速的方法可以让你说是关键字x被监视,散列它并确定它的服务器 将 继续活着。然后进行查找并收集/聚合要跟踪的关键字。 在这一点上,您将至少知道哪些关键字正在被跟踪,您可以获取用户切片并执行后续查找,以确定哪些用户正在跟踪哪些关键字。 简而言之: 在这里,SQL不是一个理想的解决方案。 |
![]() |
6
0
我用一个dawg(如上面提到的拼字纸)为扫描多个关键字修改了一些代码,尽管我是从第一原则开始写的,我不知道它是否像AHO算法。 http://www.gtoal.com/wordgames/spell/multiscan.c.html 一个朋友在我第一次将我的代码发布到wordgame程序员邮件列表中后,对我的代码进行了一些修改,他的版本可能更高效: http://www.gtoal.com/wordgames/spell/multidawg.c.html 规模相当大。。。 克 |
![]() |
John Veridan · 在Python笔记本中仅选择列[无行] 6 年前 |
![]() |
seanysull · 修改regex以包含连字符单词 6 年前 |
![]() |
Ovaflow · 使用nltk中的标记集计算语音中的不同单词 7 年前 |
![]() |
Laurent R · 根据空格和标点符号标记,标点符号保留 7 年前 |
![]() |
mrfr · StreamTokenizer在遇到斜杠时停止 7 年前 |
![]() |
Rose · Elasticsearch:术语搜索不适用于特殊字符 7 年前 |
![]() |
vakarami · 用于提取文件名的模式标记器 7 年前 |
![]() |
Konstantin · 用Ruby将单词分解成字母 7 年前 |