Обнаружение похожих по звучанию слов в Ruby

StackOverflow https://stackoverflow.com/questions/2531502

  •  22-09-2019
  •  | 
  •  

Вопрос

Я знаю о 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 для венгерских текстов...

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top