ホームページ  >  記事  >  バックエンド開発  >  TF-IDF とコサイン類似度を使用してテキスト ドキュメント間の類似性を計算するにはどうすればよいですか?

TF-IDF とコサイン類似度を使用してテキスト ドキュメント間の類似性を計算するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-23 06:47:02425ブラウズ

How to Calculate Similarity Between Text Documents Using TF-IDF and Cosine Similarity?

テキスト ドキュメントの類似性の計算方法

ペアごとの類似性の計算

2 つのテキスト ドキュメント間の類似性を判断する最も一般的な方法は、テキスト ドキュメントを次のように変換することです。 TF-IDF (Term Frequency-Inverse Document Frequency) ベクトルを計算し、コサイン類似度を使用してそれらを比較します。このアプローチは、情報検索に関する教科書で説明されており、「情報検索の概要」で詳しく説明されています。

Gensim や scikit-learn などの Python ライブラリは、TF-IDF 変換とコサイン類似度計算の実装を提供します。 scikit-learn を使用すると、次のコード スニペットでコサイン類似度の計算が実行されます。

<code class="python">from sklearn.feature_extraction.text import TfidfVectorizer

# Extract documents from text files
documents = [open(f).read() for f in text_files]

# Create a TF-IDF vectorizer
tfidf = TfidfVectorizer().fit_transform(documents)

# Calculate pairwise cosine similarity
pairwise_similarity = tfidf * tfidf.T</code>

プレーン テキスト ドキュメントの場合:

<code class="python">corpus = ["I'd like an apple", 
           "An apple a day keeps the doctor away", 
           "Never compare an apple to an orange", 
           "I prefer scikit-learn to Orange", 
           "The scikit-learn docs are Orange and Blue"]                                                                                                                                                                                                   

# Create a TF-IDF vectorizer with minimum frequency and exclusion of stop words
vect = TfidfVectorizer(min_df=1, stop_words="english")                                                                                                                                                                                                   

# Apply TF-IDF transformation
tfidf = vect.fit_transform(corpus)                                                                                                                                                                                                                       

# Calculate pairwise cosine similarity
pairwise_similarity = tfidf * tfidf.T </code>

結果の解釈

pairwise_similarity は各行と列がコーパス内のドキュメントを表すスパース行列。スパース行列を NumPy 配列に変換すると、各セルが 2 つの対応するドキュメント間の類似性を表していることがわかります。

たとえば、「scikit-learn ドキュメントはオレンジとブルーです」に最も類似したドキュメントを特定するには、次の場所を見つけます。コーパス内のインデックスを取得し、np.fill_diagonal():

<code class="python">import numpy as np

arr = pairwise_similarity.toarray()     
np.fill_diagonal(arr, np.nan)                                                                                                                                                                                                                            

input_doc = "The scikit-learn docs are Orange and Blue"                                                                                                                                                                                                  
input_idx = corpus.index(input_doc)                                                                                                                                                                                                                      
result_idx = np.nanargmax(arr[input_idx])                                                                                                                                                                                                                
print(corpus[result_idx])</code>

で対角線 (自己相似性を表す) をマスクした後、np.nanargmax を対応する行に適用します。大規模なデータセットの場合は、スパース行列はメモリを節約します。あるいは、pairwise_similarity.shape を使用して自己類似性と argmax() を直接マスクすることを検討してください。

<code class="python">n, _ = pairwise_similarity.shape                                                                                                                                                                                                                         
pairwise_similarity[np.arange(n), np.arange(n)] = -1.0
pairwise_similarity[input_idx].argmax()  </code>

以上がTF-IDF とコサイン類似度を使用してテキスト ドキュメント間の類似性を計算するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。