【问题标题】:Calculating context-sensitive text correlation计算上下文相关的文本相关性
【发布时间】:2009-12-03 14:53:11
【问题描述】:

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

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

您将如何解决这个问题?是否有必要拥有某种基于上下文的字典,在地址情况下知道“W”、“W”。和“西”是一样的吗?拼写错误(“mover”而不是“mower”等)呢?

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

【问题讨论】:

    标签: algorithm string text nlp


    【解决方案1】:

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

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

    • 对输入进行标记,即将输入视为单词数组而不是字符串
    • 标记化还应保留行号信息
    • 使用常见替换的简短字典对输入进行规范化(例如,行尾的“dr”=“drive”、“Jack”=“John”、“Bill”=“William”.. .,行首的“W.”是“West”等。
    • 识别(有点像标记,如 POS 标记)某些实体的性质(例如邮政编码、扩展邮政编码以及城市
    • 识别(查找)其中一些实体(例如,相对较短的数据库表可以包括目标区域中的所有城市/城镇
    • 识别(查找)一些与域相关的实体(如果所有/许多地址都与法律专业人士有关,那么查找律师事务所名称或联邦建筑物可能会有所帮助。
    • 一般来说,对来自地址最后一行的令牌赋予更多的权重
    • 对具有特定实体类型的标记(例如:“Drive”、“Street”、“Court”)赋予更多(或更少)权重,其权重应远低于它们之前的标记。
    • 考虑修改SOUNDEX 算法以帮助规范化

    考虑到上述情况,实施基于规则的评估器。试探性地,这些规则可以实现为访问最初解析输入的树/数组结构的访问者 (Visitor design pattern)。
    基于规则的框架的优点是,每个启发式都有自己的功能,并且可以对规则进行优先级排序,即在链的早期放置一些规则,允许提前中止评估,并具有一些强大的启发式(例如:不同的城市 = > 相关性 = 0,置信度 = 95% 等...)。

    搜索相关性的一个重要考虑因素是需要先验将每一项(此处为地址)与其他每一项进行比较,因此需要多达@987654326 @ 项目级比较。正因为如此,以预处理(解析、规范化...)的方式存储参考项目并且可能有一个 digest/key of sort 可能很有用用作可能相关性的 [非常粗略] 指示符(例如,由 5 位邮政编码组成的密钥,后跟“主要”名称的 SOUNDEX 值)。

    【讨论】:

      【解决方案2】:

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

      如果您满足以下条件,那么它会有所帮助:

      1. 物体与物体之间的距离 本身为零。 (反身)
      2. a 到 b 的距离在 双向(传递)
      3. a 到 c 的距离不多 比从 a 到 b 的距离加 a到c的距离。 (三角形 规则)

      如果您的指标遵循这些,您可以在指标空间中排列您的对象,这意味着您可以运行如下查询:

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

      有一本关于它的好书here。设置好用于托管对象和运行查询的基础架构后,您可以简单地插入不同的比较算法,比较它们的性能,然后调整它们。

      我在大学时对地理数据进行了此操作,尝试调整比较算法非常有趣。

      我相信您可以想出更高级的方法,但您可以从简单的方法开始,例如将地址行减少为数字和每个单词的首字母,然后使用最长公共子序列算法比较结果.

      希望在某种程度上有所帮助。

      【讨论】:

        【解决方案3】:

        您可以使用Levenshtein edit distance 查找仅相差几个字符的字符串。 BK Trees 可以帮助加快匹配过程。

        【讨论】:

          【解决方案4】:

          免责声明:我不知道有任何算法可以做到这一点,但如果它存在的话,我真的很想知道。这个答案是尝试解决问题的天真尝试,没有任何先前的知识。欢迎评论,请不要笑得太夸。

          如果您尝试手动操作,我建议您对字符串应用某种“规范化”:小写它们,删除标点符号,也许用完整的单词替换常用缩写(Dr. => drive, St => street等...)。

          然后,您可以尝试比较您比较的两个字符串之间的不同对齐方式,并通过平均对应字母之间的绝对差异(例如 a = 1、b = 2 等和corr(a, b) = |a - b| = 1)来计算相关性:

          west lawnmover drive
             w lawnmower street
          

          因此,即使某些字母不同,相关性也会很高。然后,只需保留您找到的最大相关性,如果相关性高于给定阈值,则确定它们相同。

          【讨论】:

            【解决方案5】:

            在 90 年代初,当我不得不修改一个专有程序时,我需要在多个模块中编写数千行代码,这是多年经验的积累。现代机器学习技术应该会让这件事变得更容易,也许你不需要表现得那么好(这是我雇主的生计)。

            因此,如果您在谈论合并实际邮寄地址的列表,如果可以的话,我会通过外包来完成。

            USPS 进行了一些测试来衡量地址标准化计划的质量。我不记得它是如何工作的,但你可以检查他们是否仍然这样做——也许你可以获得一些好的训练数据。

            【讨论】:

              猜你喜欢
              • 2020-01-25
              • 2011-03-24
              • 1970-01-01
              • 2016-10-03
              • 2011-07-31
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-06-12
              相关资源
              最近更新 更多