2010-04-22 16 views
5

en ı sonra varanahtar bir dize içine varsa Algoritma görmek için

{ "En iyi spor tenis" "olimpiyatlar", "tenis", "tenis kuralları"} Bir dizide bir dizi anahtar kelime var diyelim Dizeleri (veya aslında tweets) büyük bir liste (bir seferde 50'ye kadar), yani en fazla 140 karakterdir.

Her dizeye bakmak ve orada hangi anahtar sözcüklerin bulunduğunu görmek istiyorum. Bir anahtar kelimenin "spor tenisinin en iyisi" gibi birden fazla kelimeden oluştuğu durumlarda, kelimelerin dizide birlikte olması gerekmez, ancak hepsinin ortaya çıkması gerekir.

Bunu verimli şekilde yapan bir algoritma bulmakta zorlanıyorum.

Bunun için bir yol önerileriniz var mı? Teşekkürler!

Düzenleme: Anahtar kelimelerin her birinin bir kimliği daha iyi açıklamak gerekirse, bu nedenle {1: "olimpiyatlar", 2: "tenis sporu en iyi", 3: "tenis", 4: "tenis kuralları"}

Dizeler/tweet'ler listesini incelemek ve hangi anahtar kelime grubunun eşleştiğini görmek istiyorum. Çıkış olmalı, bu tweet # 4 anahtar kelimesine ait. (Birden fazla eşleşme yapılabilir, böylece 2 anahtar kelimesiyle eşleşen her şey, her ikisinin de tenis oynadığı 3 ile eşleşir). Anahtar sözcükte birden çok sözcük olduğunda, örn. "En iyi spor tenisleri" birlikte görünmek zorunda değiller ama hepsinin görünmesi gerekiyor. Örneğin. Bu doğru bir şekilde eşleşecek: "sadece tenis oynadım, sporu seviyorum, en iyisi" ... bu dizi "spor tenisinin en iyisi" ni içerdiği için eşleşecek ve anahtar kelimeyle ilişkilendirilecektir (bu örnek için 2'dir).

Düzenleme 2: Büyük/küçük harf duyarsız.

+1

İstediğiniz çıktı nedir? Anahtar kelimeleri içeren dizelerin listesi? Ya da her bir anahtar kelimenin bir dizede kaç defa var olduğu Veya başka bir şey? –

+0

Substring veya tüm kelime eşleşmesi? Harfe duyarlı? – RedFilter

+0

Yukarıda biraz daha fazla açıklık ekledim, tüm kelime eşleşmesi ... ama boşlukla ayrılmış anahtar kelimeler mantıksal AND'ye eşdeğerdir. Yani "spor tenisinin en iyisi", "spor" ve "tenis" VE "en iyi" olan bir anahtar kelimeyle eşleşmelidir – rksprst

cevap

6
yılında C# Ve birden fazla kelimenin başına: Bitiş Bitiş

için sonu için EĞER Sonra MatchingString maçlarınızın

DÜZENLEME tümünü içerir

IEnumerable<string> tweets, keywords; 

var x = tweets.Select(t => new 
          { 
           Tweet = t, 
           Keywords = keywords.Where(k => k.Split(' ') 
                   .All(t.Contains)) 
                .ToArray() 
          }); 
0

Tüm anahtar kelimelerinizi bir dizeler listesine koymanızı ve ardından veri listenizden (tweets, neyse) başka bir dizeler listesi olarak kullanılmasını öneririm.

böyle

Do şey:

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); 

aradan; Bir anahtar kelime listesinde

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; 
      } 
    } 

} 

} }

+0

Ancak, birden fazla kelimeye sahip anahtar kelimelerden ne haber? Bu buna uymuyor. – rksprst

+0

Q, C# etiketli değil vb. –

+0

Anahtar sözcüklerle tek tek kelimeleri eşleştirmeniz gerekiyorsa, anahtar kelimelerinizi eşleştirmeniz gerekir. Ben bunu bir # 0 içinde yeniden yazacağım # – msarchet

0

Whoops.

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; 
} 
1

çok sayıda desen çok sayıda, örneğin (bir temel bölünmüş indeks kullanılarak) algorithm of Aho-Corasick algoritmalar veya Wu and Manber birini kullanılarak çok verimli şekilde aranabilir.

Performans önemliyse, bunlardan birini almanızı öneririm. Birden çok dizgide arama yapmak için, tüm dizelerinizin başlangıç ​​konumlarını koruyarak, tüm 50 dizinizi daha büyük bir dizeye birleştirmek en verimli olabilir.

1

Belki böyle bir şey?

 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(); 
0

aramalarınızı daha etkin hale getirmek için dizeleri ön süreci yolu vardır, ama havai bu kadar kısa dizeleri için kazanç daha fazla olduğunu düşünüyorum. O kadar fazla veri değil, bu yüzden olacağını dizeleri ile sadece döngü:

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 
    } 
    } 
} 
İlgili konular