将地址与地址列表进行比较

3

检查客户地址是否在我们的SQL数据库地址列表中,告诉我们该地址是否存在于我们的数据库中。客户地址以不同的格式出现。

e.g:- 8455 W 23RD st OFFICE 4
     8455 WEST 23RD st OFC 4
     8455 WEST TWENTY-THIRD street OFC 4

如果我进行字符串比较,那么结果将是 bExist = False; 注意:我正在使用C#,应用程序运行的服务器没有互联网连接。 附加示例:
APARTMENT   APT
APARTMENT   APARTMENT
BUILDING    BLDG
BUILDING    BUILDING
DEPARTMENT  DEPT
DEPARTMENT  DEPARTMENT
FLOOR   FL
FLOOR   FLOOR
HANGAR  HNGR
HANGAR  HANGAR
LOT LOT
OFFICE  OFC
OFFICE  OFFICE
PIER    PIER
PIER    PIER
ROOM    RM
ROOM    ROOM
SLIP    SLIP
SPACE   SPC
SPACE   SPACE
STOP    STOP
SUITE   STE
SUITE   SUITE
TRAILER TRLR
TRAILER TRAILER
UNIT    UNIT

N   NORTH
S   SOUTH
E   EAST
W   WEST
NE  NORTHEAST
SE  SOUTHEAST
NW  NORTHWEST
SW  SOUTHWEST
NORTH   NORTH
SOUTH   SOUTH
EAST    EAST
WEST    WEST
NORTHEAST   NORTHEAST
SOUTHEAST   SOUTHEAST
NORTHWEST   NORTHWEST
SOUTHWEST   SOUTHWEST
NORTH EAST  NORTHEAST
SOUTH EAST  SOUTHEAST
NORTH WEST  NORTHWEST
SOUTH WEST  SOUTHWEST

请提供一些代码!(欢迎来到stackoverflow :)) - Odys
你可以使用Levenshtein距离来计算相似度。这里有一个实现:https://dev59.com/3nRB5IYBdhLWcg3wpopm#560733 - Tim Schmelter
你需要进行模糊匹配。对于基本系统,使用ContainsStartsWithEndsWith。对于完整功能的系统,使用Levenshtein距离 - ChrisF
1
Levenshtein算法在W和WEST之间无法找到太多的相似性。 - H H
@HenkHolterman:我认为这是一个“地址”列。因此,“8455 W 23RD ST OFFICE 4”和“8455 WEST 23RD ST OFC 4”之间可能存在相似之处,尽管不多。 - Tim Schmelter
好的,所以你已经有了一组替换规则。现在你需要一个战略方法。你已经写了什么内容了吗? - H H
3个回答

1

如果您有SSIS,您可以使用其内置的模糊匹配选项,这相当适用。

我使用了Ambient Concepts的一个工具:地址解析器 它是一组函数,可以解析和标准化您的地址。他们似乎提供免费试用,所以您可以测试一下。

您也可以从头开始进行处理,尽力使数据同质化。我们经常将街道号码和街道名称分开,因为绝大多数差异来自于前/后方向,例如:12 north 5th st、12 n 5th st、12 5th st north等。还有数字与数字单词之间的区别。


我没有时间编写所有的情况。我喜欢地址解析器。这里还有免费的源代码:http://usaddress.codeplex.com。谢谢! - Habesha

1
你甚至不能用纯 SQL 实现成功。即使在“正常”的编程语言中也很困难。需要考虑区域性的寻址样式,以及人们想出的众多地址变体,例如:
  • 123 Main St, Apt 3A, ...
  • 123 Main St #3, ...
  • 123 Main St Box 3 ...
所有这些都反映了相同的物理地址。
这还没有考虑到简单的数据输入错误,如字符位置颠倒等。
事情很快就会变得非常困难。你将花费大量时间和精力来处理下一个创造性的数据输入错误。
你需要做的是在将地址记录到数据库之前使用美国邮政局的地址标准化服务。 USPS 还认证了相当多的第三方供应商 的准确性。
我曾经在一家初创公司工作过,他们使用 Google Maps API 来标准化地址 - 这是另一种方法。

0
我会选择类似这样的东西...
  public static string Substitute(string s)
            {
                var abbrevs = new Dictionary<string, string>();
                abbrevs.Add("OFC", "OFFICE");
                abbrevs.Add("ST", "STREET");
                abbrevs.Add("ST.", "STREET");
                if (abbrevs.ContainsKey(s)) return abbrevs[s];
                return SubstituteWordNumbersForNumerics(s);            
            }

            public static string ToNormalAddressFormat(string address)
            {
                return address.Split(' ').ToList().Select(Substitute).Aggregate((x, y) => x + " " + y);
            }

然后在比较之前将所有地址转换


我认为你应该将所有基于“Saint Something”的街道/地名更改为“Street Something”。 - H H
当ContainsKey具有“Saint”时,它不会匹配到“ST”或“ST.”。 - Keith Nicholas
我的意思是,“5 Saint Nicolas”和“5 st Nicolas”可能是同一个地址的一部分。你的代码如何处理这种情况? - H H
如果“it won't”是指圣人的有效缩写,那么它不会生效。它假设没有使用缩写来表示不同的含义。 - Keith Nicholas
我认为现实世界中的地址不会遵守这个假设。请看我的关于排序/长格式的那一行。将“Saint Jonh street”转换为“st John st”可能会更好。 - H H
如果没有太多的重叠,那么可以通过计算匹配来完成,否则我会开始尝试构建一个理解地址结构的地址解析器。然而,仔细想想,如果只是为了匹配,将所有形式的“Saint”转换为“St”,那么对于匹配来说,这可能会很好地解决问题。 - Keith Nicholas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接