我试着检查关键字是否存在于某个句子中。如果关键字仅为一个,则很容易确定是否匹配。但是,如果给出了大关键字集,则需要花费太多时间才能找到答案。所以我搜索了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倍.如何更快、更有效地检查上下文中匹配的关键字?
发布于 2015-02-16 01:31:24
从所有的帐户,包括正式的PHP手册来看,strpos()是到目前为止找到另一个字符串最快的方法。
直接从手册:
如果您只想确定某个针是否发生在干草堆中,请使用更快、内存较少的函数strpos()。
它比pregmatch()快得多,后者在内存方面已经非常高效,甚至比strstr()还要快。
我的观点是,我非常怀疑,通过任何方法,您都会比本地strpos()更快地找到一个函数或创建一个算法。
发布于 2015-02-16 01:55:07
假设$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;
}
}https://stackoverflow.com/questions/28533294
复制相似问题