Python: tf-idf-cosinus: trouver de la ressemblance du document
J'ai suivi un tutoriel qui a été disponible à Partie 1 & Partie 2. Malheureusement, l'auteur n'avait pas le temps pour la section finale qui participent à l'aide de similarité cosinus de réellement trouver la distance entre deux documents. J'ai suivi les exemples dans l'article à l'aide du lien suivant de stackoverflow, inclus le code est-il mentionné dans le lien ci-dessus (juste pour rendre la vie plus facile)
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from nltk.corpus import stopwords
import numpy as np
import numpy.linalg as LA
train_set = ["The sky is blue.", "The sun is bright."] # Documents
test_set = ["The sun in the sky is bright."] # Query
stopWords = stopwords.words('english')
vectorizer = CountVectorizer(stop_words = stopWords)
#print vectorizer
transformer = TfidfTransformer()
#print transformer
trainVectorizerArray = vectorizer.fit_transform(train_set).toarray()
testVectorizerArray = vectorizer.transform(test_set).toarray()
print 'Fit Vectorizer to train set', trainVectorizerArray
print 'Transform Vectorizer to test set', testVectorizerArray
transformer.fit(trainVectorizerArray)
print
print transformer.transform(trainVectorizerArray).toarray()
transformer.fit(testVectorizerArray)
print
tfidf = transformer.transform(testVectorizerArray)
print tfidf.todense()
en conséquence le code ci-dessus, j'ai la matrice suivante
Fit Vectorizer to train set [[1 0 1 0]
[0 1 0 1]]
Transform Vectorizer to test set [[0 1 1 1]]
[[ 0.70710678 0. 0.70710678 0. ]
[ 0. 0.70710678 0. 0.70710678]]
[[ 0. 0.57735027 0.57735027 0.57735027]]
Je ne suis pas sûr de savoir comment utiliser cette sortie pour calculer la similarité cosinus, je sais comment mettre en œuvre similarité cosinus à l'égard de deux vecteurs de longueur similaire, mais ici, je ne suis pas sûr de savoir comment identifier les deux vecteurs.
- Pour chaque vecteur dans trainVectorizerArray, vous devez trouver le cosinus de similarité avec le vecteur dans testVectorizerArray.
- Merci, avec votre utile de le souligner, j'ai réussi à pensé à elle, dois-je la réponse?
- Mais j'ai petite question, actuall tf*idf calcul n'a que faire de cela, parce que je ne suis pas en utilisant les résultats définitifs qui est indiqué dans la matrice.
- Voici la 3ème partie de ce tutoriel vous devis qui répond à votre question dans les détails pyevolve.sourceforge.net/wordpress/?p=2497
- j'ai suivi le lien que vous avez fourni, mais que mes documents sont de plus il commence à lancer MemoryError Comment pouvons-nous résoudre ce problème?
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, si vous voulez extraire le comte de fonctionnalités et d'appliquer TF-IDF de la normalisation et de la ligne sage euclidienne de normalisation, vous pouvez le faire en une seule opération avec
TfidfVectorizer
:Maintenant à trouver le cosinus distances d'un document (par exemple, la première dans le jeu de données) et toutes les autres vous avez juste besoin de calculer le point des produits du premier vecteur avec tous les autres, comme le tfidf vecteurs sont déjà en ligne normalisée. Le scipy sparse matrix API est un peu bizarre (pas aussi souple comme dense à N dimensions des tableaux numpy). Pour obtenir le premier vecteur-vous besoin de couper les lignes de la matrice inverse pour obtenir un submatrix avec une seule ligne:
scikit-learn offre déjà deux à deux paramètres (un.k.un. les noyaux de l'apprentissage automatique langage) que de travail pour à la fois dense et reprī esentations vectorielles de collections. Dans ce cas, nous avons besoin d'un produit scalaire qui est également connu comme le linéaire du noyau:
Donc pour trouver le top 5 des documents connexes, nous pouvons utiliser
argsort
et négatif de la matrice de découpage (la plupart des documents sont plus hautes valeurs de similarité cosinus, donc à la fin de la triés indices de tableau):Le premier résultat est un test de cohérence: nous trouvons la requête de document de plus d'un document semblable, avec un score de similarité cosinus de 1, qui contient le texte suivant:
Le deuxième document similaire est une réponse qui cite le message d'origine a donc beaucoup de mots communs:
cosine_similarities = linear_kernel(tfidf, tfidf)
?Je sais que c'est un vieux post. mais j'ai essayé de le http://scikit-learn.sourceforge.net/stable/ paquet. voici mon code pour trouver le cosinus de similarité. La question est de savoir comment allez-vous calculer le cosinus de similarité avec ce paquet et voici mon code pour que
Ici supposons que la requête est le premier élément de train_set et doc1,doc2 et doc3 sont les documents que je veux rang avec l'aide de similarité cosinus. alors je peux utiliser ce code.
Aussi les tutoriels fournis dans la question a été très utile. Voici toutes les pièces pour la
partie je,partie II,partie III
la sortie sera comme suit :
ici 1 représente que la requête est mise en correspondance avec lui-même et les trois autres sont les scores correspondant à la requête avec les documents respectifs.
ValueError: Incompatible dimension for X and Y matrices: X.shape[1] == 1664 while Y.shape[1] == 2
Avec l'Aide de @excray commentaire, j'ai réussi à comprendre la réponse, Ce que nous devons faire est d'écrire une simple boucle for pour parcourir les deux tableaux qui représentent le train de données et des données de test.
Abord de mettre en œuvre un simple lambda fonction de tenir la formule du cosinus de calcul:
Et puis il suffit d'écrire une simple boucle for pour parcourir le vecteur, la logique est pour tous "Pour chaque vecteur dans trainVectorizerArray, vous devez trouver le cosinus de similarité avec le vecteur dans testVectorizerArray."
Voici le résultat:
transformer.fit
opérations ettfidf.todense()
? Vous avez obtenu vos valeurs de similarité à partir de la boucle et puis continuer à faire tfidf? Où est votre calculée valeur de cosinus est utilisée? Votre exemple est source de confusion.0.408
et0.816
, quelles sont ces valeurs?Laissez-moi vous donner un autre tutoriel écrit par moi. Il répond à votre question, mais rend également une explication des raisons pour lesquelles nous faisons certaines choses. J'ai également essayé de faire concis.
Si vous avez un
list_of_documents
qui est juste un tableau de chaînes de caractères et un autredocument
qui est juste une chaîne de caractères. Vous avez besoin de trouver un tel document à partir de lalist_of_documents
qui est le plus semblable àdocument
.Nous allons combiner:
documents = list_of_documents + [document]
Commençons avec dépendances. Il deviendra évident pourquoi nous utilisons chacun d'eux.
L'une des approches qui peuvent être utilise est un sac-de-mots approche, où nous traitons chaque mot dans le document indépendant des autres et il suffit de jeter tous ensemble dans le grand sac. D'un point de vue, il perd beaucoup d'informations (comme la façon dont les mots sont reliés), mais d'un autre point de vue, il rend le modèle simple.
En anglais et dans toute autre langue humaine, il y a beaucoup de "inutile" des mots comme 'a', 'la', 'en', qui sont si fréquentes qu'elles ne possèdent pas beaucoup de sens. Ils sont appelés stop paroles et c'est une bonne idée de les supprimer. Une autre chose qu'on peut remarquer, c'est que des mots comme 'analyser', 'analyseur', 'analyse' sont vraiment similaires. Ils ont une racine commune, et tous peuvent être convertis en un mot. Ce processus est appelé découlant et il existe différents outils de conjugaison, qui diffèrent dans la vitesse, l'agressivité et ainsi de suite. Nous avons donc transformer chacun des documents à la liste des tiges de mots sans mots vides. Nous avons également effacer tous les signes de ponctuation.
Alors, comment va ce sac de mots nous aider? Imaginez, nous avons 3 sacs:
[a, b, c]
,[a, c, a]
et[b, c, d]
. Vous pouvez les convertir en les vecteurs de la base[a, b, c, d]
. On se retrouve donc avec des vecteurs:[1, 1, 1, 0]
,[2, 0, 1, 0]
et[0, 1, 1, 1]
. La même chose est avec nos documents (uniquement les vecteurs seront façon de plus). Maintenant, nous voyons que nous avons retiré beaucoup de mots et à tiges autres aussi à diminuer les dimensions des vecteurs. Ici, il est intéressant d'observation. Plus les documents ont bien plus de positif que de plus en plus courte, c'est pourquoi il est agréable de normaliser le vecteur. Ceci est appelé terme de fréquence TF, les gens aussi utilisés plus d'informations sur la façon dont souvent le mot est utilisé dans d'autres documents - inverse document de la fréquence de TSAHAL. Ensemble, nous avons une métrique TF-IDF qui ont un couple de saveurs. Ceci peut être réalisé avec une seule ligne dans sklearn 🙂Fait vectorizer permet de faire beaucoup de choses comme la suppression des mots vides et de les mettre en minuscule. Je l'ai fait dans une étape distincte seulement parce que sklearn n'a pas non-anglais des mots vides, mais nltk a.
Nous avons donc tous les vecteurs calculés. La dernière étape est de trouver celle qui est la plus semblable à la précédente. Il existe différents moyens pour y parvenir, l'un d'eux est la distance Euclidienne qui n'est pas si grande pour la raison discuté ici. Une autre approche est similarité cosinus. Nous itération de tous les documents et le calcul de cosinus de similarité entre le document et la dernière:
Désormais minimum aurez des informations sur le meilleur du document et de son score.
Cela devrait vous aider.
et de sortie sera:
Voici une fonction qui compare vos données de test sur les données d'apprentissage, avec le Tf-Idf transformateur monté avec les données d'apprentissage. L'avantage est que vous pouvez rapidement pivot ou d'un groupe par trouver le n le plus proche des éléments, et que les calculs sont en bas de la matrice-sage.