Подтвердить что ты не робот

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

Мне нравится сравнивать две строки в Ruby и находить их сходство

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

Он вернет оценку ~0.832, которая сообщает, насколько хороши эти строки.