Эффективный алгоритм поиска набора совпадений в коротком тексте - PullRequest
2 голосов
/ 03 декабря 2010

Ввод:

  1. относительно короткий (обычно 100-1000 символов) текст.
  2. фиксированный список из примерно 5000 выражений, заданных заранее,большинство из них длиной до 10-20 символов, некоторые из которых содержат другие в качестве подвыражений (например, «Попробуйте» и «Попробуйте снова»).

Примечание - только первый вводизменения, второй считается константой и доступен для предварительной обработки.

Желаемый результат:

Определение всех совпадений выражений из пункта 2 внутри текста,Если имеются неоднозначности совпадений, по возможности возьмите жадное совпадение.

Время выполнения должно быть относительно быстрым, но без строгих требований к производительности.Здесь может быть достаточно попытки грубой силы.

Какой хороший алгоритм для этого?Полезны ли здесь суффиксные деревья?Как насчет того, чтобы просмотреть все выражения и поместить их в хеш-таблицу?Также обратите внимание, что меня интересуют практических решений , поэтому простота реализации может оказаться более полезной, чем суперэффективный алгоритм ...

Ответы [ 2 ]

2 голосов
/ 03 декабря 2010

Взгляните на алгоритм Aho-Corasick .

1 голос
/ 03 декабря 2010

Общий «алгоритм», предполагающий неограниченное хранилище, для его оптимизации состоит в том, чтобы построить дерево на основе символов, позволяющее вам рекурсивно искать свой шаблон. При построении древовидного индекса вы перемещаетесь вниз, пока не достигнете «уникальной» точки, а «лист» даст местоположение, где находится это уникальное вхождение.

В приведенном выше абзаце, например, слово «индекс» встречается один раз. Если дерево строится по одному символу за раз, тогда путь дерева, по которому мы идем, начинается с символа «i», а затем «in». Если он чувствителен к регистру, есть только 3 случая (предположения, оптимизация и индексирование). Когда мы в следующий раз ищем «d», мы получаем наш уникальный результат. Конечно, мы могли бы начать наш поиск сначала с пробела, затем с i, а затем с n, и мы бы пошли другим путем.

Вы также можете сделать дерево нечувствительным к регистру и использовать «nybble», а не байт в каждой точке ветвления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...