283 votes

Comment calculer la similarité entre deux documents texte ?

Je cherche à travailler sur un projet NLP, dans n'importe quel langage de programmation (bien que Python soit ma préférence).

Je veux prendre deux documents et déterminer à quel point ils sont similaires.

1voto

Shamsa Points 67

Je combine les solutions des réponses de @FredFoo et @Renaud. Ma solution est capable d'appliquer le prétraitement de @Renaud sur le corpus de texte de @FredFoo et ensuite d'afficher les similarités par paires lorsque la similarité est supérieure à 0. J'ai exécuté ce code sous Windows en installant d'abord python et pip. pip est installé en tant que partie de python mais vous pouvez avoir à le faire explicitement en relançant le paquet d'installation, en choisissant modifier et ensuite choisir pip. J'utilise la ligne de commande pour exécuter mon code python enregistré dans un fichier "similarity.py". J'ai dû exécuter les commandes suivantes :

>set PYTHONPATH=%PYTHONPATH%;C:\_location_of_python_lib_
>python -m pip install sklearn
>python -m pip install nltk
>py similarity.py

Le code de similarity.py est le suivant :

from sklearn.feature_extraction.text import TfidfVectorizer
import nltk, string
import numpy as np
nltk.download('punkt') # if necessary...

stemmer = nltk.stem.porter.PorterStemmer()
remove_punctuation_map = dict((ord(char), None) for char in string.punctuation)

def stem_tokens(tokens):
    return [stemmer.stem(item) for item in tokens]

def normalize(text):
    return stem_tokens(nltk.word_tokenize(text.lower().translate(remove_punctuation_map)))

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

vect = TfidfVectorizer(tokenizer=normalize, stop_words='english')
tfidf = vect.fit_transform(corpus)   

pairwise_similarity = tfidf * tfidf.T

#view the pairwise similarities 
print(pairwise_similarity)

#check how a string is normalized
print(normalize("The scikit-learn docs are Orange and Blue"))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X