假设我在阵列中有一组关键词{“奥运会”,“体育网球最佳”,“网球”,“网球规则”}
然后我有一个大的列表(一次最多50个)字符串(或实际上是推文),所以最多140个字符。
我想查看每个字符串,看看那里有哪些关键字。在关键字由多个单词组成的情况下,例如“体育网球最佳”,单词不必在字符串中,但所有单词都必须出现。
我无法找到有效执行此操作的算法。
你们有关于这种方法的建议吗?谢谢!
编辑: 为了更好地解释每个关键字都有一个与之关联的ID,所以{1:“奥运会”,2:“体育网球最佳”,3:“网球”,4:“网球规则”}
我想查看字符串/推文列表,看看哪组关键字匹配。输出应该是,这条推文属于关键字#4。 (可以进行多次匹配,因此匹配关键字2的任何内容也会匹配3 - 因为它们都包含网球)。
如果关键字中有多个字词,例如“体育网球最好”他们不必一起出现但必须全部出现。例如这将正确匹配:“我只是打网球,我喜欢运动,它是最好的”...因为这个字符串包含“体育网球最佳”,它将匹配并与关键字ID(本例中为2)相关联。
编辑2:不区分大小写。
答案 0 :(得分:6)
IEnumerable<string> tweets, keywords;
var x = tweets.Select(t => new
{
Tweet = t,
Keywords = keywords.Where(k => k.Split(' ')
.All(t.Contains))
.ToArray()
});
答案 1 :(得分:1)
使用多种算法可以非常有效地搜索多种模式,例如algorithm of Aho-Corasick(使用特里)或Wu and Manber中的算法。
如果表现很关键,我建议采取其中任何一种。要搜索多个字符串,将所有50个字符串连接成一个更大的字符串可能是最有效的,记录单个字符串的起始位置。
答案 2 :(得分:1)
也许是这样的?
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();
答案 3 :(得分:0)
我建议将所有关键字放入字符串列表中,然后将数据列表(推文,无论如何)作为另一个字符串列表。
做这样的事情:
Dim matchingStrings As Dictonary(String, String);
For Each stringToSearch As String In tweetList
For Each keyword As String In keywordList
If stringToSearch.Contains(keyword)
matchingString.Add(stringToSearch, keyword);
中断; 万一 结束
结束然后MatchingString包含所有匹配
编辑:在C#中并按照关键字列表中的多个单词
Dictionary<string, string> matchingString = New Dictionary<string, string>;
foreach (String stringToSearch In tweetList){
foreach (String keyword In keywordList){
If(stringToSearch.Contains(keyword){
matchingString.Add(stringToSearch, keyword);
break;
}
else if{
List<string> split = keyword.Split(" ")
foreach(String sKeyword In split){
If(stringToSearch.Contains(keyword){
matchingString.Add(stringToSearch, keyword);
break;
}
}
}
} }
答案 4 :(得分:0)
糟糕。
foreach (var s in strings)
{
foreach (var keywordList in keywordSet)
{
if (s.ContainsAll(keywordList))
{
// hit!
}
}
}
...
private bool ContainsAll(this string s, string keywordList)
{
foreach (var singleWord in keywordList.Split(' '))
{
if (!s.Contains(singleWord)) return false;
}
return true;
}
答案 5 :(得分:0)
有一些方法可以预处理字符串以使搜索更有效,但我认为开销不仅仅是这些短字符串的增益。它不是那么多数据,所以我只是遍历字符串:
foreach (string tweet in tweets) {
foreach (string keywords in theArray) {[
string[] keyword = keywords.Split(' ');
bool found = true;
foreach (string word in keyword) {
if (tweet.indexOf(word) == -1) {
found = false;
break;
}
}
if (found) {
// all words exist in the tweet
}
}
}