MMR(Maximal Marginal Relevance)
date: 2023-05-25 excerpt: MMR(Maximal Marginal Relevance)について
MMR(Maximal Marginal Relevance)について
概要
- レコメンド時に単純な類似度(関連度)意外にも、レコメンドした内容同士の類似性を考慮する方法
定義
\[MMR = \lambda * 類似度(Query, Doc) - (1-\lambda) * \max(類似度(Doc, Docs_{already\_selected}))\]- 気持ちとしては関連度を考慮しつつ、すでに選択した内容と類似するのであればペナルティがペナルティがかかる内容
具体的な例
- Doc2Vecでベクトル化した文章を用いて、MMRを実装
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
def mmr(terms, doc, N=10, l=0.5):
term_embeddings = [get_embedding(term) for term in terms] # type: ignore
doc_embedding = get_embedding(doc) # type: ignore
doc_sim = cosine_similarity(term_embeddings, doc_embedding.reshape(1, -1))
term_sim_mat = cosine_similarity(term_embeddings)
# MMR
unselected = list(range(len(terms)))
select_idx = int(np.argmax(doc_sim))
selected = [select_idx]
unselected.remove(select_idx)
# other iterations
for _ in range(N - 1):
mmr_distance_to_doc = doc_sim[unselected, :]
mmr_distance_between_terms = np.max(term_sim_mat[unselected][:, selected], axis=1)
mmr = l * mmr_distance_to_doc - (1 - l) * mmr_distance_between_terms.reshape(-1, 1)
mmr_idx = unselected[np.argmax(mmr)]
selected.append(mmr_idx)
unselected.remove(mmr_idx)
return selected