假设我想将地址记录(或人名或其他)相互匹配,以合并最有可能引用相同地址的记录。基本上,我想我想计算文本值之间的某种相关性,如果该值超过某个阈值,则合并记录。
实施例: “West Lawnmower Drive 54 A”可能与“W. Lawn Mower Dr. 54A”相同,但与“East Lawnmower Drive 54 A”不同。
你会如何解决这个问题?是否有必要使用某种基于上下文的字典,在地址的情况下,知道“W”,“W”。和“西”是一样的吗?拼写错误(“移动者”而不是“割草机”等)?
我认为这是一个棘手的问题 - 也许有一些众所周知的算法?
答案 0 :(得分:9)
一个好的基线,就其相对较高的计算成本而言可能是一个不切实际的基础,更重要的是它产生许多误报,将是通用的字符串距离算法,如
取决于所需的准确度(BTW,应根据其recall and precision指定,即通常表示错过相关性比错误识别相关性更重要),基于[某些]以下启发式和想法的本土流程可以解决这个问题:
考虑到上述情况,请实施 基于规则的评估程序 。暂时,规则可以作为树/类数组结构的访问者实现,其中输入最初被解析(Visitor design pattern)。 基于规则的框架的优点在于,每个启发式算法都有自己的功能,规则可以优先排序,即在链的早期放置一些规则,允许提前中止评估,具有一些强大的启发式(例如:不同的城市= >相关= 0,置信水平= 95%等......)。
搜索相关性的一个重要考虑因素是 先验需要将每个项目(此处为地址)与其他项目进行比较,因此需要尽可能多的{{ 1}}项目级别比较。因此,以预处理(解析,规范化...)的方式存储参考项目以及可能具有摘要/密钥的方式可能很有用。用作可能相关性的[非常粗略]指示符(例如,由5位ZIP-Code组成的密钥,后跟“主要”名称的SOUNDEX值)。
答案 1 :(得分:1)
我会考虑生成一个相似性比较度量,给定两个对象(可能是字符串),返回它们之间的“距离”。
如果您符合以下条件,则有助于:
如果您的指标服从这些指标,您可以在指标空间中排列对象,这意味着您可以运行以下查询:
有一本关于它的好书here。一旦您设置了托管对象和运行查询的基础架构,您只需插入不同的比较算法,比较它们的性能然后进行调整。
我在大学时为地理数据做了这个,尝试调整比较算法非常有趣。
我确信你可以提出更先进的东西,但你可以从简单的事情开始,比如将地址线减少到数字和每个单词的第一个字母,然后使用最长的公共子序列算法比较结果
希望在某种程度上有所帮助。
答案 2 :(得分:1)
您可以使用Levenshtein edit distance查找仅相差几个字符的字符串。 BK Trees可以帮助加快匹配过程。
答案 3 :(得分:0)
免责声明: 我不知道任何算法可以做到这一点,但如果它存在,我真的很想知道它。这个答案是尝试解决问题的天真尝试,没有任何先前的知识。欢迎评论,请不要笑得太赞。
如果您尝试手动操作,我建议对您的字符串应用某种“规范化”:小写它们,删除标点符号,或者用完整的单词替换常用缩写(Dr. => drive,St => ;街道等......)。
然后,您可以尝试在比较的两个字符串之间进行不同的对齐,并通过平均相应字母之间的绝对差异来计算相关性(例如a = 1,b = 2,等等......和corr(a, b) = |a - b| = 1
):
west lawnmover drive
w lawnmower street
因此,即使一些字母不同,相关性也会很高。然后,只需保持您找到的最大相关性,并在相关性高于给定阈值时确定它们是相同的。
答案 4 :(得分:0)
当我不得不修改专有程序时,早在90年代早期,在多个模块中花费了数千行代码,这些代码经过多年的经验积累。现代机器学习技术应该让它变得更容易,也许你不需要表现得那么好(这是我雇主的面包和黄油)。
因此,如果您正在谈论合并实际邮寄地址列表,我会尽可能通过外包来实现。
USPS进行了一些测试来衡量地址标准化程序的质量。我不记得有什么用,但你可能会检查他们是否仍然这样做 - 也许你可以得到一些很好的训练数据。