什么是匹配字符串中大型短语词典中的项目的有效方法(段落)

时间:2012-06-14 16:21:54

标签: c# arrays string dictionary

在传递字符串和字典对象时,有没有办法通过.Net框架(或有人编写类似的东西)来获取匹配数组?

首先是一些背景

我需要

我有运动队的csv文件,我加载到字典对象中,例如......

Team, Variants
Manchester United, Manchester United
Manchester United, manutd
Manchester United, man utd
Manchester United, manchester utd
Manchester United, mufc
Aston Villa, Aston Villa
Aston Villa, avfc
Newcastle United, Newcastle United
Newcastle United, toon army

现在我想查看一个字符串是否包含该字典中的任何短语。

示例字符串......

"I wonder if man utd, aston villa andthe toon army will exist in this string"

现在我想返回的是匹配的n个字符串数组,示例输出如下:

["Manchester United","Aston Villa", "Newcastle United"]

我目前正在使用正则表达式来分割字符串中的单词。然后我循环遍历字符串中的每个单词并对字典进行测试(这里的注释是代码确实有效但只有单个单词而不是短语,这是由于正则表达式)

public static List<string> CheckStringWithDictionary(string input, Dictionary<string, string> dic, int minimumLength)
{
    List<string>lst = new List<string>();
    string myValue = "";
        foreach (Match match in RegexSplitStringToArray(input, minimumLength))
        {
            if (dic.TryGetValue(match.Value, out myValue))
                lst.Add(myValue);
        }
    return lst;
}

public static MatchCollection RegexSplitStringToArray(string input, int minLength)
{
    Regex csvSplit = new Regex("(\\w{3,})", RegexOptions.Compiled);
    return csvSplit.Matches(input);
}

循环字符串而不是字典的原因是因为字典将包含超过10,000个项目,因此循环使用它的效率非常低。

到目前为止,感谢您的问题,现在回答问题......

在传递字符串和字典对象时,有没有办法通过.Net框架(或有人编写类似的东西)来获取匹配数组?

全部谢谢

2 个答案:

答案 0 :(得分:3)

我会使用LINQ:

 string input = "I wonder if man utd, aston villa andthe toon army will exist in this string";
 List<string> matches = dic.
                           .Where(kvp => input.Contains(kvp.Key))
                           .Select(kvp => kvp.Value)
                           .ToList();

这仍然有效地循环通过字典,但如果你需要处理多个单词选项,这可能会比大多数替代方案更好,即使是大字典也是如此。

答案 1 :(得分:0)

使用标准字典和字符串比较,您将无法获得更快的速度。要获得真正的性能,您需要具有Aho-Corasick algorithm级别的内容。基本上,你从字典中构建一个特殊的树并与之匹配。该算法在输入大小和字典大小上是线性的。