你知道如何让这个循环更快吗? 它计算每个单词出现在文档中的频率。
_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();
}
答案 0 :(得分:1)
您要为每个_documentVectorSpace[i].Terms
枚举term
。您应该撤消循环,以便从_documentVectorSpace[i].Terms
开始,并在_distinctTerms
中查找值。
此外,从这个例子中很难说出你_documentVectorSpace
的产生效率如何。很有可能的是,当它快速运行时,它正在跳过这项功能需要做的大量工作。
答案 1 :(得分: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
应该是一个字典,可以将术语映射到索引。