2016-06-27 26 views
6

Mit gensim möchte ich die Ähnlichkeit innerhalb einer Liste von Dokumenten zu berechnen. Diese Bibliothek ist hervorragend im Umgang mit den Datenmengen, die ich habe. Die Dokumente sind alle auf Zeitstempel reduziert und ich habe eine Funktion time_similarity, um sie zu vergleichen. gensim verwendet jedoch die Kosinusähnlichkeit.GENSIM: custom Ähnlichkeitsmaß

Ich frage mich, ob jemand vor diesem attemted hat oder hat eine andere Lösung.

Antwort

1

Es ist möglich, das von der Schnittstelle SimilarityABC durch Erben zu tun. Ich habe keine Dokumentation dafür gefunden, aber es sieht so aus, als ob es schon vorher Word Mover Distance similarity definiert wurde. Hier ist eine allgemeine Möglichkeit, dies zu tun. Sie können es wahrscheinlich effizienter machen, indem Sie sich auf das Ähnlichkeitsmaß konzentrieren, das Ihnen wichtig ist.

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 

Um eine benutzerdefinierte Ähnlichkeit zu implementieren:

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']]) 

Diese gibt [(1, 2.0), (0, 1.0)].

+1

Ihre Antwort ist zu helfen, hat aber ein Problem. Dies ist die MatrixSimilarity-Variante. Um dies zu skalieren, sollte es auf der Similarity- oder der SparseMatrixSimilarity-Klasse basieren (ansonsten: MemoryError). – Simon