Ruby сравнивает две строки в процентах сходства - PullRequest
13 голосов
/ 22 марта 2012

Я хотел бы сравнить две строки в Ruby и найти их сходство

Я посмотрел на гем Levenshtein, но, похоже, он последний раз обновлялся в 2008 году, и я не могу найти документацию, какиспользовать это.В некоторых блогах, предлагая его сломанный

, я попробовал гем text с Левенштейном, но он дает целое число (чем меньше, тем лучше)

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

Что бы вы предложили мне сделать, чтобы получить процентное сравнение?

Редактировать:Я ищу что-то похожее на PHP аналогичный текст

Ответы [ 3 ]

16 голосов
/ 22 марта 2012

Я думаю, что ваш вопрос мог бы быть связан с некоторыми пояснениями, но вот что-то быстрое и грязное (вычисляется в процентах от более длинной строки согласно вашему разъяснению выше):

def string_difference_percent(a, b)
  longer = [a.size, b.size].max
  same = a.each_char.zip(b.each_char).select { |a,b| a == b }.size
  (longer - same) / a.size.to_f
end

Я до сих пор не уверен, насколько чувствительна разница в процентах, которую вы ищете, но это должно как минимум начать.

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

15 голосов
/ 08 ноября 2013

Теперь есть похожий рубиновый камень для схожего текста. https://rubygems.org/gems/similar_text Он предоставляет метод similar, который сравнивает две строки и возвращает число, представляющее процентное сходство между двумя строками.

11 голосов
/ 22 сентября 2015

Я могу порекомендовать камень fuzzy-string-match.

Вы можете использовать его следующим образом (взято из документов ):

require "fuzzystringmatch"
jarow = FuzzyStringMatch::JaroWinkler.create(:native)
p jarow.getDistance("jones", "johnson")

Будет возвращено значение ~0.832, которое говорит о том, насколько хороши эти строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...