1

TfidfVectorizer 변환을 수행 한 후 메트릭으로 cosine_distances와 함께 DBSCAN을 사용하여 문자열 묶음을 클러스터하려고합니다. 두 개의 현이 있다고 해봅시다. 그것들 사이의 cosine_distance (sklearn.metrics.pairwise.cosine_distance를 사용하여 계산 됨)는 단지 두 개의 문자열 일 때 더 큰 데이터 세트 (다른 ​​많은 문자열이있는 경우)의 일부일 때의 거리와 다릅니다.두 문자열 사이의 sklearn cosine_distances는 전체 데이터 세트의 크기에 따라 다릅니다.

왜 이런 일이 발생하며 두 문자열 사이의 거리가 일부 데이터 세트의 크기와 관계없이 동일하게 유지되는 것을 어떻게 확인할 수 있습니까?

그런 식으로 내 DBSCAN은 클러스터링을 안정적으로 수행 할 수 있습니다!

편집 : 요청에 따라 추가 예제 코드 :

from sklearn.feature_extraction.text import TfidfVectorizer 
from sklearn.metrics.pairwise import cosine_distances 

X = [ 
    'this is a string', 
    'this was a string' 
    ] 

Y = [ 
    'this could be a string', 
    'this may be a string' 
    ] 

Z = [ 
    'this is a string', 
    'this was a string', 
    'this could be a string', 
    'this may be a string' 
    ] 

for d in [X, Y, Z]: 
    tv = TfidfVectorizer() 
    print(cosine_distances(tv.fit_transform(d))) 

출력 : 당신이 여기에서 볼 수 있듯이

[[ 0.   0.49689739] 
[ 0.49689739 0.  ]] 

[[ 0.   0.39702518] 
[ 0.39702518 0.  ]] 

[[ 0.   0.64740127 0.70225689 0.70225689] 
[ 0.64740127 0.   0.70225689 0.70225689] 
[ 0.70225689 0.70225689 0.   0.46163155] 
[ 0.70225689 0.70225689 0.46163155 0.  ]] 

, this is a stringthis was a string 사이의 거리가 데이터 세트 X에서 0.497이지만 0.647입니다 데이터 세트 Z. 문자열 this could be a stringthis may be a stringY 및 상기 예에서

Z 대한 동일 I는 DBSCAN의 최대 거리 (EPS) 파라미터는 다음 데이터 집합 X에서 0.6로 선택한 경우, 양쪽 캐릭터가 동일한 클러스터에 배치되며, 그러나 데이터 세트 Z에서는 다른 클러스터에 배치됩니다.

+0

목표를 더 명확하게 만들기 위해 예제/코드를 추가하십시오. – sera

답변

0

코사인 유사성은 긴 문서에 적합합니다.

짧은 문자열에는 충분한 단어가 없습니다.

거리가 바뀌는 이유는 TFIDF의 IDF 부분 때문입니다. 문서 주파수가 변경되면 거리가 변경되므로 역 문서 주파수 가중치를 선택했습니다.

+0

aw snap .. 맞습니다! 나는 그것이 왜 나에게 일어나지 않았는지 모르겠다. 이 경우 요구 사항을 처리하는 올바른 방법은 무엇입니까? 무엇을 사용해야합니까? – shikhanshu

+0

잘 모르겠습니다. 그것은 당신의 데이터와 당신이 풀어야 할 과제에 달려 있습니다. 당신의 데이터는 아마도'this is a string'이 아닙니다. –

+0

필자는 TfIdf 대신 CountVectorizer를 사용하여 문서 빈도에 영향을받지 않아야합니다. 그것에 대해 생각할 것입니다. 감사. – shikhanshu