Как я могу эффективно найти всех людей, упомянутых в каком-либо тексте, терпя при этом орфографические ошибки?
У меня есть список имен миллионов известных людей (из Викиданных), и мне нужно создать систему, которая бы эффективно находила всех людей, упомянутых в довольно коротком тексте: это может быть всего одно слово (например, "Эйнштейн") для несколько страниц текста (например, страница в Википедии).
Мне нужно, чтобы система была достаточно терпимой к орфографическим ошибкам (например, Микаэль Джексон вместо Майкла Джексона) и коротким формам (например, М. Джексон). В случае двусмысленности, он должен вернуть всех возможных людей (например, "Джордж Буш" должен вернуть и отца и сына, и, возможно, другие омонимы).
На этот связанный вопрос есть несколько интересных ответов, в том числе с использованием алгоритма Aho-Corasick. Есть библиотеки на многих языках, в том числе и на Python. Тем не менее, он не поддерживает нечеткий поиск (т. Е. Допускает опечатки).
Думаю, я мог бы расширить словарный запас, включив в него все возможные варианты написания каждого имени, но это сделало бы словарь слишком большим, поэтому я бы предпочел этого избежать, если это возможно (более того, я могу захотеть распространить это решение не только на один пункт).
Я быстро взглянул на Lucene/ ElasticSearch, но, похоже, он не поддерживает этот вариант использования (если я не пропустил его).
Есть идеи?
1 ответ
Elasticsearch имеет поддержку нечеткого соответствия: см. Документацию здесь.