C# 文档中的平行计数字

C# 文档中的平行计数字,c#,parallel-processing,C#,Parallel Processing,你知道如何使这个循环更快吗? 它统计每个单词在文档中出现的频率 _documentVectorSpace是包含有关文档的杂项信息的对象列表 _documentVectorSpace[i]。术语是文档中的单词数组 _DistincterMS是所有文档中包含的所有唯一单词的哈希集 Parallel.For(0, _documentVectorSpace.Count, i => { int count = 0; double[] vec = new double[_distinc

你知道如何使这个循环更快吗? 它统计每个单词在文档中出现的频率

_documentVectorSpace是包含有关文档的杂项信息的对象列表

_documentVectorSpace[i]。术语是文档中的单词数组

_DistincterMS是所有文档中包含的所有唯一单词的哈希集

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

您正在枚举每个
术语的
\u documentVectorSpace[i]。术语。您应该反转循环,以便从
\u documentVectorSpace[i].Terms开始,并在
\u distinctTerms
中查找值


此外,从这个示例很难看出生成
\u documentVectorSpace
的效率有多高。在快速运行时,很可能会跳过此函数所需的大量工作。

在distinctTerms中为每个单词扫描一次文档非常昂贵,而且您没有充分利用HashSet查找的功能。您应该做的是扫描文档一次,识别
\u distinctTerms
中的每个单词,并更新向量。大致如下:(未经测试的代码)


当然,
\u distinctTerm
现在应该是一个将术语映射到索引的字典。

对于字符串比较,应该使用
string.Equals(s,term,StringComparison.OrdinalIgnoreCase)
。听起来像是“信息检索”赋值:)
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;
 });