Ruby сравнить две строки процент сходства

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

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

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

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

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

Edit: Im ищет что-то похожее на PHP аналогичный текст

3 ответов


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

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

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

это немного похоже на расстояние Levensthein, в том, что он сравнивает символы строк по символам. Итак, если два имени различаются только по отчеству, они будут совсем другими.


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


и fuzzy-string-match камень.

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

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

он вернет счет ~0.832 который говорит, насколько хорошо эти строки совпадают.