根据单词列表搜索短语列表并计算出现次数

时间:2013-05-08 07:42:48

标签: c#

问题很简单......
鉴于:

- > List1中的一系列犯规词。
- >用于搜索这些犯规词的字符串(或短语)列表,比如List2

期望的输出: 与至少一个犯规词相匹配的短语计数。

样品:
List1 :“猫”,“狗”,“老鼠”,“好动物”
List2 :“猫是好的”。 “狗是坏的”,“猫和狗都很好”,“好动物”,“你好”,“你好老鼠”,“这是坏事”

输出: 5个短语包含至少1个犯规词。

我做了什么:

int sum = list1.Sum(s => list2.Count(t => t.Contains(s)));

对于一个5600个短语的粗体字列表大约需要38秒,并且要搜索大约4000个字符串。(四核,4 GB RAM)... WAYYYYYY太慢了!

我已经四处寻找可能存在的解决方案或算法......找不到任何解决方案或算法。

即使有人能指出我正确的方向,通过命名一个算法,显示一个代码片段,或只是指着一根手指(!!),这将是伟大的!

1 个答案:

答案 0 :(得分:3)

这应该更有效率,因为Any会尽快中断:

int contains = phrases.Count(p => foulWords.Any(fw => p.Contains(fw)));

您的方法也不是最佳方法,因为您的起点是List1foulWords),因此您需要每个计数的总和,这是低效的。正确的结果必须介于0(没有匹配的犯规词)和phrases.Count之间(所有短语都包含一个犯规词)。所以起点应该是phrases

Demo

  问:你能否帮我修改上面的代码,也给我INDEX   列表中的短语?

是:

var wordIndexes = phrases.Select((phrase, index) => new { phrase, index })
    .Where(x => foulWords.Any(fw => x.phrase.Contains(fw)));

foreach (var wordIndex in wordIndexes)
    Console.WriteLine("Word: {0} Index: {1}", wordIndex.phrase, wordIndex.index);

结果:

Word: A cat is good        Index: 0
Word: a dog is bad         Index: 1
Word: cat and dog are good Index: 2
Word: Nice animal          Index: 3
Word: Hello mouse          Index: 5