2016-06-27 14 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の変形です。これをスケーリングするには、類似度またはSparseMatrixSimilarityクラスに基づいている必要があります(それ以外の場合はMemoryError)。 – Simon

関連する問題