我试图检查关键字是否存在于某个句子中。
如果关键字只是一个,则很容易找出是否匹配。
但如果给出了大关键字集,则需要花费太多时间才能找到答案。所以我搜索了Aho-Corasick算法,需要线性时间才能找到答案。
但算法没有帮助。因为它比使用strpos
函数需要更多时间。
我认为关键字集太大了。
这是使用navite php功能。
$sentence = "The big brown fox jumps over the lazy dog";
$keywords = array(...); // $keywords count is about 1,000,000
$keywordsCount = count($keywords);
$isMatched = false;
for ($i = 0; $i < $keywordsCount; $i++) {
if (strpos($sentence, $keywords[$i])) {
$isMatched = true;
}
}
这是使用aho-corasick算法。 (https://github.com/MartyIX/AhoCorasickPHP/)
$sentence = "The big brown fox jumps over the lazy dog";
$keywords = array(...); // $keywords count is about 1,000,000
$keywordsCount = count($keywords);
$isMatched = false;
$ac = new AhoCorasick();
$tree = $ac->buildTree($keywords);
$result = $ac->FindAll($sentence);
var_dump($result);
使用aho-corasick算法比使用strpos
php函数 3倍。
如何更快更有效地检查关键词是否与句子匹配?
答案 0 :(得分:2)
从各方面来看,包括官方PHP手册在内, strpos()
是迄今为止在另一个内找到字符串的最快方法。
直接来自手册:
如果您只想确定特定针是否在其中 haystack,使用更快,内存更少的内存密集函数strpos() 代替。
它远远快于pregmatch()
,它已经非常有效地记忆,甚至比strstr()
更快。
我的观点是,我严重怀疑通过任何方法,你会发现一个函数或制作一个比原始strpos()
更快的算法。
答案 1 :(得分:1)
假设$keywords
是一个简单的数组...
$sentence = "The big brown fox jumps over the lazy dog";
$words = explode(' ', strtolower($sentence));
$keywords = array(...); // $keywords count is about 1,000,000
$keywords_map = array_flip($keywords); // assuming all keywords are already lowercase
$isMatched = false;
foreach ($words as $word) {
if (array_key_exists($word, $keywords_map)) {
$isMatched = true;
break;
}
}