2014-06-08 1 views
0

나는 scikit-learn의 Tfidf 변환기를 사용하여 "이상한"결과를 얻고 있습니다. 일반적으로, 저는 코퍼스의 모든 문서에서 idf가 0과 같음을 기대합니다 (아무런 평활화 또는 정규화를 사용하지 않음). 형식적으로는 문서의 수를 로그 할 것입니다. 코퍼스를 용어가 포함 된 문서 수로 나눈 것입니다. 분명히 (아래 그림과 같이) scikit-learn의 구현은 수동 구현과 비교하여 각 idf 값에 하나씩 추가합니다. 왜 아무도 알지 못해? 다시 말하지만, 평활화 및 정규화를 없음/거짓으로 설정했는지 확인하십시오.Scikit-learn TfidfTranformer가 잘못된 결과를 산출합니까?

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 값에 1을 더하는 것을 정당화 할 수있는 소스를 찾을 수 없었습니다. 저는 scikit-learn 버전 '0.14.1'을 사용하고 있습니다.

나는 scikit-learn보다 다른 솔루션이 그리 유용하지 않다. 그리드 검색을 위해 scikit-learn 파이프 라인을 만들어야하기 때문이다.

답변

3

이되어 있지 버그의 a feature

# 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 임)

관련 문제