我有两个名称和一个地址的“记录”(基本上是 CSV 字符串)。我需要找到彼此相似的记录:基本上名称和地址部分看起来都“相似”,就好像它们是由人类解释的一样。
我使用了这篇出色的博客文章中的想法:http: //knol.google.com/k/simple-simhashing#编写了一个简单的 SimHash。如果两个或多个字符串的 SimHash 结果相同,我会将这个子集的所有记录传递给一个细粒度的匹配程序,该程序是 O(n^2),它将集合中的每条记录与其他每条记录进行比较。
对于 SimHash 部分,我有一些参数,我可以在其中定义数据报大小(基本上是字符串上大小为 n 的滑动窗口)和用于确定 SimHash 计算需要使用多少(随机)哈希的迭代次数. 到目前为止,数据报大小为 4 并使用 4 个哈希来计算 SimHash。我尝试了各种其他组合,但到目前为止,这个组合产生了最好的结果。
我遇到的问题是这种方法在我拥有的数据集中找到了大约 80% 的重复项。我知道这一点是因为我已经根据上面提到的极其缓慢的 O(n^2) 完全匹配验证了整个数据集。O(n^2) 匹配器适用于小于 10^4 的数据集,但很快变得不可行,因为我需要运行大小为 10^8 的集。
关于如何提高 SimHash 的准确性以便更多“相似”记录被标记为相同的 SimHash 编号的任何想法、建议或想法?
编辑:在 SimHashing 之前,我将所有 ![0-9A-Z] 字符大写并删除。应该匹配的例子(拼写错误是故意的):
- JOHN SMITH, 123 ANY STREET Sometown ZIP
- 约翰尼·史密斯,123 岁
- SOMETOWNE ZIP ROBERT PARKER, 442 ANY STREET SOMETOWN ZIP
这里1和2是相似的,3不是。输出应该是:1 + 2