我有一个地址列表中的两个单独表稍微偏离,我需要能够匹配。例如,同一个地址可以进入多种方式:

  • 110St测试
  • 110圣测试
  • 110测试街

虽然简单,你可以想象一下这种情况更加复杂scenerios.我试图开发一个简单的算法,这将能够配合上述地址作为一个关键。

例如。关键可能是"11TEST"一两的110,第一两个试验和第一次两的街道变种。完全匹配的关键还将包括第5的邮政编码,以便在上述例子中,全的关键可能看起来像"11TEST44680".

我在寻找的想法的一个有效的算法或资源,我可以看看在考虑开发这一点。任何想法,可以伪代码或在语言的选择。

我们只关注我们地址。事实上,我们仅看地址从250邮政编码从俄亥俄州和密歇根州。我们还没有接到任何邮政的软件,虽然将以开放的思想符合成本效益的解决方案(它将基本上是一个时间使用)。请注意,这是一个初始转储的数据来自政府来源所建议的用户如何可以清理它,是很有帮助,因为我打造出来的应用程序,但我希望能有最好的初始我可能可以通过能够匹配的地址尽可能最佳。

有帮助吗?

解决方案

我工作的一个类似的算法我们发言时,它应该处理地址在加拿大、美国、墨西哥和英国的时候我就完了。这个问题,我们面临的是,他们在我们的数据库中的3段明文格式[不管是谁的思想 是一个很好的想法应该被枪毙恕我直言],所以设法处理农村的路线,一般的运送、大量接收器、多个国家、省与国家对县、邮政编码与邮政编码、拼写错误不小,或者简单的任务。

拼写错误是没有件小事-尤其是当你得到的国家,使用法语名称匹配的圣人,Sainte,St,Ste,圣人,到,Sts,国营贸易企业,盛大,Grande,Grands,Grandes或无期限或连字符的较大部分的名称,因为没有结束性问题--尤其是在St可能意味着圣 街道和可能或不可能已被输入正确的上下文中的(即女性与男性化的).如果有什么地址已经在很大程度上已正确输入但有一个不正确的省或邮政编码?

一个地方,以开始搜索是 莱文史丹距离算法 我已经找到了可真正用于消除大部分的拼写错误。在这之后,它主要是一个情况下的搜索关键字和比较,对一个邮政数据库。

我将会真正感兴趣的合作与任何人,目前正在开发的工具,要做到这一点,也许我们可以相互协助以共同的解决办法。我已经部分的方式有和已经克服了的所有问题我已经提到迄今为止,具有其他人的工作于同一问题将真正有助于反弹的想法.

干杯- [ben在afsinc点ca]

其他提示

如果你愿意tonot发展的一个,而是使用现成产品使用的许多技术在这里提及,见: http://www.melissadata.com/dqt/matchup-api.htm

免责声明:我有一个作用的发展和工作的公司。

在英国,我们将使用:

  • 房子的名称或编号(其名称包括平面数用于公寓大楼)
  • 邮政编码

你当然应该是使用邮政编码,但在美国,我相信你的邮政编码的复盖非常广泛的领域相比邮政编码在英国。你会因此需要使用的街道和城市。

你的例子不区分11测试街110-119试验条街,等等。

如果你的公司已经访问了一个地址查询系统,我将所有的数据通过,得到的数据后一致的格式,可能与地址键,可用于匹配。

如果我要把裂缝在这我把每个地址串到了一棵树,使用一个预先定义顺序的行动。

例如。110测试街Apt3.任何地方加利福尼亚州90210=>

  1. 获得的类型的地址。例如街道地址具有不同的格式,农村地址的路线,这是不同的国家。
  2. 鉴于这是街道地址的,得到串表示的种类型的街转换到一个枚举,(eBoulevard,eRoad,等等。)
  3. 鉴于这是街道地址的,拔出来的街道名称(存储在的情况下)
  4. 鉴于这是街道地址的,拔出来的街道号码
  5. 鉴于这是街道地址,查找任何公寓数目(可能是之前的街头的数量有一个破折号,可能是后"Apt.", 等等...)

       eStreet  //1.an enum of possible address types eg. eStreet, eRuralRoute,...
          |
       eStreet        //2.an enum of street types eg. eStreet, eBlvd, eWay,...
       /   |   \
    

    名字号码Apt ||| 测试110 3

例如。RR#3的任何地方加利福尼亚州90210=>

  1. 获得的类型的地址:农村路线
  2. 鉴于这是一个农村地址的路线,获取路线数量

       eRuralRoute 
          |
          3
    

你会需要做的事情相似的国家的国家和邮政编的信息。

然后比较所得的树木。

这就使得比较非常简单,但是,代码生成树上是非常棘手。你想要测试的废话了它对成千上万的地址。你的问题是简单的如果这只是我们的地址你关心;英国的地址如已经提到的是相当不同的是,和加拿大的地址可以具有法国在它们(例如。Place D'Arms,Rue Laurent,etc...)

如果这是成本-效益于你的公司写其自己地址的正常化的工具,那么我建议你开始的 美国邮政地址的标准.此外,任何数量的供应商提供的服务器方的工具和网络服务的正常化,纠正并核实地址。

我的公司使用 AccuMail金 为此目的,因为它没有很多不仅仅是规范&正确的地址。当我们考虑的成本甚至一个周的薪水开发一个工具在内的选择购买的现成产品是显而易见的。

如果你们不选择使用现有系统,一个想法是要做到如下:

  • 提取号码从该地址线
  • 替代常见的街头的话有空白
  • 建立匹配的字符串

即:"555运河街":

  • 提取数量让"555"+"运河街"
  • 替换街话给"555"+"运河"
  • 创建匹配串给"555Canal"

"运河圣555"会得到同样的比赛串。

通过街道的话我的意思是词和缩写为"街头"在你的语言,例如"st","圣.", "blv","ave","大道",等等等等都是从串。

通过提取数字和分离它们从串不要紧,如果他们是第一个或最后一次。

使用标识的主要关键, 这将永远是独特的,并将使它更容易合并重复以后。

力正确的数据输入的用户界面。让他们进入每个组件在其自己的文字框中。房子号被输入自己的盒子,街道名称在其自己的盒子,城市在自己的盒子,国家从选择清单,等等。这将使寻找相匹配的更容易

有两个进程"节省"

  • 经过最初的保存、搜索,查找相匹配,他们可能匹配,以及新的一个。
  • 之后他们选择的新的一节,如果他们选择一个现有的使用ID

干净的数据。试图带出来的"街头","st","驱动器"等和储存它作为一个StreetType char(1)使用FK到一个表包含适当的缩写,这样你就可以建立街道。

看看SOUNDEX和差

我曾在大公司,保持mailinig名单,他们并没有试图做到这一自动的,它们使用人的筛选出新的从dup,因为它是那么难做到的。计划一个合并的特征,所以你可以手动合并重复发生时,和波动的价值通过PKs。

你可能看到的谷歌地图api看,如果你可以穿在你的地址,并得到一个比赛回来的。我不熟悉,这仅仅是猜测。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top