È 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)]
.
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