如何检查句子中是否存在关键字集?

时间:2015-02-16 01:26:44

标签: php algorithm

我试图检查关键字是否存在于某个句子中。 如果关键字只是一个,则很容易找出是否匹配。 但如果给出了大关键字集,则需要花费太多时间才能找到答案。所以我搜索了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倍。 如何更快更有效地检查关键词是否与句子匹配?

2 个答案:

答案 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;
    }
}