我需要导入大约300万行数据。每行都有一个地址,该地址分为以下字段:
当我读入每一行时,我需要将它与我们自己的数据库匹配,该数据库具有相同的字段结构。
问题在于我们有以下内容:
我有一份所有街道缩写的清单,但我不确定如何检查两种类型的街道类型?
我正在尝试这样做:
var addressIndexFull = new Dictionary<string, int>();
var addressIndexAbbrev = new Dictionary<string, int>();
File Rows:
- 1 smith st
- 2 smith street
DB
- 1 smith street | ID: 1234
Result:
AIF => "1 smith street" | 1234
AIA => "1 smith st" | 1234
(注意,文件的第2行根本不匹配。所以它不会被添加到任何一个字典中。)
到目前为止我的直觉是:
搜索完全匹配。
var addressKey = string.Format("street-suburb-state-country", ..)
.Trim()
.ToLowerInvariant();
if (addressesFromDb["1 smith street-suburb-state-country"])
{
//we have a match
}
现在搜索对面街道类型..
不知道
这让我获得了大量的点击量。但我正在努力寻找更多匹配......
有什么想法吗?
注意:.NET 4.5&amp; C#。
答案 0 :(得分:1)
有许多方法拼写(或拼错)邮政地址,同时仍保持合法。除了您自己的示例,还有以下内容:
&#34; 1st Ave&#34; vs&#34; First Avenue&#34;, &#34; 123 Main St&#34; vs&#34; 123 Main&#34;, &#34; Green Park Rd&#34; vs&#34; Green Prk Rd&#34;等等。
除此之外,添加一直存在的错误拼写,错误和拼写错误,因为大多数地址记录都来自人类写作或口述。
要比较两个邮政地址的相等性,您需要首先验证,纠正和标准化两者到同一个明确定义的标准(例如美国地址的USPS)。这不仅仅涉及使用正则表达式替换街道后缀。完成校正和标准化后,您可以将两个地址作为字符串进行比较 - 如果字符串匹配,则地址相同。
有许多地址修正和标准化工具可供使用。其中一个是YAddress(由我工作的公司制作)。
答案 1 :(得分:0)
也许我错过了什么
首先规范化读取地址 - 剥离前导尾部空格,剥离嵌入的空格,规范化街道地址中的数字(无前导零,......),强制为小写。确保它尽可能与DB匹配
尝试匹配DB
用st替换街道,再试一次
用st替换街道。再试一次
将街道替换为街道,再试一次
...
这是正常的启发式匹配
示例代码
this.text.text('new Text')
可能更好的是使用正则表格来寻找东西。也许有点像这样的
//replace street by st, try again
var tryagain = addr.Replace(" street"," st");
然后循环每一个匹配,替换尝试......
var replaces = new List<Tuple<string,string>>{
Tuple.Create("\wst$", "street"),
Tuple.Create("\wstreet$", "st"),
Tuple.Create("\wroad$", "rd"),
};
警告:上面是粗略的草图代码,我肯定没有编译,google c#regex让它100%正确