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

如何在.NET中有效地检查字符串中是否存在一个单词(在单词列表中)?,.net,.net,我需要导入大约300万行数据。每行有一个地址,该地址分为以下字段: 街道:如史密斯街1号或史密斯街2/4号或史密斯街1号 郊区:里士满 声明: 国家:iso代码 当我读取每一行时,我需要将其与我们自己的数据库进行匹配,该数据库具有相同的字段结构 问题是当我们有以下情况时: DB:1史密斯街档案:1史密斯街 DB:史密斯街1号。档案:史密斯街1号 我有一个所有街道缩写的列表,但我不知道如何检查这两种街道类型 我正在尝试这样做: var addressIndexFull = new Dict

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

  • 街道:如史密斯街1号或史密斯街2/4号或史密斯街1号
  • 郊区:里士满
  • 声明:
  • 国家:iso代码
当我读取每一行时,我需要将其与我们自己的数据库进行匹配,该数据库具有相同的字段结构

问题是当我们有以下情况时:

  • 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
  • 现在搜索相反的街道类型

    不知道

  • 这让我获得了大量的点击率。但我想找到更多的匹配项

    有什么想法吗


    注:.NET4.5&C#。

    也许我遗漏了什么

    首先规范化读取地址-去掉前导尾随空格,去掉嵌入空格,规范化街道地址中的数字(无前导零,…),强制使用小写。确保它尽可能与DB匹配

    尝试匹配数据库

    将街道替换为st,然后重试

    将街道替换为st.再试一次

    将st替换为street,然后重试

    这是正常的启发式匹配

    示例代码

    //replace street by st, try again
    var tryagain = addr.Replace(" street"," st");
    
    可能更好的方法是使用regex表查找内容。也许是这样的

    var replaces = new List<Tuple<string,string>>{
    Tuple.Create("\wst$", "street"),
    Tuple.Create("\wstreet$", "st"),
    Tuple.Create("\wroad$", "rd"),
    };
    

    警告:以上是粗略的代码,我肯定没有编译,谷歌c#regex让它100%正确

    也许我遗漏了什么

    首先规范化读取地址-去掉前导尾随空格,去掉嵌入空格,规范化街道地址中的数字(无前导零,…),强制使用小写。确保它尽可能与DB匹配

    尝试匹配数据库

    将街道替换为st,然后重试

    将街道替换为st.再试一次

    将st替换为street,然后重试

    这是正常的启发式匹配

    示例代码

    //replace street by st, try again
    var tryagain = addr.Replace(" street"," st");
    
    可能更好的方法是使用regex表查找内容。也许是这样的

    var replaces = new List<Tuple<string,string>>{
    Tuple.Create("\wst$", "street"),
    Tuple.Create("\wstreet$", "st"),
    Tuple.Create("\wroad$", "rd"),
    };
    

    警告:以上是粗略的代码,我肯定不会编译,谷歌c#regex让它100%正确

    是的,我更多的是在代码示例之后,而不是更高层次的逻辑答案。你能详细说明一下怎么做吗:
    用一些代码将street替换为st
    ?我害怕你会说:使用for循环<代码>对于每个缩写,字符串。替换。。当街道名称中有街道类型时,这不是很好。。。例如,
    Dark Alley Place
    match.Replace
    不起作用。它将匹配整行(yay),这意味着:这个输入字符串与您给出的模式匹配。但是,替换将替换匹配的整个输入字符串:(是的,我更喜欢代码示例,而不是更高层次的逻辑答案。你能详细说明一下如何做:
    用一些代码替换street by st
    ?我担心你可能会说:使用for循环。
    对于每个abbriev,string.replace
    。当街道名称中有street类型时,这并不太好……例如,
    深色a。)lley Place
    match.Replace
    将不起作用。它将匹配整行(yay),这意味着:此输入字符串与您给定的模式匹配。但随后,Replace将替换匹配的整个输入字符串:(