2016-06-27 27 views
6

Utilizzando gensim, voglio calcolare la somiglianza all'interno di un elenco di documenti. Questa libreria è eccellente per gestire la quantità di dati che ho ottenuto. I documenti sono tutti ridotti a data e ora ho una funzione time_similarity per confrontarli. gensim tuttavia utilizza la somiglianza del coseno.gensim: misura di somiglianza personalizzata

Mi chiedo se qualcuno l'abbia già tentato prima o abbia una soluzione diversa.

risposta

1

È possibile farlo ereditando dall'interfaccia SimilarityABC. Non ho trovato alcuna documentazione per questo, ma sembra che sia stato fatto prima per definire Word Mover Distance similarity. Ecco un modo generico per farlo. Probabilmente puoi renderlo più efficiente specializzandoti sulla misura della somiglianza che ti interessa.

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 

Per implementare una similitudine personalizzato:

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

Questo uscite [(1, 2.0), (0, 1.0)].

+1

La tua risposta è di aiuto, ma ha un problema. Questa è la variante MatrixSimilarity. Per ridimensionare questo dovrebbe essere basato sulla classe Similarity o SparseMatrixSimilarity (altrimenti: MemoryError). – Simon

Problemi correlati