web-dev-qa-db-fra.com

Utilisation de la transformation TfidfVectorizer de Sklearn

J'essaie d'obtenir le vecteur tf-idf pour un seul document en utilisant l'objet TfidfVectorizer de Sklearn. Je crée un vocabulaire basé sur certains documents de formation et j'utilise fit_transform pour entraîner le TfidfVectorizer. Ensuite, je veux trouver les vecteurs tf-idf pour tout document de test donné.

from sklearn.feature_extraction.text import TfidfVectorizer

self.vocabulary = "a list of words I want to look for in the documents".split()
self.vect = TfidfVectorizer(sublinear_tf=True, max_df=0.5, analyzer='Word', 
                 stop_words='english')
self.vect.fit_transform(self.vocabulary)

...

doc = "some string I want to get tf-idf vector for"
tfidf = self.vect.transform(doc)

Le problème est que cela retourne une matrice avec n lignes où n est la taille de ma chaîne de doc. Je veux qu'il ne renvoie qu'un seul vecteur représentant le tf-idf pour la chaîne entière. Comment est-ce que je peux faire ceci voir la chaîne comme document simple, plutôt que chaque caractère étant un document? De plus, je suis très nouveau dans l'exploration de texte, donc si je fais quelque chose de mal sur le plan conceptuel, ce serait bien de le savoir. Toute aide est appréciée.

35
Sterling

Si vous souhaitez calculer tf-idf uniquement pour un vocabulaire donné, utilisez l'argument vocabulary pour le constructeur TfidfVectorizer,

vocabulary = "a list of words I want to look for in the documents".split()
vect = TfidfVectorizer(sublinear_tf=True, max_df=0.5, analyzer='Word', 
           stop_words='english', vocabulary=vocabulary)

Ensuite, pour ajuster, c'est-à-dire calculer le nombre, avec un corpus donné, c'est-à-dire un itérable de documents, utilisez fit:

vect.fit(corpus)

Méthode fit_transform est un raccourcissement pour

vect.fit(corpus)
corpus_tf_idf = vect.transform(corpus) 

Enfin, la méthode transform accepte un corpus, donc pour un seul document, vous devez le passer comme liste, ou il est traité comme itérable de symboles, chaque symbole étant un document.

doc_tfidf = vect.transform([doc])
45
alko