2013-10-02 57 views
0

你知道如何使這個循環更快嗎? 它計算每個單詞在文檔中的出現頻率。並行計數文檔中的單詞

_documentVectorSpace是包含有關文檔的其他信息的對象列表。

_documentVectorSpace [i] .Terms是文檔中的單詞數組。

_distinctTerms是包含在所有文檔中的所有唯一字的HashSet。

Parallel.For(0, _documentVectorSpace.Count, i => 
{ 
    int count = 0; 
    double[] vec = new double[_distinctTerms.Count]; 
    foreach (string term in _distinctTerms) 
    { 
     vec[count++] = Weight(_documentVectorSpace[i].Terms, term); 
    } 
    _documentVectorSpace[i].VectorSpace = vec; 
}); 

,其中作爲權重定義:

private float Weight(string[] document, string term) 
{ 
    return document.Where(s => s == term).Count(); 
} 
+1

對於字符串比較,您應該使用'String.Equals(s,term,StringComparison.OrdinalIgnoreCase)'。 – MichaelS

+0

聽起來像「信息檢索」作業:) – Alireza

回答

1

您爲每個term枚舉您_documentVectorSpace[i].Terms。你應該扭轉你的循環,所以你從_documentVectorSpace[i].Terms開始,並在_distinctTerms中查找值。

此外,很難從這個例子中知道您的代_documentVectorSpace是多麼有效率。它很快可能會在運行時跳過這個功能所要做的很多工作。

1

_distinctTerms中的每個單詞掃描一次文檔非常昂貴,而且您沒有充分利用HashSet查找的功能。你應該做的是掃描文件一次,識別_distinctTerms中的每個單詞,並更新向量。沿着線的東西:(未經測試的代碼)

Parallel.For(0, _documentVectorSpace.Count, i => 
{ 
    int count = 0; 
    double[] vec = new double[_distinctTerms.Count]; 
    Parallel.ForEach(_documentVectorSpace[i].Terms, term => 
    { 
     if (_distinctTerms.ContainsKey(term)) 
     { 
      Interlocked.Increment(ref vec[_distinctTerms[term]]); 
     } 
    }); 
    _documentVectorSpace[i].VectorSpace = vec; 
}); 

當然,_distinctTerm應該是現在映射術語來索引的字典。

相關問題