Sto cercando di ottenere parole che sono distintive di determinati documenti che utilizzano la classe TfIDFVectorizer in scikit-learn. Crea una matrice tfidf con tutte le parole e i loro punteggi in tutti i documenti, ma poi sembra contare anche parole comuni. Questo è parte del codice sto correndo:In che modo il TFIDFVectorizer in scikit-learn dovrebbe funzionare?
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(contents)
feature_names = vectorizer.get_feature_names()
dense = tfidf_matrix.todense()
denselist = dense.tolist()
df = pd.DataFrame(denselist, columns=feature_names, index=characters)
s = pd.Series(df.loc['Adam'])
s[s > 0].sort_values(ascending=False)[:10]
Mi aspettavo questo per restituire un elenco di parole distintivi per il documento 'Adamo', ma ciò che lo fa restituire una lista di parole comuni:
and 0.497077
to 0.387147
the 0.316648
of 0.298724
in 0.186404
with 0.144583
his 0.140998
Potrei non capirlo perfettamente, ma a quanto ho capito, tf-idf dovrebbe trovare le parole che sono distintive di un documento in un corpus, trovando parole che appaiono frequentemente in un documento, ma non in altri documenti. Qui, and
appare frequentemente in altri documenti, quindi non so perché restituisca un valore alto qui.
Il codice completo che sto utilizzando per generare questo è in this Jupyter notebook.
Quando computo tf/idfs in modo semi-manuale, utilizzando il NLTK e calcolando i punteggi per ogni parola, ottengo i risultati appropriati. Per la 'Adam' documento:
fresh 0.000813
prime 0.000813
bone 0.000677
relate 0.000677
blame 0.000677
enough 0.000677
che sembra circa la destra, dal momento che queste sono parole che compaiono nel documento 'Adamo', ma non tanto in altri documenti del corpus. Il codice completo utilizzato per generare questo è in this Jupyter notebook.
Sto facendo qualcosa di sbagliato con il codice scikit? C'è un altro modo per inizializzare questa classe dove restituisce i risultati giusti? Ovviamente, posso ignorare le stopword passando lo stop_words = 'english'
, ma questo non risolve il problema, dal momento che parole comuni di qualsiasi tipo non dovrebbero avere punteggi alti qui.
TfidfTransformer trasformerà l'output di CountVectorizer, quindi è possibile eseguire CountVectorizer e quindi eseguire TfidfTransformer, ma è come eseguire TfidfVectorizer. Quindi non sono convinto di aver bisogno di TfidfTransformer, se prima dovrò comunque eseguire CountVectorizer. Non restituirà gli stessi risultati? – Jono