7

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

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

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

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

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

4

3 回答 3

4

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

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

北 -> N.
East -> E.
...
第一 -> 1st
Second -> 2nd
Third -> 3rd
...
Street -> St.
Avenue -> Ave.

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

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

于 2010-05-20T16:54:40.947 回答
0

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

于 2010-05-20T16:27:14.427 回答
0

有关相关讨论,请参阅这些 问题

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

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

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

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


You could also feed the addresses to some geo location service such as Google Maps, store resulting longitude and latitude to your database. When a new address is entered, you just get its longitude/latitude and compare against existing locations in your database. See this question for details.

于 2010-05-20T18:17:58.377 回答