编程语言
首页 > 编程语言> > php-实施关键字比较方案(反向搜索)

php-实施关键字比较方案(反向搜索)

作者:互联网

我有一个不断增长的关键字数据库.我需要解析输入的文本输入(文章,提要等),并从数据库中找到文本中存在的关键字.关键字数据库比文本数据库大得多.

由于数据库不断增长(用户添加了越来越多的关键字来关注),我认为最好的选择是将文本输入分解为单词,然后将它们与数据库进行比较.我的主要难题是实现此比较方案(此项目将使用PHP和MySQL).

最幼稚的实现是针对关键字表创建一个简单的SELECT查询,并使用巨大的IN子句列出所有找到的关键字.

SELECT user_id,keyword FROM keywords WHERE keyword IN ('keyword1','keyword2',...,'keywordN');

另一种方法是在内存中创建哈希表(使用类似memcache的东西)并以相同的方式对其进行检查.

是否有人对这种搜索有任何经验,并且对如何更好地实现这一点有任何建议?我还没有尝试过任何一种方法,目前我只是在收集想法.

解决方法:

在文本流中搜索多个关键字的经典方法是Aho-Corasick finite automaton,它在要搜索的文本中使用时间线性.您可能希望进行较小的修改以仅在单词边界上识别字符串,或者只是检查找到的关键字并确保它们未嵌入较大的单词中会更简单.

您可以在fgrep中找到实现.更好的是,Preston Briggs用C语言编写了一个非常不错的实现,它确实执行了您正在谈论的关键字搜索. (它会在程序中搜索“有趣的”标识符的出现.)Preston的实现是Noweb literate-programming tool的一部分.您可以找到一种从PHP调用此代码的方法,也可以在PHP中重写它-认识到它本身就是关于220行的C,而主程序又是135行.

所有提议的解决方案,包括Aho-Corasick,都具有以下共同特征:

>预处理步骤所花费的时间和空间与数据库中关键字的数量成正比.
>搜索步骤所花费的时间和空间与文本的长度和找到的关键字数量成正比.

Aho-Corasick在搜索步骤中提供了更好的比例常数,但是,如果您的文本很小,那就没关系了.实际上,如果您的文本很小而数据库很大,那么您可能希望最小化预处理步骤中使用的内存量. Andrew Appel从the world’s fastest scrabble program开始的DAWG数据结构可能会解决问题.

标签:search,tokenize,keyword,mysql,php
来源: https://codeday.me/bug/20191108/2004627.html