2013-07-20 80 views
1

我有一個詞典文件夾,其中存儲了諸如「憤怒」,「護理」等字典列表。 例如,我在Facebook上發佈了一篇文章,內容是「我很沮喪, ,非常有害。「 在我的憤怒詞典中,我有3個字悶悶不樂,脾氣暴躁。 當我運行我的字數統計程序時,它似乎無法準確檢測到所有單詞。更具體地說,我的字數統計字典會檢測到曾經發生過一次悶悶不樂的事情,但是沒有任何困難。單詞詞典沒有得到所有單詞

這個問題是由我的正則表達式引起的嗎?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Text.RegularExpressions; 
using System.Windows.Forms; 

namespace empTRUST 
{ 
    class FBWordCount 
    { 
     public Dictionary<string, int> countWordsInStatus(string status, string[] dictArray) 
     { 
      var words = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase); // local word dictionary is created here 
      foreach (var dictEntry in dictArray) 
      { 
       var wordPattern = new Regex(@"\w+"); 
       string smallDictEntry = dictEntry.ToLower(); 
       foreach (Match match in wordPattern.Matches(status)) 
       { 
        if (match.ToString() == smallDictEntry) 
        { 
         int currentCount = 0; 
         words.TryGetValue(match.Value, out currentCount); 

         currentCount++; 
         words[match.Value] = currentCount; // local word dictionary adds new word count 
        } 
       } 
      } 
      return words; // returns local word dictionary to receiving end 
     } 
    } 
} 
+0

我編輯了自己的冠軍。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

+0

@SamuelLee我很高興看到你已經開始專注於逐步解決問題。只是一個快速的評論(據我所知,你是這樣做的),請記住,字典適合小尺寸,但消耗太多的內存來處理所有你想要的。您將不得不依靠數據庫或一組臨時文件來存儲所有類別。例如,你可以通過迭代地調用這個函數來適應p.s.w.g給出的答案:for循環遍歷所有列表(存儲在數據庫或文件中)並將所需的單詞作爲參數傳遞。 – varocarbas

+0

@SamuelLee我最後一個建議(空間不足)的例子:foreach(所有列表中的curListWords){tempDict = countWordsInStatus(inputString,curListWords)} - >每個tempDict將存儲給定匹配的相應類別。正如你所看到的,這會引起數量不斷增加的詞典(除了上述的記憶問題),因此你可能不得不採取不同的方法。我確信,通過這種方式,您將學習並最大限度地提高系統的效率。這是正確的方式。祝你好運! – varocarbas

回答

2

這整個方法可以被替換爲單個Linq查詢。試試這個:

public Dictionary<string, int> countWordsInStatus(string status, string[] dictArray) 
{ 
    var wordPattern = new Regex(@"\w+"); 
    return 
     (from Match m in wordPattern.Matches(status) 
     where dictArray.Contains(m.Value) 
     group m by m.Value) 
     .ToDictionary(g => g.Key, g => g.Count(), 
      StringComparer.CurrentCultureIgnoreCase); 
} 

你可以這樣調用:

var results = countWordsInStatus(
    "I am sullen, irked, petulant.", 
    new[] { "sullen", "irked", "petulant" }); 
// { { "sullen", 1 }, 
// { "irked", 1 }, 
// { "petulant", 1 } }