【问题标题】:algorithm for checking addresses for matches?检查地址匹配的算法?
【发布时间】:2011-02-21 23:27:30
【问题描述】:

我正在开展一项调查计划,在该计划中,人们将在首次填写调查表时获得促销考虑。在很多情况下,我们可以阻止人们欺骗系统并获得他们不应得到的晋升的唯一方法是相互检查街道地址字符串。

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

但是,如果有人想玩弄这个系统,他们可以很容易地写成“S 5th St”而不是“South Fifth Street”,levenshtein 会认为这些字符串是非常不同的。所以我想将所有字符串转换为“标准地址形式”,即“South”变成“s”,“Fifth”变成“5th”,等等。

然后我认为这是没有希望的,并且需要付出太多努力才能使其正常运行。是吗?

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

【问题讨论】:

  • 如果不是“S. 5th St.”怎么办?有人进入“S. 4th St.”?这不能用来玩弄系统(假设您正在邮寄促销材料),但它可能会取消人们居住在一个街区之外的资格。只是一个需要测试的边缘案例。
  • @Bill 这种情况不是问题,因为那样他们就不会收到促销考虑。除非他们与居住在第四街那个房子地址的人勾结,但他们可以共谋的家庭只有这么多。我认为这是自我限制的:)
  • @user15841:不,我的意思是如果这两个人合法地独立注册会怎样?您的算法需要足够聪明,才能看到这两个地址之间的差异,但也必须足够聪明,才能将您提供的原始示例视为相同。
  • 你的意思是,如果有人不小心给出了别人的地址?是的,这是个问题,但我看不出系统如何在不对更多游戏开放的情况下解决这个问题(“你确定你指的是第四街吗?我们已经为那个地址准备了一个。想再试一次吗?”)
  • 不,我的意思是,如果两个住在非常相似但地址不同的人都注册了,其中一个人可能不会中奖。

标签: algorithm street-address user-data


【解决方案1】:

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

您可以通过同义词规范器运行地址来减少(但可能无法消除)很多潜在的作弊行为。在检查是否相等之前,只需转换

北 -> N.
东 -> E.
...
第一 -> 第一
第二 -> 第二
第三 -> 第三
...
街道 -> 圣
大道 -> 大道。

你想出的同义词列表越长,它就越能更好地匹配。处理速度会慢一些,但地址很小。

这类似于在比较字符串之前将它们全部转换为小写(或大写)。 (当然,我也推荐。)

【讨论】:

  • 哦,我终于明白你在说什么了!我没有使用过levenshtein,所以我对它还不够熟悉,无法预见这种情况会如何发生:)
  • 此外,必须注意的是,多个居民可能住在同一栋建筑中......这就是它变得棘手的地方,即使在标准化之后也是如此。例如“511 N 15th St, Unit 123”与“511 NORTH 15th St, Apt 124”
  • 您也应该考虑在同义词上使用字符串距离比较。否则“South”将变为“S”,但“Soith”(错字)不会,“Soith”->“S”不相似。另外,请注意,有数千个 unicode 字符会产生看起来像 a-z 字符但不是的字符。此外,“街道”->“圣”。可能导致“圣”缩写“圣”的误报。
  • 此外,它显着有助于提取数字部分和文本部分,并且对相似数字的权重高于不同的文本标记。 (在这种情况下,我会考虑在 Levenshtein 距离上使用 Jaro Winkler 编辑距离来比较文本标记,因为“Ave”-“Avenue”在合理的阈值内,而对于 lev 距离则不是。)
【解决方案2】:

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

【讨论】:

  • 不起作用,因为这些地理空间 API 中的大多数都没有考虑公寓编号(例如,12 楼 6 楼)。
  • 是的,这样的标准化不会 100% 准确,您还需要进行额外的检查。
【解决方案3】:

相关讨论请见thesequestions

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

    大道 -> 大道 道路-> rd 路。 -> 研发

    第一个 -> 1 第一个 -> 1

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


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-03-03
    • 2020-02-10
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 2011-03-28
    相关资源
    最近更新 更多