我喜欢在Ruby中比较两个字符串并找到它们的相似性
我已经看过Levenshtein
宝石,但它似乎是最后一次更新于2008年,我找不到文档如何使用它。一些博客暗示其破碎
我用Levenshtein尝试了text
宝石,但它给出了一个整数(越小越好)
显然,如果两个字符串的长度可变,我会遇到Levenshtein算法的问题(比较两个名称,其中一个名称中间名称,一个名称不存在)。
您建议我做什么来进行百分比比较?
编辑:我正在寻找类似于PHP的similar text
答案 0 :(得分:16)
我认为你的问题可以通过一些澄清来解决,但是这里有一些快速和肮脏的东西(根据你上面的澄清计算为较长字符串的百分比):
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距离,因为它逐字符地比较字符串。因此,如果两个名称仅由中间名称不同,那么它们实际上会非常不同。
答案 1 :(得分:15)
现在有一个用于similar_text的ruby gem。 https://rubygems.org/gems/similar_text
它提供了一个similar
方法,用于比较两个字符串并返回一个数字,表示两个字符串之间的百分比相似度。
答案 2 :(得分:11)
我可以推荐fuzzy-string-match
gem。
您可以像这样使用它(取自the docs):
require "fuzzystringmatch"
jarow = FuzzyStringMatch::JaroWinkler.create(:native)
p jarow.getDistance("jones", "johnson")
它会返回一个分数~0.832
,它会告诉这些字符串有多好。