Gensim:自定义相似度度量

6

使用gensim,我想计算文档列表中的相似度。这个库很擅长处理我拥有的大量数据。所有的文档都被简化成时间戳,并且我有一个time_similarity函数来比较它们。然而,gensim使用余弦相似度。

我想知道是否有人之前尝试过这个或者有不同的解决方案。

1个回答

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变量。为了进行缩放,它应该基于Similarity或SparseMatrixSimilarity类(否则:MemoryError)。 - Simon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接