Обнаружение похожих по звучанию слов в Ruby
Вопрос
Я знаю о SOUNDEX и (двойном) Metaphone, но они не позволяют мне проверить сходство слов в целом - например, «Привет» звучит очень похоже на «Пока», но оба эти метода пометят их. как совершенно другое.
Существуют ли какие-либо библиотеки в Ruby или какие-либо известные вам методы, способные определить сходство между двумя словами?(Либо логическое значение похоже/не похоже, либо числовое сходство на 40 %).
редактировать: Дополнительные бонусные баллы, если есть простой способ «перейти» на другой диалект или язык!
Решение
Я думаю, вы описываете расстояние Левенштейна.И да, для этого есть драгоценные камни.Если вам нравится чистый Ruby, выберите текстовый драгоценный камень.
$ gem install text
Документы есть более подробная информация, но вот суть:
Text::Levenshtein.distance('test', 'test') # => 0
Text::Levenshtein.distance('test', 'tent') # => 1
Если вас устраивают собственные расширения...
$ gem install levenshtein
Его использование аналогично.Его производительность очень хорошая.(В моих системах он обрабатывает около 1000 исправлений орфографии в минуту.)
Если вам нужно узнать, насколько похожи два слова, используйте расстояние, а не длину слова.
Если вам нужен простой тест на сходство, рассмотрите что-то вроде этого:
Непроверено, но прямо:
String.module_eval do
def similar?(other, threshold=2)
distance = Text::Levenshtein.distance(self, other)
distance <= threshold
end
end
Другие советы
Вы можете сначала предварительно обработать слова, используя базу данных тезауруса, которая преобразует слова со схожим значением в одно и то же слово.Существуют различные базы данных тезаурусов, но, к сожалению, мне не удалось найти приличную бесплатную базу данных для английского языка ( http://www.gutenberg.org/etext/3202 это тот, который я нашел, но он не показывает, какие отношения имеют конкретные слова (например, подобные;противоположный;альтернативное значение;и т. д.), поэтому все слова в одной строке имеют некоторый отношение, но вы не будете знать, что это за отношение)
Но, например, для венгерского языка есть хорошая бесплатная база данных тезауруса, но у вас нет soundex/metaphone для венгерских текстов...
Если у вас есть база данных, написать программу, которая предварительно обрабатывает тексты, не так уж сложно (в конечном итоге это простая замена поиска, но вы также можете захотеть предварительно обработать базу данных тезауруса, используя симплекс или метафон)