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