模糊字符串搜索:在另一个子字符串中查找一个字符串

时间:2014-09-16 11:42:58

标签: ruby-on-rails fuzzy-search fuzzy-logic

我想在较大的字符串中找到一个Levenshtein距离的字符串。我已经编写了用于查找两个字符串之间距离的代码,但是当我想找到一些具有固定Levenshtein距离的子字符串时,我希望有效地实现。

module Levenshtein

  def self.distance(a, b)
    a, b = a.downcase, b.downcase
    costs = Array(0..b.length) # i == 0
    (1..a.length).each do |i|
      costs[0], nw = i, i - 1  # j == 0; nw is lev(i-1, j)
      (1..b.length).each do |j|
        costs[j], nw = [costs[j] + 1, costs[j-1] + 1, a[i-1] == b[j-1] ? nw : nw + 1].min, costs[j]
      end
    end
    costs[b.length]
  end

  def self.test
    %w{kitten sitting saturday sunday rosettacode raisethysword}.each_slice(2) do |a, b|
      puts "distance(#{a}, #{b}) = #{distance(a, b)}"
    end
  end

end

1 个答案:

答案 0 :(得分:0)

检查TRE library,这完全符合这一点(在C中),效率非常高。现在仔细看看匹配函数,它基本上是500行不可读(但必要的)代码。

我要说的是,不要滚动自己的版本,并且不打算阅读有关该主题的所有多篇难题论文(搜索"近似的字符串匹配")并且没有几个月可以用于研究这个主题,你可以更好地在图书馆周围写一个小包装器。无论如何,与C中可以获得的相比,你的Ruby版本效率低下。