2016-03-02 2 views
0

У меня есть вопрос о TfidfVectorizer от sklearn, когда он выполняет частоту слова в каждом документе.sklearn's TfidfVectorizer частота слова?

образец кода я увидел это:

>>> from sklearn.feature_extraction.text import TfidfVectorizer 

>>> corpus = [ 

>>>  'The dog ate a sandwich and I ate a sandwich', 
>>>  'The wizard transfigured a sandwich' 
>>> ] 

>>> vectorizer = TfidfVectorizer(stop_words='english') 

>>> print vectorizer.fit_transform(corpus).todense() 

[[ 0.75458397 0.37729199 0.53689271 0.   0.  ] 
[ 0.   0.   0.44943642 0.6316672 0.6316672 ]] 

мой вопрос: как интерпретировать числа в матрице? Я понимаю, что значение 0 означает, что слово i.e. wizard появляется 0 раз в первом документе, поэтому оно равно 0, но как интерпретировать номер 0.75458397? Является ли частота, в которой слово «ел» появилось в первом документе? Или частота слова «ела», которое происходит во всем корпусе?

ответ

0

TF-IDF (что означает «временная частота - обратная частота документа»), составляет , а не, что дает вам частоту выражения в его представлении.

TF-IDF дает высокие баллы для терминов, встречающихся в очень немногих документах, и низкие баллы за термины, встречающиеся во многих документах, поэтому его грубо говоря, показатель того, насколько дискриминационным является термин в данном документе. Взгляните на ресурс this, чтобы найти отличное описание TF-IDF и получить лучшее представление о том, что он делает.

Если вы хотите только подсчеты, вам нужно будет использовать CountVectorizer.

0

Я думаю, вы забываете, что TFIDF векторы, как правило, нормированы так, что они всегда имеют величину (длину или 2-норму) 1.

Таким образом, значение TFIDF 0.75 частота «съел» умноженное на частоту обратного документа «ate», затем , деленное на величину этого TF-IDF-вектора.

Здесь все грязные подробности (перейти к tfidf0 = для пуанта):

from sklearn.feature_extraction.text import TfidfVectorizer 
corpus = ["The dog ate a sandwich and I ate a sandwich", 
      "The wizard transfigured a sandwich"] 
vectorizer = TfidfVectorizer(stop_words='english') 
tfidfs = vectorizer.fit_transform(corpus) 


from collections import Counter 
import pandas as pd 

columns = [k for (v, k) in sorted((v, k) 
      for k, v in vectorizer.vocabulary_.items())] 
tfidfs = pd.DataFrame(tfidfs.todense(), 
         columns=columns) 
#  ate dog sandwich transfigured wizard 
#0 0.75 0.38  0.54   0.00 0.00 
#1 0.00 0.00  0.45   0.63 0.63 

df = (1/pd.DataFrame([vectorizer.idf_], columns=columns)) 
#  ate dog sandwich transfigured wizard 
#0 0.71 0.71  1.0   0.71 0.71 
corp = [txt.lower().split() for txt in corpus] 
corp = [[w for w in d if w in vectorizer.vocabulary_] for d in corp] 
tfs = pd.DataFrame([Counter(d) for d in corp]).fillna(0).astype(int) 
# ate dog sandwich transfigured wizard 
#0 2 1   2    0  0 
#1 0 0   1    1  1 

# The first document's TFIDF vector: 
tfidf0 = tfs.iloc[0] * (1./df) 
tfidf0 = tfidf0/pd.np.linalg.norm(tfidf0) 
#  ate  dog sandwich transfigured wizard 
#0 0.754584 0.377292 0.536893   0.0  0.0 

tfidf1 = tfs.iloc[1] * (1./df) 
tfidf1 = tfidf1/pd.np.linalg.norm(tfidf1) 
# ate dog sandwich transfigured wizard 
#0 0.0 0.0 0.449436  0.631667 0.631667 
Смежные вопросы