我之前做过类似的系统来匹配地点信息和人员信息。这些是具有许多特征的复杂对象,并计算出两个不同的对象是描述同一个地方还是人是棘手的。做到这一点的方法是将其分解为基本要素。

这里有几件事情,你可以做:

0)如果这是一个oneoff,将数据加载到openrefine和交互解决的事情。最大限度地解决了您的问题,最低限度会显示您可能匹配的位置。

1)有几种方法可以比较字符串。基本上它们在产生负面和错误匹配方面的可靠程度不同。否定匹配是匹配时不匹配。积极的匹配是它应该匹配的时候。字符串等于不会产生负面的比赛,但会由于轻微的变化而错过很多潜在的比赛。带有小因素的莱文斯坦稍微好一些。 Ngrams产生很多匹配,但其中许多将是错误的。还有几个算法,看看例如openrefine代码来查找比较和聚类字符串的各种方法。 Lucene在它的分析器框架中实现了很多这些东西,但如果你对它的设计不是很熟悉的话,它有点像野兽一样。

2)将决定你是否匹配的过程分开。我过去所做的就是使用一个简单的数字分数来限定我的比较。该字段完全匹配(100),但该字段是部分匹配(75),该字段完全不匹配。合格的比较结果向量,例如(100,75,0,25)可以与定义完美或部分匹配标准的参考矢量进行比较。例如,如果名字,姓氏和街道匹配,那么无论其余字段如何,这两个记录都是相同的。或者如果电话号码和姓氏匹配,那也是有效的匹配。您可以将这种完美匹配作为矢量进行编码,然后将其与比较矢量进行比较,以确定它是匹配,不匹配还是部分匹配。这是一种机器学习的手动版本,它将提取特征向量,然后建立一个概率模型,其中向量表示参考数据的向量。手动操作,可以解决简单的问题。

3)根据您知道匹配或不匹配的测试用例组建一个参考数据集,并根据该参考集评估您的算法。这样,当你调整时,你会知道什么时候你正在改善事情或者变得更糟。进入莱文斯坦或其他因素。