10

最近は潜在意味解析に取り組んでいます。Jama パッケージを利用して Java で実装しました。

コードは次のとおりです。

    Matrix vtranspose ; 
    a = new Matrix(termdoc);  
    termdoc = a.getArray(); 
    a = a.transpose() ; 
    SingularValueDecomposition sv =new SingularValueDecomposition(a) ; 
    u = sv.getU();
    v = sv.getV(); 
    s = sv.getS();
    vtranspose = v.transpose() ; // we obtain this as a result of svd 

    uarray = u.getArray();
    sarray = s.getArray(); 
    varray = vtranspose.getArray(); 
    if(semantics.maketerms.nodoc>50)
    {

        sarray_mod = new double[50][50]; 
        uarray_mod = new double[uarray.length][50];
        varray_mod = new double[50][varray.length]; 
        move(sarray,50,50,sarray_mod); 
        move(uarray,uarray.length,50,uarray_mod); 
        move(varray,50,varray.length,varray_mod); 
        e = new Matrix(uarray_mod); 
        f = new Matrix(sarray_mod);
        g = new Matrix(varray_mod);
        Matrix temp  =e.times(f); 
        result = temp.times(g);  

    }
    else 
    {
        Matrix temp = u.times(s); 
        result = temp.times(vtranspose); 
    }
    result = result.transpose(); 
    results = result.getArray() ; 

    return results ; 

しかし、どのように次元数を決定するのでしょうか? 最良の結果を得るためにシステムを縮小する次元数を決定する方法はありますか? LSA の効果的なパフォーマンスのために考慮すべきその他のパラメーターは何ですか?

4

1 に答える 1

19

次元数の選択に関して:

1) http://en.wikipedia.org/wiki/Latent_semantic_indexing :

LSI のもう 1 つの課題は、SVD の実行に使用する最適な次元数を決定するのが難しいと言われています。原則として、次元数が少ないほど、テキストのコレクションに含まれる概念をより幅広く比較できますが、次元数が多いほど、より具体的な (または関連性の高い) 概念の比較が可能になります。使用できる実際のディメンションの数は、コレクション内のドキュメントの数によって制限されます。調査によると、通常、中程度のサイズのドキュメント コレクション (数十万のドキュメント) では約 300 のディメンションが最良の結果をもたらし、より大きなドキュメント コレクション (数百万のドキュメント) ではおそらく 400 のディメンションが最適な結果を提供します。でも、

SVD を計算した後にデータの分散量を確認すると、保持する最適な次元数を決定できます。データに含まれる分散は、特異値 (S) をスクリー プロットにプロットすることで表示できます。一部の LSI 実践者は、保持する次元数のカットオフ ポイントとして、曲線の屈曲部に関連付けられた次元を選択します。他の人は、ある程度の分散を保持する必要があり、データの分散の量によって保持する適切な次元を決定する必要があると主張します。70% は、SVD を再計算するための最適な次元を選択するために使用する必要があるデータの分散量としてよく言及されます。



2) http://www.puffinwarellc.com/index.php/news-and-articles/articles/33-latent-semantic-analysis-tutorial.html?showall=1 :

SVD を使用する際の秘訣は、行列を近似するときに使用する次元または「概念」の数を把握することです。あまりにも少ない次元と重要なパターンが取り残され、多すぎると、ランダムな単語の選択によるノイズが忍び寄ります。SVD アルゴリズムは少し複雑ですが、幸いなことに、Python には簡単に使用できるライブラリ関数があります。以下の 1 行のメソッドを LSA クラスに追加することで、行列を 3 つの他の行列に因数分解できます。U 行列は「概念」空間での各単語の座標を示し、Vt 行列は「概念」空間での各文書の座標を示し、特異値の S 行列は次元数の手がかりを示します。または「概念」を含める必要があります。

def calc(self): self.U, self.S, self.Vt = svd(self.A)

使用する適切な次元数を選択するために、特異値の 2 乗のヒストグラムを作成できます。これは、各特異値が行列の近似に寄与する重要性をグラフ化します。この例のヒストグラムを次に示します。

ここに画像の説明を入力

ドキュメントの大規模なコレクションの場合、使用されるディメンションの数は 100 から 500 の範囲です。この小さな例では、グラフを作成したいので、3 次元を使用し、最初の次元を捨てて、2 番目と 3 番目の次元をグラフにします。

最初の次元を除外する理由は興味深いものです。ドキュメントの場合、最初の次元はドキュメントの長さと相関します。単語の場合、その単語がすべてのドキュメントで使用された回数と相関します。各列から平均列値を差し引いてマトリックスを中央に配置した場合は、最初の次元を使用します。例えとして、ゴルフのスコアを考えてみましょう。実際のスコアを知りたいのではなく、パーから引いた後のスコアを知りたいのです。これにより、プレーヤーがバーディー、ボギーなどを達成したかどうかがわかります。



3) Landauer, TK, Foltz, PW, Laham, D., (1998), 'Introduction to Latent Semantic Analysis', Discourse Processes, 25, 259-284:

ここに画像の説明を入力

于 2012-03-18T14:41:54.410 に答える