Ruby比较两个字符串的相似百分比

Aks*_*hat 13 ruby string text ruby-on-rails

我喜欢在Ruby中比较两个字符串并找到它们的相似性

我看过这个Levenshtein宝石,但它似乎是在2008年最后一次更新,我找不到文档如何使用它.一些博客暗示其破碎

text用Levenshtein 尝试了宝石,但它给出了一个整数(越小越好)

显然,如果两个字符串的长度可变,我会遇到Levenshtein算法的问题(比较两个名称,其中一个名称中间名称,一个名称不同).

你有什么建议我做百分比比较?

编辑:我正在寻找类似PHP的类似文本

Mic*_*ohl 17

我认为你的问题可以做一些澄清,但这里有一些快速和肮脏的东西(按照你上面的澄清计算为较长字符串的百分比):

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
Run Code Online (Sandbox Code Playgroud)

我仍然不确定你所寻找的这个百分比差异有多大意义,但这应该让你至少开始.

它有点像Levensthein距离,因为它逐字符地比较字符串.因此,如果两个名称仅由中间名称不同,那么它们实际上会非常不同.


小智 16

现在有一个用于similar_text的ruby gem.https://rubygems.org/gems/similar_text 它提供了similar一种比较两个字符串并返回表示两个字符串之间相似百分比的数字的方法.

  • similar_text gem冻结大字符串,尝试143kb html页面 (3认同)

cze*_*asz 12

我可以推荐fuzzy-string-match宝石.

您可以像这样使用它(取自文档):

require "fuzzystringmatch"
jarow = FuzzyStringMatch::JaroWinkler.create(:native)
p jarow.getDistance("jones", "johnson")
Run Code Online (Sandbox Code Playgroud)

它将返回一个分数~0.832,表示这些字符串的匹配程度.