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

3
我需要一种方法来找出两个数组之间的最佳匹配。
数组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)。但仅靠这个并不能让我获得最佳的列表元素匹配。我没有找到适合此需求的算法,也不想采用蛮力方法。

实际应用场景是,我有一些中间层 Ruby 代码,用于在两个第三方系统之间传输信息,而数据质量却是参差不齐的。我需要匹配这些元素以创建查找表。产品名称的格式和变异是无法预测的。

2个回答

2

我曾经遇到类似的问题,用了名为 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

这是“map”的含义:
{"F542521376-34-REG"=>["F54252137634R"],
 "AF7U"=>["AF7U"],
 "AF106U"=>["AF106U"],
 "F521521376-30R"=>["F52152137630R"]}

如果匹配不够准确,可以使用几个参数来改善模糊匹配的结果。请注意保留HTML标签。

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

2
请在您的答案中添加简要说明,说明它是如何工作的。 - Mohit Jain
我不明白。也许我误导了。我需要一种方法来根据元素最佳匹配对两个数组进行排序(或链接)。 - Chris Cummings

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接