找到其他句子中包含的句子

时间:2015-02-22 18:13:08

标签: c#

鉴于两个句子列表,我如何找到句子对,其中一个句子中的所有单词都包含在另一个句子中?

示例:

List1: {"free bar", "hello world", "foo"}
List2: {"hello there world", "foobar", "bar"}

输出应该告诉我List1中的“hello world”包含在List2的“hello there world”中,List2中的“bar”包含在List1的“free bar”中。另一方面,“foo”和“foobar”不匹配。

我尝试使用c#和LINQ来运行所有内容并与正则表达式匹配,但这太慢了。通常,这些列表包含至少2500个长度为1-6个字的句子。

就像一张纸条一样,它不必是列表。可能是HashMaps或其他任何东西。希望有人能指出我正确的方向。

1 个答案:

答案 0 :(得分:0)

这是一种使用哈希集字典进行预处理list2的方法 - 总体上是O(n * m),n =列表1中的单词数,m =列表2中的句子数(不包括预处理):

var list1 = new List<string>() { "free bar", "hello world", "foo" };
var list2 = new List<string>() { "hello there world", "foobar", "bar" };
var wordMap = new Dictionary<string, HashSet<int>>();

for(int i = 0; i< list2.Count; i++)
{
    var words = list2[i].Split(' ');
    foreach(var word in words)
    {
        if(!wordMap.ContainsKey(word))
        {
            wordMap[word] = new HashSet<int>();
        }
        wordMap[word].Add(i);
    }
}

foreach(var item in list1)
{
    bool foundMatch = false;
    var words = item.Split(' ');
    for (int i = 0; i < list2.Count;i++ )
    {
        foundMatch = words.All(word => !wordMap.ContainsKey(word) ? false : wordMap[word].Contains(i));
        if(foundMatch)
        {
            Console.WriteLine("Found matching sentence in list 2: " + list2[i]);
        }
    }
}

实际上,这应该比任何字符串比较快得多。