Maison  >  Article  >  développement back-end  >  Comment calculer la similarité entre des documents texte à l'aide de TF-IDF et de la similarité cosinus ?

Comment calculer la similarité entre des documents texte à l'aide de TF-IDF et de la similarité cosinus ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-23 06:47:02363parcourir

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

Comment calculer la similarité d'un document texte

Calcul des similarités par paires

La méthode la plus courante pour déterminer la similarité entre deux documents texte consiste à les convertir en TF-IDF (Term Frequency-Inverse Document Frequency), puis utilisez la similarité cosinus pour les comparer. Cette approche est abordée dans les manuels sur la recherche d'informations et détaillée dans « Introduction à la recherche d'informations ».

Les bibliothèques Python comme Gensim et scikit-learn fournissent des implémentations de conversions TF-IDF et de calculs de similarité cosinus. Avec scikit-learn, l'extrait de code suivant effectue des calculs de similarité cosinus :

<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>

Alternativement, pour les documents en texte brut :

<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>

Interprétation des résultats

pairwise_similarity est une matrice clairsemée où chaque ligne et colonne représente un document dans le corpus. La conversion de la matrice clairsemée en tableau NumPy révèle que chaque cellule représente la similitude entre les deux documents correspondants.

Par exemple, pour déterminer le document le plus similaire à « Les documents scikit-learn sont Orange et Bleu », localisez son index dans le corpus puis appliquez np.nanargmax à la ligne correspondante après avoir masqué la diagonale (représentant l'autosimilarité) avec 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>

Notez que pour les grands ensembles de données, en utilisant un la matrice clairsemée conserve la mémoire. Vous pouvez également envisager d'utiliser pairwise_similarity.shape pour masquer directement l'autosimilarité et argmax() :

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn