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

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

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

Этот связанный вопрос есть несколько интересных ответов, включая использование алгоритма Ахо-Корасика . Существуют библиотеки на многих языках, включая на Python. Однако, похоже, он не поддерживает нечеткий поиск (т. е. допускает опечатки).

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

Я быстро просмотрел Lucene/ElasticSearch, но, похоже, он не поддерживает этот вариант использования (если только я не пропустил Это).

Есть идеи?


person MiniQuark    schedule 15.11.2016    source источник


Ответы (1)


Elasticsearch поддерживает нечеткое сопоставление: см. документацию здесь.

person codegrep_admin    schedule 16.11.2016