2017-05-21 6 views
0

필자는 문서 집합 간의 유사성을 판단하려고 노력했으며, 사용하고있는 방법 중 하나는 TF-IDF 결과와의 코사인 유사도입니다.Sklearn과 gensim의 TF-IDF 구현

비슷한 결과를주는 sklearn과 gensim의 구현을 모두 사용해 보았지만 내 구현은 다른 매트릭스로 나타납니다.

을 분석 한 후, 나는 그들의 구현 내가 공부 한 사람에서 다른 것으로 나타났습니다 가로 질러 온 :

Sklearn 및 gensim가 TF로 원시 카운트를 사용하고, 그 결과 벡터에 L2 규범 을 적용합니다. 다른 측면에서

, 나는 용어 ​​수를 정상화 발견 구현, 내 질문은

TF = term count/sum of all term counts in the document 

처럼, 자신의 구현과 차이가 무엇인가? 클러스터링이나 다른 목적을 위해 더 나은 결과를 제공합니까?

EDIT (그래서 질문이 명확 해집니다.) 최종 결과를 정규화하는 것과 처음에 용어 개수를 정규화하는 것의 차이점은 무엇입니까?

답변

0

scikit이 배울으로 하나 l1, l2, 또는 nonenorm을 설정하여 TfidfTransformer()를 호출 할 때 원하는대로, 당신은 정상화를 설정할 수 있습니다.

none으로 시도하면 tf-idf 구현에 비슷한 결과가 나타날 수 있습니다.

정규화는 일반적으로 특정 tf-idf 가중치에서 문서 길이의 영향을 줄이기 위해 사용되므로 짧은 문서에 나타나는 단어는 훨씬 긴 문서에 나타나는 단어와 더 평등하게 취급됩니다.

+0

그래, 이미 구현을 점검했을 때 비슷한 결과가 나타났습니다. 나는 내 질문에 명시 적으로 생각하지 않았는데, 나는 두 가지 방법이 문서 길이에 대응하기 때문에 최종 결과를 정규화하는 것과 기본 빈도를 정규화하는 것의 차이점을 묻고 있었다. – msk

1

정규화가 용어 빈도에서 수행하는 대신 tf-idf 계산의 끝에서 수행되는 이유를 이해하게되었습니다.

주위를 검색 한 후 코사인 유사성 계산을 용이하게하기 위해 L2 정규화를 사용했음을 알았습니다.

대신 두 벡터 사이의 유사성을 얻기 위해 공식 dot(vector1, vector2)/(norm(vector1) * norm(vector2))을 사용 그래서, 우리는 fit_transform 기능에서 직접 결과를 사용할 수 있습니다 벡터에 대한 표준이 이미 1

때문에, 정상화 할 필요없이, tfidf * tfidf.T

용어 빈도에 정규화를 추가하려고했지만, 결국 전체 텍스트를 정규화 할 때 결국 동일한 결과가 나오기 때문에 시간 낭비가됩니다.