并行统计文件中的单词

时间:2013-10-02 17:56:03

标签: c# parallel-processing

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

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

2 个答案:

答案 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应该是一个字典,可以将术语映射到索引。