7

我正在开发一个应用程序,它必须能够在存储在 sql server DB 中的数十万个联系信息中找到并合并重复项。我必须比较表中的所有列,每列都有一个权重值。比较必须基于重量值。根据比较结果和等效程度,我必须决定自动合并联系人或请求用户注意。我知道有许多用于重复数据删除的模糊逻辑算法。

在http://www.melissadata.com/中了解基于 N-gram 或 Q-gram 的算法。这种算法对大量数据是否可行?如果没有,任何人都可以用一些算法指导我或告诉我从哪里开始?

我想要实现的一个例子,

Gonzales = Gonzalez (two different spelling of different name)
Smith = Smyth (Phonetic sound the same)
123 Main st = 123 Main street (abbrevation)
Bob Smith = Robert Smith (synonym)
4

3 回答 3

6

这整个研究领域通常被称为记录链接(具有讽刺意味的是,它有大约十几个重复名称)。有很多工具可以让您为特定数据配置匹配、搅动数据并为您输出重复项。如果您回答有关潜在匹配正确性的一些问题,某些工具甚至会为您创建匹配。

Q/N-gram 比较(和索引)是解决这个问题的一种可能方法,但还有很多其他方法。您会很快发现不同类型的比较器适用于不同类型的数据。我自己没有尝试过 Q-gram 索引,但该领域的研究人员向我描述它相对较慢。

至于与语音键功能(如 Soundex 或 Metaphone 或其他)的比较,这仅适用于具有小文本字段的情况,如名字、姓氏、中间名等的单独字段。即使这样,这些功能也往往相当粗糙。并提防 Soundex。它不仅非常粗糙,将非常不同的名称变成了相同的键,而且还遗漏了许多应该被相同对待的相似名称。变音器要好得多。

用于记录链接的维基百科页面曾经有一个工具列表,但编辑删除了它。我写了一个名为Duke的开源工具来解决这种事情。它有一个遗传算法可以帮助您创建配置,或者您可以手动编写一个。其他工具也存在。

我建议您使用已经存在的工具之一,而不是尝试从头开始解决这个问题。

于 2014-03-14T20:20:39.887 回答
2

我相信重复名称的最佳选择是通过语音编码器。语音编码器将能够对同名的替代拼写进行去重,以下是一些常用名称的示例:

组:凯瑟琳名称:[凯瑟琳,凯瑟琳,凯瑟琳,凯瑟琳,凯瑟琳,凯瑟琳,凯瑟琳,凯瑟琳,凯瑟琳,凯瑟琳,凯瑟琳,凯瑟琳,凯瑟琳,凯瑟琳,凯瑟琳]
组:Assaf 名称:[Assaf,Asaf]
组:梅根 姓名:[梅根,梅根,梅根,梅根]
组:艾莉森名称:[艾莉森,艾莉森,艾莉森,艾莉森,艾莉森]
==================================================== =============
语音编码器:Caverphone2
---- 姓名组:凯瑟琳 ----
编码名称:{KTRN111111=16}
---- 名称组:Assaf ----
编码名称:{ASF1111111=3}
---- 姓名组:梅根 ----
编码名称:{MKN1111111=5}
---- 姓名组:艾莉森 ----
编码名称:{ALSN111111=6}
==================================================== =============
语音编码器:DoubleMetaphone
---- 姓名组:凯瑟琳 ----
编码名称:{K0RN=16}
---- 名称组:Assaf ----
编码名称:{ASF=3}
---- 姓名组:梅根 ----
编码名称:{MKN=5}
---- 姓名组:艾莉森 ----
编码名称:{ALSN=6}
==================================================== =============
语音编码器:Nysiis
---- 姓名组:凯瑟琳 ----
编码名称:{CATRYN=7, CATARA=6, CATARY=5}
---- 名称组:Assaf ----
编码名称:{ASAF=3}
---- 姓名组:梅根 ----
编码名称:{MAGAN=5}
---- 姓名组:艾莉森 ----
编码名称:{ALASAN=3, ALYSAN=3, ALASYN=2}
==================================================== =============
语音编码器:Soundex
---- 姓名组:凯瑟琳 ----
编码名称:{K365=8, C365=9}
---- 名称组:Assaf ----
编码名称:{A210=3}
---- 姓名组:梅根 ----
编码名称:{M250=5}
---- 姓名组:艾莉森 ----
编码名称:{A425=6}
==================================================== =============
语音编码器:RefinedSoundex
---- 姓名组:凯瑟琳 ----
编码名称:{C30609080=5, K3060908=5, K30609080=4, C3060908=5}
---- 名称组:Assaf ----
编码名称:{A0302=3}
---- 姓名组:梅根 ----
编码名称:{M80408=5}
---- 姓名组:艾莉森 ----
编码名称:{A070308=6}
==================================================== =============

在示例中,您可以看到对于CaverphoneDoubleMetaphone ,所有名称都被编码为相同的字符串。您应该看到什么对您的数据有意义,要使用的编码器取决于名称的语言和词源(即英文名称、德语名称......)

于 2013-10-04T12:48:08.183 回答
1

使用 simhash 算法找到了部分解决方案。在这里找到了一个很好的例子http://simhash.codeplex.com/

于 2013-10-08T10:43:08.197 回答