【问题标题】:Ruby compare two strings similarity percentageRuby比较两个字符串的相似度百分比
【发布时间】:2012-04-07 00:03:26
【问题描述】:

我想在 Ruby 中比较两个字符串并找出它们的相似性

我查看了Levenshtein gem,但似乎这是在 2008 年最后一次更新,我找不到如何使用它的文档。有一些博客暗示它坏了

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

显然,如果这两个字符串是可变长度的,我会遇到 Levenshtein 算法的问题(比如比较两个名称,一个有中间名,一个没有中间名)。

你会建议我做什么来进行百分比比较?

编辑:我正在寻找类似于 PHP 的 similar text

【问题讨论】:

  • 这会生成一个差异列表,我正在寻找百分比相似度
  • 如果字符串的长度不同,应该以哪一个作为计算百分比的基数?
  • 越长越好吗?我试图通过一个名称列表来匹配从一列到另一列的最相似的名称(一侧的名称有中间名或破折号)
  • 可以使用 levenshtein copmarison 并将其转换为百分比,如下所示:stackoverflow.com/questions/10405440/…

标签: ruby-on-rails ruby string text


【解决方案1】:

我可以推荐fuzzy-string-match gem。

你可以这样使用它(取自the docs):

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

它会返回一个分数~0.832,说明这些字符串的匹配程度。

【讨论】:

    【解决方案2】:

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

    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 距离,因为它逐个字符地比较字符串。因此,如果两个名称仅在中间名上有所不同,它们实际上会非常不同。

    【讨论】:

    • 有人能解释一下“相同”吗?所以它遍历每个字符,而 zip 为字符串 A 中的每个字符创建一个数组,其中 - 我期望的是 - 字符串 B 中的每个字符。第二个 each_char 如何知道要连接到数组中的索引?跨度>
    • 另外,如果一开始有一个字符发生变化,这个计算就不好用了。
    • 注意Select中的a,因为它会清除参数传递的变量。最好使用其他字母。 same = a.each_char.zip(b.each_char).select{ |c,d| c == d }.size
    • 它只是在块内隐藏它。
    【解决方案3】:

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

    【讨论】:

    • similar_text gem 冻结在大字符串上,尝试 143kb html 页面
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多