C# 将地址与地址列表进行比较
根据我们的SQL DB地址列表检查客户地址,告知我们的DB中是否存在该地址。 客户地址有不同的格式C# 将地址与地址列表进行比较,c#,sql,sql-server,visual-studio-2010,dll,C#,Sql,Sql Server,Visual Studio 2010,Dll,根据我们的SQL DB地址列表检查客户地址,告知我们的DB中是否存在该地址。 客户地址有不同的格式 e.g:- 8455 W 23RD st OFFICE 4 8455 WEST 23RD st OFC 4 8455 WEST TWENTY-THIRD street OFC 4 如果我进行字符串比较,我将得到bExist=False 注意:-我使用的是C#,运行应用程序的服务器没有internet连接。 附加示例:- APARTMENT APT APARTMENT
e.g:- 8455 W 23RD st OFFICE 4
8455 WEST 23RD st OFC 4
8455 WEST TWENTY-THIRD street OFC 4
如果我进行字符串比较,我将得到bExist=False代码>
注意:-我使用的是C#,运行应用程序的服务器没有internet连接。
附加示例:-
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
有很多选择,如果您有SSI,您可以使用其内置的模糊匹配,这是非常充分的
我使用了环境概念中的一个工具:
它是一个函数集合,将解析和标准化您的地址。他们似乎提供免费试用,这样你就可以进行测试了
您也可以从头开始,尽可能地均匀化数据。我们经常将街道编号和街道名称分开,因为绝大多数差异来自于前/后方向,即:北五街12号、北五街12号、北五街12号等,以及数字与数字词的对比 我会选择像
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);
}
公共静态字符串替换(字符串s)
{
var abbrevs=新字典();
缩写添加(“OFC”、“办公室”);
缩写添加(“街”、“街”);
缩写添加(“街”);
如果(abbrevs.ContainsKey(s))返回abbrevs[s];
返回替代品编号或数量;
}
公共静态字符串格式(字符串地址)
{
返回地址.Split(“”).ToList().Select(Substitute).Aggregate((x,y)=>x+“”+y);
}
然后在比较之前转换所有地址,在直接SQL中甚至无法接近成功。即使是在“正常”的编程语言中,这也很困难。有一些地区的称呼风格需要考虑,人们会想出很多称呼变体,比如
- 主大街123号,3A公寓
- 第三大街123号
- 123号主街3号包厢
所有这些都反映了相同的物理地址
这甚至没有考虑到简单的数据输入错误,比如转置字符
事情很快变得非常困难。你将花费大量的时间和精力来处理下一个创造性的数据输入错误
您要做的是在将地址记录到数据库中之前使用。还有一些证据表明,美国药典已经对准确度进行了认证
我曾为一家使用谷歌地图API标准化地址的初创公司工作过一段时间,这是另一种方法。请提供一些代码!(欢迎来到stackoverflow:))您可以使用levenshtein距离来计算相似性。这里有一个实现:您必须进行模糊匹配。对基本系统使用包含
,开始
和结束
。对于一个功能齐全的系统。莱文施泰因不会发现W和西方有太多相似之处。@HenkHolterman:我认为这是一列“地址”。因此,8455 W第23街第4办公室
和8455西第23街OFC第4办公室
之间可能有相似之处,虽然不多。我想你会将所有基于“圣人某物”的街道/地名改为“街道某物”,即当ContainsKey有“圣人”时,它将与“圣人”或“圣人”不匹配。我的意思是“圣尼古拉斯5”和“圣人”“5 st Nicolas”可能是同一地址的一部分。您的代码如何处理?如果这是Saint的有效缩写,则不会。它假设没有缩写用于表示不同的内容。我认为现实世界中的地址不会遵守该假设。请参阅我关于排序/长格式的行。将“Saint John street”
转换为”st John st“
可能会更好。我没有时间编写所有案例。我喜欢地址分析器。这里还有免费的源代码:-。谢谢!