私はほぼ 1 年前にLSIとトピック モデリング を勉強しました。
これを行うにはさまざまな方法があり、成功の度合いもさまざまです。これは、情報検索の分野では難しい問題です。トピック モデリングを検索して、さまざまなオプションや最新技術について学ぶことができます。
単語が異なる形式で表示される可能性がある場合は、前処理と正規化が必要です。NLTK とそのステマーの 1 つについてはどうですか。
>>> from nltk.stem.lancaster import LancasterStemmer
>>> st = LancasterStemmer()
>>> st.stem('applied')
'apply'
>>> st.stem('applies')
'apply'
私が用語と呼ぶつもりの用語集とたくさんの文書があります。用語に関してドキュメントをランク付けするための非常に基本的な手法を探っていきます。読むことができるより洗練された方法は無数にありますが、あまりにも洗練されていて厳密なものを探していないのであれば、これで十分かもしれません.
これはベクトル空間 IR モデルと呼ばれます。用語とドキュメントは両方とも k 次元空間のベクトルに変換されます。そのためには、用語ごとのドキュメント マトリックスを作成する必要があります。これは、数値がドキュメント内の用語の頻度を表すサンプル マトリックスです。
ここまでで、各ドキュメントを 3 次元配列 (各列) で表現できる 3x4 マトリックスができました。しかし、項の数が増えるにつれて、これらの配列は大きくなりすぎて、ますますまばらになります。また、セマンティック コンテンツをあまり追加せずに、ほとんどのドキュメントに出現するI
orなどの単語が多数あります。and
したがって、これらのタイプの単語は無視することをお勧めします。大きさとまばらさの問題については、 SVDと呼ばれる数学的手法を使用して、行列に含まれる情報のほとんどを保持しながら行列を縮小できます。
また、上記のチャートで使用した数値は raw カウントです。もう 1 つの手法は、ブール値を使用することです。1 はドキュメント内の用語の存在、0 はゼロです。しかし、これらは単語の意味的重みが等しいと仮定しています。実際には、一般的な単語よりも珍しい単語の方が重みがあります。したがって、初期行列を編集する良い方法は、tf-idなどのランキング関数を使用して、各項に相対的な重みを割り当てることです。ここまでで重み付けされた単語ごとのドキュメント行列に SVD を適用した場合、k 次元のクエリ ベクトルを作成できます。これは単に単語の重みの配列です。クエリに同じ用語の複数のインスタンスが含まれている場合は、頻度と用語の重みの積が使用されます。
そこから何をする必要があるかは、やや単純です。コサイン類似度を分析することにより、クエリ ベクトルとドキュメント ベクトルを比較します。これが、クエリに対するドキュメントのランク付けの基礎となります。