在文档中并行计算字数
本文关键字:并行计算 文档 | 更新日期: 2023-09-27 18:33:49
你知道如何使这个循环更快吗?它计算每个单词在文档中出现的频率。
_documentVectorSpace是包含有关文档的杂项信息的对象列表。
_documentVectorSpace[i].术语是文档中的单词数组。
_distinctTerms是所有文档中包含的所有唯一单词的哈希集。
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();
}
您
正在枚举每个term
的_documentVectorSpace[i].Terms
。您应该反转循环,以便从_documentVectorSpace[i].Terms
开始并在_distinctTerms
中查找值。
此外,很难从这个例子中看出你的_documentVectorSpace
一代有多高效。很有可能,虽然它运行得很快,但它跳过了需要此功能执行的大量工作。
_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
现在应该是一个将术语映射到索引的字典。