查看地址是否已写在句子中的算法

Algorithm to see if an address has been written in a sentence

我想做一个算法来判断一个地址是否写在一个句子中。

例如,如果用户写:

"Hi, my address is Lincolnstreet 27, Foobarcity. Can you pick up the package there?"

而用户的地址是Lincolnstreet 27, Foobarcity,那么我想要一个可以检测到句子中提到了地址的算法。

我已经知道用户的街道名称和号码、邮政编码和城市名称。

它也需要模糊,因为人们可能会打错字或对他们在句子中写的地址进行细微的改动。但是,并不要求算法总是捕获所有出现的事件,无论它们输入有多么错误,因为这显然是不可能的。半天真的解决方案没关系。

我研究了 Levehnstein 距离,但我不知道如何让它适用于这种确切的情况。我也研究了最长公共子序列,那里也是同样的问题。

有什么想法吗?我不一定关心编程语言。

我对神经网络解决方案不感兴趣 - 我真的相信它应该可以用相对简单的算法解决 - 我只是不知道从哪里开始。

把句子当成更大的字符串,你基本上想看的是:

  • 存在街道名称
  • 存在城市名称
  • 存在街道号码

如果您愿意,可以检查顺序,但您希望它是模糊的,所以我们暂时忽略它。检查重叠可能是谨慎的做法,您可以通过查看子字符串的开头和结尾并进行比较来做到这一点。

您选择的语言几乎肯定具有某种 .contains() 函数,并且它可能具有模糊模式。

在这种情况下,

if (sentence.roughly_contains(streetname) and sentence.roughly_contains(cityname) and sentence.contains(streetnumber)) {
    return true;
}

如果找不到模糊匹配函数,写一个! Fuzzy Text Matching C# provides us with https://blogs.msdn.microsoft.com/toub/2006/05/05/generic-levenshtein-edit-distance-with-c/ 这为我们提供了一个很好的模糊搜索通用实现,您可以使用它来制作 .roughly_contains() 函数。

明智的顺序;检查大致遵循以下模式:

//where all string.[start|end] are integers, locations can be found trivially or with the help of google once you know their presence
overlap(string1, string2) {
    if (string1.start > string2.end || string1.end < string2.start) {
        return false;
    }
    else {
        return true
    }
}

(这是假设您知道独立于句子的地址)

我想知道你能不能把它分解成每个句子。将其输入 Google 之类的搜索引擎,看看它会返回什么样的链接,包括建议的更正/它实际显示的结果是什么搜索词。互联网使用量有点大,但我认为它可以工作。

这比您想要的稍微复杂一些,但那里的答案肯定可以帮助您: How to parse freeform street/postal address out of text, and into components

解决这个问题的一个非常天真的方法,至少是部分解决,是将句子和地址都拆分成单词,然后,对于地址上的每个单词,检查它是字符串中的哪些单词最相似。然后平均分数,并检查平均值是否高于阈值。当然,这不考虑位置,也不考虑语义。