[英]Scikit-learn TfidfTranformer yielding wrong results?
我正在使用scikit-learn的Tfidf變壓器獲得“怪異”的結果。 通常,我希望一個單詞出現在語料庫中的所有文檔中,其idf等於0(不使用任何平滑或規范化方法),因為我將使用的公式化工具是該文檔中文檔數的對數語料庫除以包含該術語的文檔數。 顯然(如下圖所示)與我的手動實現相比,scikit-learn的實現向每個idf值添加了一個。 有人知道為什么嗎? 同樣,請注意,我將平滑和歸一化設置為“無/錯誤”。
In [101]: from sklearn.feature_extraction.text import TfidfTransformer
In [102]: counts
Out[102]:
array([[3, 0, 1],
[2, 0, 0],
[3, 0, 0],
[4, 0, 0],
[3, 2, 0],
[3, 0, 2]])
In [103]: transformer = TfidfTransformer(norm=None, smooth_idf=False)
In [104]: transformer
Out[104]:
TfidfTransformer(norm=None, smooth_idf=False, sublinear_tf=False,
use_idf=True)
In [105]: tfidf = transformer.fit_transform(counts)
In [106]: tfidf.toarray()
Out[106]:
array([[ 3. , 0. , 2.09861229],
[ 2. , 0. , 0. ],
[ 3. , 0. , 0. ],
[ 4. , 0. , 0. ],
[ 3. , 5.58351894, 0. ],
[ 3. , 0. , 4.19722458]])
In [107]: transformer.idf_
Out[107]: array([ 1. , 2.79175947, 2.09861229])
In [108]: idf1 = np.log(6/6)
In [109]: idf1
Out[109]: 0.0
In [110]: idf2 = np.log(6/1)
In [111]: idf2
Out[111]: 1.791759469228055
In [112]: idf3 = np.log(6/2)
In [113]: idf3
Out[113]: 1.0986122886681098
我一直找不到能證明在idf值中添加一個的任何來源。 我正在使用scikit-learn版本“ 0.14.1”。
順便說一句,除了scikit-learn之外,另一種解決方案對我來說並不是真正有用,因為我需要為網格搜索構建一個scikit-learn管道。
這不是錯誤,它是一個功能
# log1p instead of log makes sure terms with zero idf don't get
# suppressed entirely
idf = np.log(float(n_samples) / df) + 1.0
此+1
(如評論中所述)用於使idf normalizator 變弱 ,否則,將完全刪除所有文檔中出現的元素(它們的idf = 0,所以整個tfidf = 0)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.