我需要一种方法来找到两个数组之间的最佳匹配。
数组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)。但仅凭这一点不会让我得到列表元素的最佳匹配。我没有为此找到算法,我不想暴力破解它。
实际的应用是,我有一些中间红宝石代码,可以在两个第三方系统之间转换信息,数据质量到处都是。我需要匹配元素来创建一个查找表。没有人知道产品“名称”的格式和突变可能是什么。
答案 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