查看字符串中是否存在关键字的算法

时间:2010-04-22 16:12:27

标签: c# algorithm string

假设我在阵列中有一组关键词{“奥运会”,“体育网球最佳”,“网球”,“网球规则”}

然后我有一个大的列表(一次最多50个)字符串(或实际上是推文),所以最多140个字符。

我想查看每个字符串,看看那里有哪些关键字。在关键字由多个单词组成的情况下,例如“体育网球最佳”,单词不必在字符串中,但所有单词都必须出现。

我无法找到有效执行此操作的算法。

你们有关于这种方法的建议吗?谢谢!

编辑: 为了更好地解释每个关键字都有一个与之关联的ID,所以{1:“奥运会”,2:“体育网球最佳”,3:“网球”,4:“网球规则”}

我想查看字符串/推文列表,看看哪组关键字匹配。输出应该是,这条推文属于关键字#4。 (可以进行多次匹配,因此匹配关键字2的任何内容也会匹配3 - 因为它们都包含网球)。

如果关键字中有多个字词,例如“体育网球最好”他们不必一起出现但必须全部出现。例如这将正确匹配:“我只是打网球,我喜欢运动,它是最好的”...因为这个字符串包含“体育网球最佳”,它将匹配并与关键字ID(本例中为2)相关联。

编辑2:不区分大小写。

6 个答案:

答案 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
    }
  }
}