6
使用gensim
,我想計算文檔列表中的相似度。這個庫在處理我得到的數據量方面非常出色。這些文件全部縮減爲時間戳,並且我有一個功能time_similarity
來比較它們。然而,gensim
使用餘弦相似度。gensim:自定義相似性度量
我想知道是否有人曾經嘗試過或有過不同的解決方案。
使用gensim
,我想計算文檔列表中的相似度。這個庫在處理我得到的數據量方面非常出色。這些文件全部縮減爲時間戳,並且我有一個功能time_similarity
來比較它們。然而,gensim
使用餘弦相似度。gensim:自定義相似性度量
我想知道是否有人曾經嘗試過或有過不同的解決方案。
可以通過從接口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變體。爲了縮放,它應該基於Similarity或SparseMatrixSimilarity類(否則:MemoryError)。 – Simon