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

_documentVectorSpace[i].Termsfor eachを列挙していますterm_documentVectorSpace[i].Termsから開始して の値を検索するように、ループを逆にする必要があります_distinctTerms

さらに、この例から、あなたの生成がどれほど効率的かを伝えるのは困難_documentVectorSpaceです。高速で実行されている間に、この関数が実行する必要がある多くの作業をスキップしている可能性が非常に高くなります。

于 2013-10-02T17:59:25.763 に答える
1

単語ごとにドキュメントを 1 回スキャンするの_distinctTermsは非常にコストがかかり、HashSet ルックアップの機能を十分に活用できていません。すべきことは、ドキュメントを 1 回スキャンし、 にある各単語を識別し_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 に答える