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