web-dev-qa-db-ja.com

sklearnを使用して、ドキュメントとクエリの間のtf-idfコサイン類似度を計算するにはどうすればよいですか?

私の目標は、3つのクエリを入力し、5つのドキュメントのセットに最も類似しているクエリを見つけることです。

これまでのところ、tf-idfは次のことを行っています。

from sklearn.feature_extraction.text import TfidfVectorizer

def get_term_frequency_inverse_data_frequency(documents):
    allDocs = []
    for document in documents:
        allDocs.append(nlp.clean_tf_idf_text(document))
    vectorizer = TfidfVectorizer()
    matrix = vectorizer.fit_transform(allDocs)
    return matrix

def get_tf_idf_query_similarity(documents, query):
    tfidf = get_term_frequency_inverse_data_frequency(documents)

私が抱えている問題は、私がtf-idfドキュメントのコサイン類似度を見つけるために、クエリに対してどのような操作を実行しますか?

6
OultimoCoder

コサイン類似度は、ドキュメントを表すベクトル間の角度のコサインです。

_K(X, Y) = <X, Y> / (||X||*||Y||)
_

Tf-idf行列は、次元= noのスパース行列になります。ドキュメント数*いいえ。明確な言葉の。

マトリックス全体を印刷するには、todense()を使用できます

_print(tfidf.todense())
_

各行は、1つのドキュメントに対応するベクトル表現を表します。同様に、各列は、コーパス内の一意の単語のtf-idfスコアに対応しています。

ベクトルと他の任意のベクトルの間で、ペアごとの類似性はtf-idf行列から次のように計算できます。

_from sklearn.metrics.pairwise import cosine_similarity
cosine_similarity(reference_vector, tfidf_matrix) 
_

出力は、長さ= noの配列になります。参照ベクトルと各ドキュメントに対応するベクトルの間の類似性スコアを示すドキュメントの数。もちろん、参照ベクトルとそれ自体の間の類似性は1になります。全体的に、0と1の間の値になります。

最初と2番目のドキュメントの類似性を見つけるには、

_print(cosine_similarity(tfidf_matrix[0], tfidf_matrix[1]))

array([[0.36651513]])
_
1
Nihal Sangeeth

他の回答は非常に役に立ちましたが、クエリと変換してドキュメントと比較できるようになりませんでした。

クエリを変換するには、まずドキュメントマトリックスに適合させます。

queryTFIDF = TfidfVectorizer().fit(allDocs)

次に、それを行列の形に変換します。

queryTFIDF = queryTFIDF.transform([query])

そして、sklearn.metrics.pairwise.cosine_similarity関数を使用して、すべてのドキュメントと私のクエリ間のコサイン類似度を計算します

cosineSimilarities = cosine_similarity(queryTFIDF, docTFIDF).flatten()

Nihalのソリューションを使用していることに気付きましたが、クエリをドキュメントの1つとして入力し、それを他のドキュメントとの類似度を計算することができましたが、これが私にとって最も効果的でした。

完全なコードは次のようになります。

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

def get_tf_idf_query_similarity(documents, query):
    allDocs = []
    for document in documents:
        allDocs.append(nlp.clean_tf_idf_text(document))
    docTFIDF = TfidfVectorizer().fit_transform(allDocs)
    queryTFIDF = TfidfVectorizer().fit(allDocs)
    queryTFIDF = queryTFIDF.transform([query])

    cosineSimilarities = cosine_similarity(queryTFIDF, docTFIDF).flatten()
    return cosineSimilarities
1
OultimoCoder

Nihalが彼の応答に書いたように、またはsklearnからの最近傍アルゴリズムを使用できます。適切なメトリック(コサイン)を選択する必要があります

from sklearn.neighbors import NearestNeighbors
neigh = NearestNeighbors(n_neighbors=5, metric='cosine')
1
AdForte