Как я могу проверить, существует ли набор ключевых слов в предложении?

0

Я попытался проверить, существует ли ключевое слово в некотором предложении. Если ключевое слово - только одно, легко узнать, совпадают ли они или нет. Но если задан большой набор ключевых слов, это занимает слишком много времени, чтобы узнать. Поэтому я искал алгоритм 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 более быстро и эффективно?

  • 0
    Может быть, вы можете сделать это наоборот. Вместо того, чтобы перебирать каждый элемент в массиве, вы можете разбить предложение и проверить, существует ли каждое слово в массиве ключевых слов. Я думаю, что это будет быстрее, если у вас есть короткие предложения.
  • 0
    Сколько времени это займет с strpos ()? Как быстро это должно быть? Насколько изменчивым является массив ключевых слов?
Показать ещё 1 комментарий
Теги:
algorithm

2 ответа

2
Лучший ответ

По всем вопросам, включая официальное руководство PHP, strpos(), безусловно, является самым быстрым методом поиска строки в другой.

Непосредственно из руководства:

Если вы хотите только определить, существует ли конкретная игла в стоге сена, используйте вместо нее более быструю и менее интенсивную память strpos().

Он намного быстрее, чем pregmatch(), который уже очень эффективен по памяти и даже быстрее, чем strstr().

Я считаю, что я серьезно сомневаюсь, что любым способом вы найдете функцию или создайте алгоритм быстрее, чем родной strpos().

  • 0
    Это не совсем его проблема. Его проблема в том, что ему нужен более эффективный способ поиска миллиона разных ключевых слов внутри предложения. Производительность его текущего алгоритма плохая, потому что он ищет в строке каждое ключевое слово. Алгоритм поиска строк вообще неэффективен, потому что он должен быть в состоянии найти любую подстроку (включая пробелы). Посмотрите на ответ ниже, чтобы понять, что может быть более эффективным подходом ...
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;
    }
}
  • 0
    Очень умный, мне это нравится. Если массив $words фактически имеет ключевые слова в качестве своих ключей, а не его значения, ваш алгоритм будет очень быстрым (при условии, что PHP обрабатывает массивы ключ / значение с помощью хеш-таблицы).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню