Я попытался проверить, существует ли ключевое слово в некотором предложении. Если ключевое слово - только одно, легко узнать, совпадают ли они или нет. Но если задан большой набор ключевых слов, это занимает слишком много времени, чтобы узнать. Поэтому я искал алгоритм 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 алгоритма примерно в 3 раза медленнее, чем использование функции strpos
php. Как проверить, что ключевое слово сопоставляется в senctence более быстро и эффективно?
По всем вопросам, включая официальное руководство PHP, strpos()
, безусловно, является самым быстрым методом поиска строки в другой.
Непосредственно из руководства:
Если вы хотите только определить, существует ли конкретная игла в стоге сена, используйте вместо нее более быструю и менее интенсивную память strpos().
Он намного быстрее, чем pregmatch()
, который уже очень эффективен по памяти и даже быстрее, чем strstr()
.
Я считаю, что я серьезно сомневаюсь, что любым способом вы найдете функцию или создайте алгоритм быстрее, чем родной strpos()
.
Предполагая, что $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;
}
}