【问题标题】:Detecting similar strings in Ruby.在 Ruby 中检测相似的字符串。
【发布时间】:2012-10-19 13:12:47
【问题描述】:

在我的数据库中,有一些条目,例如。 Тормозной дискДиски тормозные LPR 等在 art_groups_arr 数组中。我想找到所有类似Тормозной диск的条目,比如Диски тормозные LPR

这段代码:

art_groups_arr.each do |artgrarr|
  if n2.art_group.include?(artgrarr)
    non_original << n2
  end
end

显然没有找到它们。我怎样才能找到那些相似的字符串?

【问题讨论】:

  • 为什么会这样?
  • @oldergod 因为它有很多相同的字母 :D 但实际上它是相同的......但是计算机没有 IO,但是在这个例子中如何引入它......
  • 我想你必须去比较 Диски Тормозные 或 Тормозные Диски 是否都存在于数组中。
  • @AlokSwain no.... one 是复数形式,有其他顺序

标签: ruby-on-rails ruby include


【解决方案1】:

你也许可以使用正则表达式,例如:

art_groups_arr.each do |art_gr_arr|
  if n2.art_group.any? { |element|
    /ормозн/ =~ element and /диск/ =~ element
  } then non_original << n2 end
end

或者,you can try out fuzz_ball gem 声称实现了 Smith-Waterman 算法。

require 'fuzz_ball'
THRESHOLD_SCORE = 0.75
MATCHER = FuzzBall::Searcher.new [ 'Тормозной диск LPR' ]

def complies?( str )
  matchdata = MATCHER.search str
  return false if matchdata.nil? or matchdata.empty?
  score = matchdata[0][:score]
  puts "score is #{score}"
  score > THRESHOLD_SCORE
end

art_groups_arr.each do |art_gr_arr|
  if n2.art_group.any? { |element| complies? element } then
    non_original << n2
  end
end

对于'Диски тормозные LPR' 你得到分数0.861,你必须调整阈值。

【讨论】:

  • 在这种情况下,您将需要一个字符串分类算法。您需要做出决定并首先选择一个。例如,您可以计算字符串与“Тормозный Диск”的距离。例如,此类算法用于生物学中的序列比较。
  • Here you go, string metrics, choose one... 我建议使用 Smith-Waterman 算法。
  • 我尝试了 fuzz_ball,但它总是在使用 Ruby 1.9.x 时崩溃。见github.com/vincentchu/fuzz_ball/issues/1
  • @chrish:我自己也遇到过fuzz_ball 的崩溃案例。如果您找到更好的 Smith-Waterman 宝石,请告诉我。
猜你喜欢
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
  • 2013-07-22
  • 2013-11-24
相关资源
最近更新 更多