具有模糊匹配能力的位置提取

时间:2014-07-08 02:14:36

标签: python nltk named-entity-recognition

我有一个出价数据库,其中包含“出价位置”字段,其中包含来自体力劳动者的输入。

我正在使用布宜诺斯艾利斯街道列表作为语料库:

av. de mayo
av. del libertador
av. diaz velez

部分出价位置字段包含以下文字:

of. de compras hosp. c. durand (diaz velez 5044) c.a.b.a
av. de mayo 525, planta baja, oficina 11, ciudad de buenos aires
oficina de compras - av. diaz velez 5044 - cap. fed. -

我正在阅读Python Text Processing with NLTK本书,因为它有一个我实施的“位置提取”部分。这段代码的问题在于,语料库中的某个句子与输入文本的某些片段之间的匹配必须是完美的。

正如您在上面给出的示例中所看到的,“diaz velez”将不会匹配,因为语料库包含“av.diaz velez”。

我考虑过使用模糊匹配,但我不认为这是一个很好的解决方案,因为程序必须比较很多字符串才能得到响应。

我一直在研究,并没有找到这个问题的示例或类似的解决方案,所以我问你是否有一些指示让我遵循,因为我很遗憾这一点。

2 个答案:

答案 0 :(得分:1)

要克服这个"完全匹配"限制,很多很多解决方案是可能的。作为第一步,您可以设计退避策略:只要您在文本中找到完全匹配,一切都很好。对于文本的剩余部分,您可以尝试使用approximate string matching

Personaly,我建议一个简单的方法来开始。对于任何未注释的字符串,请尝试逐步收集线索,以查看这些字符串的部分(实际上是令牌列表)是否与knwon条目相关。

例如:

  1. 找到完全匹配后,将未注释的字符串分解为ngrams列表。
  2. 使用词袋(删除停用词),计算任何ngram到您已知位置列表的余弦距离:阈值将允许选择可能的候选者。
  3. 对于这组有限的候选人,请计算文本的编辑距离以对其进行排名。
  4. 我相信你正在从确定性匹配转向非确定性匹配,这确实有优点和缺点。统计数据将有所帮助。您也可以考虑将您的位置列表转换为语法,这会使一些令牌成为可选(例如" av。")。

答案 1 :(得分:0)

此问题可能是您尝试使用某些经典biological sequence alignment算法(例如Smith-WatermanNeedleman-Wunsch)的新方法。虽然这些算法确实涉及许多不同的字符串比较,你曾经说过你希望避免它们,然而,他们仍然设法通过采用专门的dynamic programming技术来获得良好的速度和效率,以便利用某些内部冗余,经常在这些类型的"模糊匹配"问题。

你的问题与Smith-Waterman和Needleman-Wunsch最初设计要解决的典型生物模糊字符串匹配问题之间的一个区别在于构成允许的字母表的符号数量" 。在生物序列匹配问题中,"字母表"通常由四种DNA或RNA核苷酸(腺嘌呤,胞嘧啶,鸟嘌呤,胸腺嘧啶(DNA)或尿嘧啶(RNA)组成,传统上notated为A,C,G,T或U)或者,取决于问题域名,在20到22之间amino acids。对于你的问题,OTOH,你可能想要使用罗马字母的全部26个字母(如果你决定区分大小写,则为52个)加上一些其他符号,如句号,逗号,撇号,括号,数字0-9等。

另一件需要注意的事情是:生物序列比对算法通常具有半启发式评分系统:例如,您为每个匹配符号分配一定数量的正点,为一个&存在一定数量的负点#34;间隙"在对齐方式中(如果出价位置列表恰好在地名中使用句号或逗号,而语料库中省略了它,则可能会在您的情况下发挥作用),然后您可能会分配一些数量较少的额外负数如果间隙是2或3个字符长而不是只有1个字符,等等。你分配这些点的方式有些随意,你可能需要稍微调整算法的操作,以获得总体结果大多数情况通常对你来说都是明智的。

好消息是,一旦你完成所有这些,算法将返回一个"匹配分数"在出价位置列表中的每一行与位置语料库中的每一行之间,您只需选择最高得分匹配。