使用模糊匹配算法比较数据元素的最佳方法

时间:2016-05-16 17:56:05

标签: levenshtein-distance hamming-distance fuzzy-comparison

我希望通过C#中的记录链接模糊匹配算法比较两个数据元素或字段,我想确定哪种算法最适合每次比较。

我想要比较的字段是:

  • 姓氏
  • 名字
  • 性别
  • 出生年份
  • 出生月份
  • 出生日
  • SSN
  • 会员编号
  • MRN
  • 街道号码
  • 街道名称
  • 街道类型
  • Street Directional
  • 国家
  • 邮编
  • 电话

我目前正在使用的近似字符串匹配算法(ASM):

  • Levenshtein距离
  • 汉明距离
  • Jaccard Distance
  • Jaro Distance
  • Jaro-Winkler距离
  • 最长公共子序列
  • 最长公共子串
  • 重叠系数
  • Ratcliff-Obershelp相似性
  • Sorensen-Dice Distance
  • Tanimoto Coefficient
  • Damerau-Levenshtein距离
  • 瓦格纳 - 费希尔距离
  • 探测法
  • Metaphone 3
  • NYSIIS

首先,我要比较两个字段,例如FirstName1FirstName2,看看它们是否完全匹配。

例如,FirstName1 = "Bob"FirstName2 = "Bob"将完全匹配,因此不会继续进行模糊匹配。

另一方面,FirstName1 = "Jill"FirstName2 = "Bob"将继续对两个字段进行模糊比较。

我想知道是否有人知道什么模糊匹配算法更适合在某些字段比较而不是其他字段比较,反之亦然。

1 个答案:

答案 0 :(得分:1)

我刚刚为实体解析编写了一些类似的代码。关键是并非所有字段都是相同的。例如,你应该SSN上使用ASM - 即使一个不同的数字/字符是完全不同的SSN和人。

我会尝试首先解析地址,然后进行完全匹配,而不是模糊匹配地址组件。例如,一个好的地址解析服务将会对待:

Second Street NWNW 2nd St

尽管他们的所有指标的相似度非常差,但它们仍然是同一条街道。

同样,您可以使用Google的电话号码解析库(可用于C#,Java等)以标准方式格式化所有电话号码,然后进行直接比较。

我确实使用Jaro-Winkler来比较名称组件,但我没有研究您列出的几个指标。

简而言之:

规范化和比较

而不是模糊匹配。