|
|
1
3
我会尝试用 Double Metaphone 算法,这是一个更复杂的Soundex类型的算法。 这里是一个 MySQL implementation . |
|
|
2
2
有些公司通过销售数据清洗产品来维持良好的生活,这些产品进行了这种模糊匹配。所以你不可能用一个简单的(甚至是一个非常复杂的)来解决这个问题。
你需要的是能够比较两个字符串并返回相似性分数的东西,100%的分数意味着相同。有点像
Jaro-Winkler algorithm
. 替代算法包括
Metaphone
(或双隐喻)和
另一种解决方案是使用专家文本索引。这种方法最酷的一点是,我们可以指定一个同义词库来指定同义词,消除不相关的差异(inc=incorporated,co=company等)。 Oracle和SQL Server都包含这样一个工具,但我不熟悉MySQL。 |
|
|
3
1
SOUNDEX() 会在一定程度上帮助你。但这远非完美。 即使字符串1和字符串2的拼写不同,Soundex(String1)也应等于Soundex(String2)。但正如我所说,这远非完美。 据我所知,目前还没有一种算法能很好地做到这一点。 |
|
|
4
0
嗯,没有100%保证正确的方法,没有。但是你可以通过将所有“杂乱”的列转换为更多的列来取得一些进展。 标准形 例如,通过将所有内容都大写,修剪前导空格和尾随空格,并确保一行中最多出现1个空格。还有一些事情,比如把“史密斯,约翰”的名字改成“约翰史密斯”(反之亦然——只需选择一个表格,然后跟着它走)。当然你应该 副本 在记录中,不要更改原件。您可以尝试丢弃进一步的信息(例如,“John Smith”->“J Smith”)——您会发现这会将误报的平衡改变为误报。 我可能会采用为每对记录分配相似性得分的方法。例如,如果规范化的名称、地址和电子邮件地址完全一致,则分配1000分;否则,减去(某些倍数) Levenshtein distance 从1000开始使用。你需要想出你自己的计分方案,在不同类型的差异之间游玩并决定其相对重要性(例如,电话号码中的不同数字可能比两个人名字中的1个字符的差异更重要)。然后,通过实验,您将能够建立一个分数,在该分数之上,您可以自信地将“重复”状态分配给一对记录,在该分数之上,需要手动检查;在下面 那个 得分,我们可以自信地说这两个记录是 不 复制品。 这里的现实目标是 减少 手动删除副本所需的工作量。 除非所有的复制都是通过自动复制过程生成的,否则您不可能完全消除它。 |