如何在.NET中有效地检查字符串中是否存在一个单词(在单词列表中)?

时间:2015-10-14 22:00:55

标签: .net

我需要导入大约300万行数据。每行都有一个地址,该地址分为以下字段:

  • 街道:例如。 1史密斯街或2/4史密斯街或1史密斯街
  • 郊区:richmond
  • 州:
  • country:iso code。

当我读入每一行时,我需要将它与我们自己的数据库匹配,该数据库具有相同的字段结构。

问题在于我们有以下内容:

  • DB:1史密斯街档案:1史密斯街
  • DB:1史密斯街。档案:1史密斯街。

我有一份所有街道缩写的清单,但我不确定如何检查两种类型的街道类型?

我正在尝试这样做:

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行根本不匹配。所以它不会被添加到任何一个字典中。)

到目前为止我的直觉是:

  1. 搜索完全匹配。

    var addressKey = string.Format("street-suburb-state-country", ..)
                           .Trim()
                           .ToLowerInvariant();
    if (addressesFromDb["1 smith street-suburb-state-country"]) 
    { 
        //we have a match 
    }
    
  2. 现在搜索对面街道类型..

    不知道

  3. 这让我获得了大量的点击量。但我正在努力寻找更多匹配......

    有什么想法吗?

    注意:.NET 4.5&amp; C#。

2 个答案:

答案 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%正确