检查匹配地址的算法?

时间:2010-05-20 16:23:42

标签: algorithm street-address user-data

我正在制定一项调查计划,让人们在第一次填写调查时会获得促销考虑。在很多情况下,我们阻止人们欺骗系统并获得他们不应该得到的促销的唯一方法是检查彼此之间的街道地址字符串。

我正在考虑使用levenshtein距离给我一个数字来衡量相似度,并将那些低于某个阈值的数字视为重复。

然而,如果有人想要对系统进行游戏,他们可以轻松地写出“S 5th St”而不是“South Fifth Street”,levenshtein会认为这些字符串非常不同。所以我想把所有字符串转换为'标准地址形式',即'South'变成's','Fifth'变成'5th'等等。

然后我认为这是绝望的,而且太过努力让它稳健地运作。是吗?

我正在使用PHP / MySql,所以我有该系统固有的局限性。

3 个答案:

答案 0 :(得分:3)

我认为你的第二个想法比使用Levenshtein距离更好。如果您尝试比较相似性的地址,那么两个住在彼此附近的人可能会意外地“欺骗”他们的奖品。如果我住在“S. 4th St.”但我的邻居在“S. 5th St.”已经注册,这两个地址可能看起来太相似了Lev distance。

您可以通过同义词规范化程序运行地址来减少(但可能不会消除)大量潜在的作弊行为。在检查相等性之前,只需转换

北 - > N.
东 - > E.
...
首先 - > 1
第二 - >第二
第三 - >第三
...
街 - >圣
大道 - >大道

您提出的同义词列表越长,捕捉匹配的效果就越好。处理起来会慢一些,但地址很小。

这类似于在比较字符串之前将字符串转换为所有较低(或较高)的情况。 (当然,我也建议这样做。)

答案 1 :(得分:0)

您可以使用Google Map API(或任何其他地图API)将地址标准化为地理位置(纬度/经度)。

答案 2 :(得分:0)

有关相关讨论,请参阅these questions

  • 尽可能先规范化您的数据:

    avenue - > AVE 道路 - > RD 路。 - > rd

    首先 - > 1 第1 - > 1

您可以查看SOUNDEX或类似内容来捕捉单词听起来相同但拼写不同的情况(例如Schmitt,Schmitd,Smith)。 SOUNDEX适用于单词级别,因此您需要先将地址拆分为单词,然后比较SOUNDEX值。


您还可以将地址提供给某些地理位置服务(例如Google地图),从而将经度和纬度存储到您的数据库中。输入新地址后,您只需获取其经度/纬度,并与数据库中的现有位置进行比较。 See this question了解详情。