[英]Understanding TfidfVectorizer output
我正在用簡單的示例測試TfidfVectorizer
,但我無法弄清楚結果。
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(min_df=1, stop_words="english")
tfidf = vect.fit_transform(corpus)
print(vect.get_feature_names())
print(tfidf.shape)
print(tfidf)
output:
['apple', 'away', 'blue', 'compare', 'day', 'docs', 'doctor', 'keeps', 'learn', 'like', 'orange', 'prefer', 'scikit']
(5, 13)
(0, 0) 0.5564505207186616
(0, 9) 0.830880748357988
...
我正在計算第一句話的tfidf
,我得到了不同的結果:
I'd like an apple
”)僅包含 2 個單詞(刪除停用詞后(根據vect.get_feature_names()
的打印(我們保留:“ like
”、“ apple
”)apple
這個詞在語料庫中出現了 3 次。like
這個詞在語料庫中出現了1次。所以:
tfidf("apple")
in document1 = 0.5 * 0.51082 = 0.255.= 0.5564tfidf("like")
in document1 = 0.5 * 1.60943 = 0.804.= 0.8308我錯過了什么?
你的計算有幾個問題。
首先,關於如何計算 TF 有多種約定(參見Wikipedia 條目); scikit-learn不使用文檔長度對其進行標准化。 從用戶指南:
[...] 術語頻率,術語在給定文檔中出現的次數 [...]
所以,在這里, TF("apple", Document_1) = 1
,而不是 0.5
其次,關於 IDF 定義 - 來自文檔:
如果
smooth_idf=True
(默認值),則將常數“1”添加到 idf 的分子和分母,就好像看到一個額外的文檔包含集合中的每個術語恰好一次,這可以防止零除法:idf(t) =日志 [ (1 + n) / (1 + df(t)) ] + 1。
所以,在這里我們將有
IDF ("apple") = ln(5+1/3+1) + 1 = 1.4054651081081644
因此
TF-IDF("apple") = 1 * 1.4054651081081644 = 1.4054651081081644
第三,使用默認設置norm='l2'
,會發生額外的標准化; 再次來自文檔:
當
norm='l2'
時,歸一化是“c”(余弦),當norm=None
時是“n”(無)。
從您的示例中明確刪除此額外的規范化,即
vect = TfidfVectorizer(min_df=1, stop_words="english", norm=None)
給'apple'
(0, 0) 1.4054651081081644
即已經手動計算
有關規范化在norm='l2'
(默認設置)時如何影響計算的詳細信息,請參閱用戶指南的Tf–idf 術語權重部分; 他們自己承認:
在 scikit-learn 的
TfidfTransformer
和TfidfVectorizer
中計算的 tf-idfs 與標准教科書符號略有不同
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.