• home
  • about
  • 全ての投稿
  • ソフトウェア・ハードウェアの設定のまとめ
  • 分析関連のまとめ
  • ヘルスケア関連のまとめ
  • 生涯学習関連のまとめ

MMR(Maximal Marginal Relevance)

date: 2023-05-25 excerpt: MMR(Maximal Marginal Relevance)について

tag: レコメンドMMRMaximal 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

参考

  • github.com/yagays/embedrank


レコメンドMMRMaximal Marginal Relevance Share Tweet