计算上下文相关的文本关联

时间:2009-12-03 14:53:12

标签: algorithm string text nlp

假设我想将地址记录(或人名或其他)相互匹配,以合并最有可能引用相同地址的记录。基本上,我想我想计算文本值之间的某种相关性,如果该值超过某个阈值,则合并记录。

实施例: “West Lawnmower Drive 54 A”可能与“W. Lawn Mower Dr. 54A”相同,但与“East Lawnmower Drive 54 A”不同。

你会如何解决这个问题?是否有必要使用某种基于上下文的字典,在地址的情况下,知道“W”,“W”。和“西”是一样的吗?拼写错误(“移动者”而不是“割草机”等)?

我认为这是一个棘手的问题 - 也许有一些众所周知的算法?

5 个答案:

答案 0 :(得分:9)

一个好的基线,就其相对较高的计算成本而言可能是一个不切实际的基础,更重要的是它产生许多误报,将是通用的字符串距离算法,如

取决于所需的准确度(BTW,应根据其recall and precision指定,即通常表示错过相关性比错误识别相关性更重要),基于[某些]以下启发式和想法的本土流程可以解决这个问题

  • 对输入进行标记化,即将输入视为单词数组而不是字符串
  • 标记化还应保留行号信息
  • 使用常见替代品的短词典(例如,行末尾的“dr”=“驱动器”,“杰克”=“约翰”,“比尔”=“威廉”来规范化输入。 。,“W”在一条线的开头是“西”等。
  • 识别(有点像标记,如在POS标记中)某些实体的性质(例如邮政编码,扩展邮政编码,以及城市
  • 识别(查找)其中一些实体(例如,相对较短的数据库表可以包含目标区域中的所有城市/城镇
  • 识别(查找)一些与域相关的实体(如果所有/许多地址涉及法律专业人士,查找律师事务所名称或联邦建筑物可能会有所帮助。
  • 一般来说,更重视来自地址最后一行的令牌
  • 将更多(或更少)权重放在具有特定实体类型的代币上(例如:“Drive”,“Street”,“Court”应该比它们之前的代币少得多。
  • 考虑使用修改后的SOUNDEX算法来帮助规范化

考虑到上述情况,请实施 基于规则的评估程序 。暂时,规则可以作为树/类数组结构的访问者实现,其中输入最初被解析(Visitor design pattern)。 基于规则的框架的优点在于,每个启发式算法都有自己的功能,规则可以优先排序,即在链的早期放置一些规则,允许提前中止评估,具有一些强大的启发式(例如:不同的城市= >相关= 0,置信水平= 95%等......)。

搜索相关性的一个重要考虑因素是 先验需要将每个项目(此处为地址)与其他项目进行比较,因此需要尽可能多的{{ 1}}项目级别比较。因此,以预处理(解析,规范化...)的方式存储参考项目以及可能具有摘要/密钥的方式可能很有用。用作可能相关性的[非常粗略]指示符(例如,由5位ZIP-Code组成的密钥,后跟“主要”名称的SOUNDEX值)。

答案 1 :(得分:1)

我会考虑生成一个相似性比较度量,给定两个对象(可能是字符串),返回它们之间的“距离”。

如果您符合以下条件,则有助于:

  1. 物体与物体之间的距离 本身就是零。 (反身)
  2. 从a到b的距离是相同的 两个方向(及物)
  3. 从a到c的距离不多 比从a到b加上的距离 距离a到c的距离。 (三角形 规则)
  4. 如果您的指标服从这些指标,您可以在指标空间中排列对象,这意味着您可以运行以下查询:

    • 最喜欢哪个对象 这个
    • 给我5个物件 最喜欢这个。

    有一本关于它的好书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进行了一些测试来衡量地址标准化程序的质量。我不记得有什么用,但你可能会检查他们是否仍然这样做 - 也许你可以得到一些很好的训练数据。