代码之家  ›  专栏  ›  技术社区  ›  sestocker

地址匹配密钥算法

  •  6
  • sestocker  · 技术社区  · 15 年前

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

    • 110试验ST
    • 110测试圣
    • 110试验街

    虽然很简单,但你可以在更复杂的场景中想象情况。我试图开发一个简单的算法,将能够匹配上述地址作为一个关键。

    例如。关键可能是“11test”——110的前两个,test的前两个,street variant的前两个。完整的匹配键还包括zipcode的前5个,因此在上面的示例中,完整键可能看起来像“11test44680”。

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

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

    7 回复  |  直到 14 年前
        1
  •  5
  •   John MacIntyre    15 年前

    我正在研究一个与我们所说的类似的算法,它应该在我完成时处理加拿大、美国、墨西哥和英国的地址。我面临的问题是它们以3字段纯文本格式存在于我们的数据库中 那个 本来是个不错的主意,应该拍imho),所以尽量处理农村路线、一般快递、大批量收件、多个国家、省对州对县、邮政编码对邮政编码,拼写错误不小也不简单。

    仅仅拼写错误是不小的成就-特别是当你到了使用法语名字的国家-匹配的圣人,圣人,圣人,圣人,圣人,圣人,圣人,圣人,格兰德,格兰德,格兰德-尤其是当圣人可能是圣人的时候 街道和可能或可能没有在正确的上下文中输入(即女性与男性)。如果地址基本上输入正确,但有一个不正确的省或邮政编码怎么办?

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

    我真的很有兴趣与任何正在开发工具的人合作,也许我们可以互相帮助,找到一个共同的解决方案。我已经在这条路上走了一段路,并且已经克服了我提到的所有问题,让其他人来解决同样的问题将非常有助于激发灵感。

    欢呼- [本在AFSINC DOT CA]

        2
  •  2
  •   Marc Bernier    15 年前

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

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

        3
  •  1
  •   JeeBee    15 年前

    在英国,我们将使用:

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

    你当然应该使用邮政编码,但在美国,我相信你的邮政编码覆盖的范围比英国的邮政编码要广。因此,你需要使用街道和城市。

    你的例子无法区分11个测试街、110-119个测试街等。

    如果您的公司有权访问地址查找系统,我将运行所有数据,以使数据以一致的格式返回,可能使用可用于匹配的地址键。

        4
  •  1
  •   Robert Gowland    15 年前

    如果我想破解这个问题,我会使用预定义的操作顺序将每个地址字符串转换成树。

    例如110测试街3号公寓。加利福尼亚州任何地方90210=>

    1. 获取地址类型。例如街道地址有不同的格式,农村路线地址,这是不同的国家。
    2. 假设这是一个街道地址,获取表示街道类型的字符串并将其转换为枚举(eboulevard、eroad等)。
    3. 如果这是街道地址,请拉出街道名称(小写为store)
    4. 如果这是街道地址,请把街道号码
    5. 如果这是街道地址,请查找任何公寓号码(可以在街道号码前加破折号,也可以在“公寓”后加破折号等)。

         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等)。

        5
  •  1
  •   Handcraftsman    14 年前

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

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

        6
  •  0
  •   Brimstedt    15 年前

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

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

    即:“运河街555号”:

    • 摘录编号为“555”+“Canal Street”
    • 替换街道文字给出“555”+“Canal”
    • 创建匹配字符串给出“555canal”

    “Canal St 555”会给出相同的火柴线。

    在你的语言中,我指的是“street”的单词和缩写,例如“st”、“st.”、“blv”、“ave”、“avenue”等都从字符串中删除。

    通过提取数字并将它们从字符串中分离出来,它们是第一个还是最后一个并不重要。

        7
  •  0
  •   KM.    15 年前

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

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

    有两个过程“保存”

    • 在初始保存之后,执行搜索以查找匹配项,为它们提供可能的匹配项列表以及新的匹配项列表。
    • 在他们选择新的后保存它,如果他们选择一个现有的使用那个id

    清除数据。尝试去掉“street”、“st”、“drive”等,并将其存储为streettype char(1),该char(1)对包含正确缩写的表使用fk,这样就可以构建街道。

    调查Soundex和Difference

    我曾在维护mailinig列表的大公司工作过,他们并没有尝试自动执行,他们用人从dup中筛选出新的内容,因为这样做太难了。计划一个合并特性,以便在出现重复项时可以手动合并它们,并在pks中波动这些值。

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