Как искать строку для длинного списка шаблонов - PullRequest
0 голосов
/ 26 октября 2019

Я пишу инструмент для индексации документа. У меня есть длинный список из сотен, возможно, тысяч фиксированных шаблонов. Например, мой индекс может выглядеть как {"cat training":"p.27", "cat handling":"p.29", "cat":"p.15", "dog training":"p.62", "dog":"p.60"} и т. Д.

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

Еще одно осложнение состоит в том, что я хочу, чтобы совпадения происходили в словеграницы. Т.е. я не хочу, чтобы «catch» соответствовал «cat».

Есть ли питонский способ сделать это? Мое текущее решение состоит в том, чтобы сканировать исходную строку, слово за словом, а затем пытаться сопоставить начало строки со всем моим индексом. Это работает, но довольно медленно.

1 Ответ

1 голос
/ 27 октября 2019

Алгоритм Ахо-Корасика был разработан для решения этого типа проблемы.

Он использовался для ответа на предыдущий вопрос Переполнение стека о сопоставлении большого количества шаблонов .

Библиотека Python для Aho-Corasick .

Процедура изменения алгоритма Aho-Corasick для границ слов

...