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

2 回答 2

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

于 2013-10-02T18:04:36.170 回答
1

您正在枚举您的_documentVectorSpace[i].Termsfor each term。您应该反转循环,以便_documentVectorSpace[i].Terms_distinctTerms.

此外,从这个例子中很难看出你的一代有多高效_documentVectorSpace。很有可能,虽然它运行得很快,但它正在跳过需要此功能执行的大量工作。

于 2013-10-02T17:59:25.763 回答