两个数组之间使用模糊字符串匹配的最佳匹配

时间:2015-03-21 07:46:06

标签: ruby algorithm

我需要一种方法来找到两个数组之间的最佳匹配。

数组a包含产品名称 数组b指的是所有相同的产品,但名称可能略有不同。

a = [
    "F542521376-34-REG",
    "AF7U",
    "AF106U",
    "F521521376-30R"
]

b = [
    "F54252137634R",
    "AF7U",
    "AF106U",
    "F52152137630R"
]

最佳匹配:

"F542521376-34-REG" - "F54252137634R"
"AF7U"              - "AF7U"
"AF106U"            - "AF106U"
"F521521376-30R"    - "F52152137630R"

或:

a[0] - b[0]
a[1] - b[1]
a[2] - b[2]
a[3] - b[3]

(列表之间的第一个和最后一个元素不同。)

我可以使用模糊字符串匹配算法来获得字符串相似性的数值(0.0-1.0)。但仅凭这一点不会让我得到列表元素的最佳匹配。我没有为此找到算法,我不想暴力破解它。

实际的应用是,我有一些中间红宝石代码,可以在两个第三方系统之间转换信息,数据质量到处都是。我需要匹配元素来创建一个查找表。没有人知道产品“名称”的格式和突变可能是什么。

2 个答案:

答案 0 :(得分:1)

我有一个类似的问题,我使用gem fuzzy_match来解决。 该提议假定a和b之间的关系不一定是一对一的。

require 'fuzzy_match'

fz=FuzzyMatch.new(a)

map = {}
map[nil] = []   # elements in b with no match in a 
a.each{|r| map[r] = []} # In case more than one element in b match a

b.each do |name|
 map[fz.find(name)] << name
end

这给出了“地图”:

{"F542521376-34-REG"=>["F54252137634R"],
 "AF7U"=>["AF7U"],
 "AF106U"=>["AF106U"],
 "F521521376-30R"=>["F52152137630R"]}

如果匹配不够好,可以使用fuzzy_match的几个参数来改善匹配结果。

答案 1 :(得分:0)

(a & b).size.to_f / a.size # or b.size, depends on your needs