6

我在两个单独的表中有一个地址列表,这些表稍微偏离了我需要能够匹配的位置。例如,可以通过多种方式输入相同的地址:

  • 110 测试街
  • 110 测试街
  • 110测试街

虽然很简单,但你可以想象更复杂的场景中的情况。我正在尝试开发一种简单的算法,该算法能够将上述地址作为密钥进行匹配。

例如。关键可能是“11TEST” - 110 的前两个,Test 的前两个和街头变体的前两个。完整匹配键还包括邮政编码的前 5 个,因此在上面的示例中,完整键可能看起来像“11TEST44680”。

我正在寻找一种有效算法或资源的想法,我可以在开发它时考虑考虑。任何想法都可以是伪代码或您选择的语言。

我们只关心美国地址。事实上,我们只查看来自俄亥俄州和密歇根州的 250 个邮政编码的地址。我们也无法使用任何邮政软件,尽管我们愿意接受具有成本效益的解决方案的想法(它基本上是一次性使用)。请注意,这是来自政府来源的数据的初始转储,因此在我构建应用程序时,有关用户如何清理它的建议很有帮助,但我希望通过能够匹配地址来获得最好的初始数据尽可能最好。

4

7 回答 7

6

正如我们所说,我正在研究一个类似的算法,它应该在我完成时处理加拿大、美国、墨西哥和英国的地址。我面临的问题是它们以 3 字段明文格式在我们的数据库中 [恕我直言,认为是个好主意的人应该被枪杀],因此尝试处理农村路线、一般交付、大容量接收器、多个国家,省与州与县,邮政编码与邮政编码,拼写错误绝非易事。

仅拼写错误就不是一件小事 - 特别是当您到达使用法语名称的国家时 - 匹配 Saint、Sainte、St、Ste、Saints、Saintes、Sts、Stes、Grand、Grande、Grands、Grandes 有或没有句点或连字符名称的较大部分导致性能问题永无止境 - 特别是当 St 可能表示圣人街道并且可能或可能未在正确的上下文中输入时(即女性与男性)。如果地址大部分输入正确但省份或邮政编码不正确怎么办?

开始搜索的一个地方是Levenstein 距离算法,我发现它对于消除大部分拼写错误非常有用。之后,主要是搜索关键字并与邮政数据库进行比较。

我真的很想与目前正在开发工具的任何人合作,也许我们可以互相帮助达成一个共同的解决方案。我已经是其中的一部分,并且已经克服了到目前为止我提到的所有问题,让其他人解决同样的问题将非常有助于激发想法。

干杯 - [本在 afsinc dot ca]

于 2009-05-05T13:52:57.707 回答
2

如果您不想开发一个,而是使用使用此处提到的许多技术的现成产品,请参阅:http ://www.melissadata.com/dqt/matchup-api.htm

免责声明:我在公司的发展和工作中发挥了作用。

于 2009-05-05T15:47:27.290 回答
1

在英国,我们会使用:

  • 房屋名称或编号(其中名称包括公寓楼的单位编号)
  • 邮政编码

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

您的示例不会区分 11 Test Street、110 - 119 Test Street 等。

如果您的公司可以访问地址查找系统,我将通过该系统运行所有数据,以便以一致的格式获取数据,可能带有可用于匹配的地址键。

于 2009-05-05T12:22:04.460 回答
1

如果我要对此进行破解,我会使用预定义的操作顺序将每个地址字符串转换为树。

例如。110 测试街 Apt 3. 任何地方 加利福尼亚州 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,...
       /   |   \
    

    姓名号码 | | 测试 110 3

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

  1. 获取地址类型:农村路线
  2. 鉴于这是一个农村路由地址,获取路由号

       eRuralRoute 
          |
          3
    

您需要对国家/地区和邮政编码信息执行类似的操作。

然后比较生成的树。

这使得比较非常简单,但是生成树的代码非常棘手。你会想在成千上万的地址上测试它的废话。如果您只关心美国地址,您的问题会更简单;已经提到的英国地址完全不同,加拿大地址中可能包含法语(例如 Place D'Arms、Rue Laurent 等......)

于 2009-05-05T13:45:08.457 回答
1

如果贵公司编写自己的地址规范化工具具有成本效益,那么我建议从USPS 地址标准开始。或者,有许多供应商提供服务器端工具和 Web 服务来规范、更正和验证地址。

我的公司为此目的使用AccuMail Gold,因为它不仅仅是标准化和更正地址。当我们考虑到即使是一周工资的成本来开发内部工具时,购买现成产品的选择也是显而易见的。

于 2010-05-21T14:55:50.497 回答
0

如果您不选择使用现有系统,一个想法是执行以下操作:

  • 从地址行中提取数字
  • 用空格替换常见的街头单词
  • 创建匹配字符串

即:“运河街 555 号”:

  • 提取编号给出“555”+“运河街”
  • 替换街道词给出“555”+“运河”
  • 创建匹配字符串给出“555Canal”

“Canal st 555”会给出相同的匹配字符串。

街头词语是指您的语言中“street”的词语和缩写,例如“st”、“st.”、“blv”、“ave”、“avenue”等,所有这些都从字符串中删除。

通过提取数字并将它们从字符串中分离出来,它们是第一个还是最后一个都没有关系。

于 2009-05-05T12:29:35.347 回答
0

对主键使用标识,这将始终是唯一的,并且以后合并重复项会更容易。

强制使用用户界面输入正确的数据。让他们在自己的文本框中输入每个组件。在自己的框中输入门牌号,在自己的框中输入街道名称,在自己的框中输入城市,从选择列表中输入州等。这将使查找匹配项更容易

有两个过程“保存”

  • 初始保存后,进行搜索以查找匹配项,向它们提供可能匹配项的列表以及新的匹配项。
  • 在他们选择新的保存后,如果他们选择现有的,则使用该 ID

清理数据。尝试去掉“street”、“st”、“drive”等,并将其存储为 StreetType char(1),该字符使用 FK 到包含正确缩写的表中,以便您可以构建街道。

研究 SOUNDEX 和 DIFFERENCE

我曾在维护邮件列表的大公司工作过,他们并没有尝试自动完成,他们使用人员从重复中过滤掉新的,因为这很难做到。计划合并功能,以便您可以在重复出现时手动合并它们,并通过 PK 波动值。

您可能会查看 google maps api,看看您是否可以传入您的地址并获得匹配项。我不熟悉,这只是猜测。

于 2009-05-05T13:56:11.723 回答