【问题标题】:gensim: custom similarity measuregensim:自定义相似性度量
【发布时间】:2016-06-27 12:45:42
【问题描述】:

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

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

【问题讨论】:

    标签: python time similarity 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)]

    【讨论】:

    • 您的回答很有帮助,但有问题。这是 MatrixSimilarity 变体。对于缩放它应该基于相似度或 SparseMatrixSimilarity 类(否则:MemoryError)。
    猜你喜欢
    • 2015-10-10
    • 2015-12-27
    • 2019-03-02
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 2016-08-03
    • 2019-07-02
    相关资源
    最近更新 更多