2016-09-11 17 views
1

두 개의 CSV 파일 - 기차 및 테스트, 각 18000 개의 리뷰가 있습니다. 기차 파일을 사용하여 피쳐 추출을하고 열차 파일의 각 검토와 테스트 파일의 각 검토 사이의 유사성 측정 항목을 계산해야합니다.TfidfVectorizer에서 코사인 유사성을 어떻게 계산합니까?

열차와 테스트 세트의 단어를 기반으로 어휘를 생성했습니다. 스톱 어는 제거했지만 오타와 줄기는 제거하지 않았습니다.

내가 직면 한 문제는 TfIdfVectorizer의 출력을 사용하여 기차와 테스트 데이터 간의 코사인 유사성을 생성하는 방법을 알지 못합니다.

vect = TfidfVectorizer(sublinear_tf=True, min_df=0.5,  vocabulary=vocabulary) 
X = vect.fit_transform(train_list) 
vocab = vect.get_feature_names() 
# train_matrix = X.todense() 
train_idf = vect.idf_ 
print vocab 
print X.todense() 

내가 X.todense()에서 얻을 출력은 단순히 X를 인쇄 할 경우, 보이는

[[ 0. 0. 0. ..., 0. 0. 0.] 
[ 0. 0. 0. ..., 0. 0. 0.] 
[ 0. 0. 0. ..., 0. 0. 0.] 
..., 
[ 0. 0. 0. ..., 0. 0. 0.] 
[ 0. 0. 0. ..., 0. 0. 0.] 
[ 0. 0. 0. ..., 0. 0. 0.]] 

입니다 :

vocabulary 내 기차 데이터를 맞는 코드입니다 like :

(0, 28137) 0.114440020953 
(0, 27547) 0.238913278498 
(0, 26519) 0.14777362826 
(0, 26297) 0.247716207254 
(0, 26118) 0.178776605168 
(0, 26032) 0.15139993147 
(0, 25771) 0.10334152493 
(0, 25559) 0.157584788446 
(0, 25542) 0.0909693864147 
(0, 25538) 0.179738937276 
(0, 21762) 0.112899547719 
(0, 21471) 0.159940534946 
(0, 21001) 0.0931693893501 
(0, 13960) 0.134069984961 
(0, 12535) 0.198190713402 
(0, 11918) 0.142570540903 
: : 
(18505, 18173) 0.237810781785 
(18505, 17418) 0.233931974117 
(18505, 17412) 0.129587180209 
(18505, 17017) 0.130917070234 
(18505, 17014) 0.137794139419 
(18505, 15943) 0.130040669343 
(18505, 15837) 0.0790013472346 
(18505, 11865) 0.158061557865 
(18505, 10896) 0.0708161593204 
(18505, 10698) 0.0846731116968 
(18505, 10516) 0.116681527108 
(18505, 8668) 0.122364898181 
(18505, 7956) 0.174450779875 
(18505, 1111) 0.191477939381 
(18505, 73) 0.257945257626 

출력 내용을 X.todense() 또는 X를 출력하는 방법을 모르겠다. 테스트와 트레인 세트 사이의 코사인 거리를 찾는 방법을 모르겠다 (아마도 pairwise 유사성을 사용 하는가? ? - http://scikit-learn.org/stable/modules/generated/sklearn.metrics.pairwise.pairwise_distances.html)

편집 :

내가 내 테스트 데이터에 대해 동일한 단계를 반복했다. 이제 두 개의 드문 드문 한 행렬 X와 Y가 scipy.sparse.csr.csr_matrix입니다.하지만 둘 다 희박하고 유형이 (doc, term) tf-idf이므로 직접 곱셈을 통해 X와 Y 사이의 코사인 유사성을 직접 얻을 수 없습니다.

X와 Y를 todense()으로 변환하면 MemoryError가 발생합니다. 즉, 비효율적입니다.

다음에해야 할 일은 무엇입니까?

치수 18000 * 18000 또는 희소 행렬의 페어 와이즈 코사인 유사점이있는 일종의 행렬을 가져야하지만 어떻게해야할지 모르겠다.

이것은 숙제를위한 것이며,이 단계에서 나를 읽는 sklearn 문서는 도움이되지 않습니다.

답변

1

거의 다 왔어. vect.fit_transform을 사용하면 document-term matrix.의 희소 표현을 반환합니다. 이는 교육 세트의 문서 용어 매트릭스 표현입니다. 그런 다음 동일한 모델로 테스트 세트를 변환해야합니다. 힌트 : test_listtransform 방법을 사용하십시오. metric='euclidean'이 전달되면 sklearn.metrics.pairwise.pairwise_distances(X, Y)XY에 대해 희소 매트릭스를 취하기 때문에 (즉, 원하는 측정 항목) 운이 좋았습니다. 여기에서해야 할 일이 꽤 간단해야합니다.

+0

감사합니다. 나는 거의 끝났다고 생각한다 - pairwise_distances는 처리가 많이 필요하고 시스템은 그것을 처리 할 수 ​​없다. – boltthrower

+0

pairwise_distances (X, Y)가 나에게 MemoryError를줍니다. 'File "/home/bt/amzreview/local/lib/python2.7/site-packages/scipy/sparse/base.py", 줄 1009, _process_toarray_args return np.zeros (self.shape, dtype = self. dtype, order = order)' – boltthrower

관련 문제