2016-06-27 5 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

Смежные вопросы