Обнаружение похожих звучащих слов в Ruby - PullRequest
4 голосов
/ 28 марта 2010

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

Существуют ли в Ruby какие-либо библиотеки или какие-либо известные вам методы, способные определить сходство между двумя словами? (Либо логическое значение / не похоже, либо числовое значение на 40% похоже)

edit: Дополнительные бонусные баллы, если есть простой способ «вставить» другой диалект или язык!

Ответы [ 2 ]

8 голосов
/ 28 марта 2010

Я думаю, вы описываете расстояние Левенштейна. И да, для этого есть драгоценные камни. Если вы любите чистый 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
0 голосов
/ 28 марта 2010

Сначала вы можете предварительно обработать слова, используя базу данных тезауруса, которая преобразует слова с похожим значением в одно и то же слово. Существуют различные базы данных тезауруса, к сожалению, я не смог найти приличную бесплатную базу данных для английского языка (http://www.gutenberg.org/etext/3202 - это та, которую я нашел, но это не показывает, какие отношения имеют конкретные слова (например, похожие; напротив). ; альтернативное значение; и т. д.), поэтому все слова в одной строке имеют отношение некоторое , но вы не будете знать, что это за отношение)

Но, например, для венгерского языка есть хорошая бесплатная база данных тезауруса, но у вас нет soundex / метафона для венгерских текстов ...

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

...