假设我在数组中有一组关键字{“奥运会”,“体育网球最佳”,“网球”,“网球规则”}
然后我有一个很大的字符串列表(一次最多50个)(或者实际上是tweet),所以它们最多140个字符。
我想查看每个字符串,看看那里有哪些关键字。在一个关键字由多个单词组成的情况下,例如"sports string“,这些单词不一定要在字符串中放在一起,但它们必须全部出现。
我很难找出一个高效的算法来做这件事。
你们对此有什么建议吗?谢谢!
编辑:为了更好地解释,每个关键字都有一个关联的id,所以{1:“奥运会”,2:“体育网球最佳”,3:“网球”,4:“网球规则”}
我想浏览一下字符串/tweet列表,看看哪组关键字匹配。输出应该是,这条推文属于关键字#4。(可能会有多个匹配,所以任何匹配关键字2的都会匹配3 -since,它们都包含网球)。
当关键字中有多个单词时,例如“运动网球最佳”,它们不必一起出现,但必须全部出现。例如,这将正确地匹配:“我刚打过网球,我喜欢运动,这是最好的”……因为这个字符串包含"sports tennis“,所以它将匹配并与keywordID相关联(在本例中为2)。
编辑2:不区分大小写。
发布于 2010-04-23 00:17:39
IEnumerable<string> tweets, keywords;
var x = tweets.Select(t => new
{
Tweet = t,
Keywords = keywords.Where(k => k.Split(' ')
.All(t.Contains))
.ToArray()
});发布于 2010-04-23 00:18:37
可以使用几种算法非常有效地搜索多个模式,例如algorithm of (使用trie)或来自的算法。
如果性能很重要,我建议使用这两种方法之一。要在多个字符串中进行搜索,最有效的方法可能是将所有50个字符串连接成一个更大的字符串,并记录单个字符串的起始位置。
发布于 2010-04-23 00:20:30
也许是这样的?
string[] keywords = new string[] {"olympics", "sports tennis best", "tennis", "tennis rules"};
string testString = "I like sports and the olympics and think tennis is best.";
string[] usedKeywords = keywords.Where(keyword => keyword.Split(' ').All(s => testString.Contains(s))).ToArray();https://stackoverflow.com/questions/2692544
复制相似问题