2016-06-27 8 views
6

gensim을 사용하여 문서 목록 내에서 유사성을 계산하고 싶습니다. 이 라이브러리는 내가 가지고있는 데이터의 양을 처리하는 데 우수합니다. 문서는 모두 타임 스탬프로 축소되었으며 함수를 비교하려면 time_similarity이 필요합니다. 그러나 gensim은 코사인 유사성을 사용합니다.gensim : 맞춤 유사성 측정

누군가가 이전에 이것을 시도했거나 다른 해결책이 있는지 궁금합니다.

답변

1

인터페이스 SimilarityABC에서 상속하면 가능합니다. 이 문서를 찾지 못했지만 Word Mover Distance similarity을 정의하기 전에 완료된 것처럼 보입니다. 여기에 일반적인 방법이 있습니다. 관심있는 유사성 척도에 특화하여보다 효율적으로 만들 수 있습니다.

import numpy 
from gensim import interfaces 

class CustomSimilarity(interfaces.SimilarityABC): 

    def __init__(self, corpus, custom_similarity, num_best=None, chunksize=256): 
     self.corpus = corpus 
     self.custom_similarity = custom_similarity 
     self.num_best = num_best 
     self.chunksize = chunksize 
     self.normalize = False 

    def get_similarities(self, query): 
     """ 
     **Do not use this function directly; use the self[query] syntax instead.** 
     """ 
     if isinstance(query, numpy.ndarray): 
      # Convert document indexes to actual documents. 
      query = [self.corpus[i] for i in query] 
     if not isinstance(query[0], list): 
      query = [query] 
     n_queries = len(query) 
     result = [] 
     for qidx in range(n_queries): 
      qresult = [self.custom_similarity(document, query[qidx]) for document in self.corpus] 
      qresult = numpy.array(qresult) 
      result.append(qresult) 
     if len(result) == 1: 
      # Only one query. 
      result = result[0] 
     else: 
      result = numpy.array(result) 
     return result 

사용자 정의 유사성을 구현하는 방법은 다음과 같습니다

def overlap_sim(doc1, doc2): 
    # similarity defined by the number of common words 
    return len(set(doc1) & set(doc2)) 
corpus = [['cat', 'dog'], ['cat', 'bird'], ['dog']] 
cs = CustomSimilarity(corpus, overlap_sim, num_best=2) 
print(cs[['bird', 'cat', 'frog']]) 

[(1, 2.0), (0, 1.0)]를 출력합니다.

+1

답변이 도움이되었지만 문제가 있습니다. 이것은 MatrixSimilarity 변형입니다. 이 크기를 조정하려면 Similarity 또는 SparseMatrixSimilarity 클래스를 기반으로해야합니다 (그렇지 않으면 : MemoryError). – Simon