반응형
최대 마진 관련성(Maximal Marginal Relevance, MMR)¶
- 정보 검색이나 문서 요약에서 사용되는 알고리즘으로, 문서의 관련성과 다양성을 동시에 고려하는 방법.
- 선택된 문서가 질의(query)에 얼마나 관련이 있는지(Relevance), 그리고 이미 선택된 문서들과 얼마나 다른지(Diversity)를 계산하여 최적의 문서를 선정.
- MMR 알고리즘은 질의에 대한 관련성이 높은 문서를 찾으면서도, 이미 선택된 문서들과는 상이한 내용을 가진 문서를 선호함으로써, 결과의 다양성을 보장함.
- 예를 들어 사용자가 주제에 대해 폭넓은 정보를 얻고자 할 때 유용하며, 모든 문서가 같은 내용을 반복하지 않도록 하는 데에 목적이 있음.
MMR 계산식¶
수식¶
In [1]:
# 단순 수식 이미지를 불러오는 코드입니다. mmr 내용과 관련 없으니 무시하세요
from PIL import Image
file_name = "mmr.png"
Image.open(file_name)
Out[1]:
수식 설명¶
- 은 최대 마진 관련성을 의미하며, 문서 집합 안의 각 문서 에 대해 다음과 같이 계산됩니다.
- 는 문서 와 질의 사이의 유사도를 측정합니다. 이 값은 문서가 질의와 얼마나 관련이 있는지를 나타냅니다.
- 는 문서 와 이미 선택된 문서 집합 내의 문서 사이의 유사도를 측정합니다. 이 값은 문서 간의 다양성을 나타냅니다.
- 는 0과 1 사이의 값으로, 관련성과 다양성 사이의 균형을 조절하는 매개변수입니다. 가 1에 가까울수록 관련성을 더 중요시하며, 0에 가까울수록 다양성을 더 중요시합니다.
- 는 아직 선택되지 않은 문서들의 집합입니다.
[참고] argmax 설명¶
argmax
는 주어진 함수를 최대로 만드는 입력값을 찾는 연산입니다. 예를 들어, 어떤 함수 가 있을 때, 는 가 최대가 되는 의 값을 찾습니다.- MMR 공식에서
argmax
는 집합 내의 모든 문서 에 대해 주어진 함수 의 값을 최대화하는 문서 를 찾는 것을 의미합니다.
MMR 코드 구현¶
벡터리스트
는 10개의 백터를 가지고 있습니다.기준백터
와 유사한 vector를백터리스트
에서 찾고자 합니다.
In [1]:
import numpy as np
np.random.seed(42)
백터리스트 = np.random.rand(10, 100)
기준백터 = np.random.rand(1, 100)
기준벡터
와벡터리스트
내 백터간 유사도를 계산하고 유사도 계산을 위해 사용한벡터리스트
내 백터와 다른 백터간 유사도의 최대값을 산출하기 위핸 cosine 유사도를 사용하며 이를 위한 코사인 유사도 계산함수를 정희한다.
In [2]:
def cosine_similarity(vecA, vecB):
return np.dot(vecA, vecB) / (np.linalg.norm(vecA) * np.linalg.norm(vecB))
lambda_val
는 자주 사용되는 0.5로 선언합니다.
In [3]:
lambda_val = 0.5
selected_docs
는 mmr 알고리즘 바탕으로 추천하는 vector의 인덱스를 담고 있습니다.
In [4]:
selected_docs = []
while len(selected_docs) < len(백터리스트):
mmr_scores = {}
for idx, doc_vector in enumerate(백터리스트):
if idx not in selected_docs:
doc_vector = doc_vector.reshape(1, 100)
# Sim_1(D_i, Q)
sim_with_query = cosine_similarity(doc_vector, 기준백터.T)
# Max(Sim_2(D_i, D_j)) -> 타 문서와 유사도가 너무 높은 문서는 선택될 확률을 떨어 뜨린다
max_sim_with_selected = max([cosine_similarity(doc_vector, 백터리스트[sel_idx]) for sel_idx in selected_docs] or [0])
mmr_score = lambda_val * sim_with_query - (1 - lambda_val) * max_sim_with_selected
mmr_scores[idx] = mmr_score
selected_doc = max(mmr_scores, key=mmr_scores.get)
selected_docs.append(selected_doc)
lambda_val
가 0.5 을 때 6 위치의 벡터값을 추천하고 다음으로 1, 9, 0, 3 순임을 확인할 수 있습니다.
In [5]:
selected_docs
Out[5]:
[6, 1, 9, 0, 3, 5, 2, 4, 8, 7]
반응형
'python' 카테고리의 다른 글
ERROR: Could not build wheels for greenlet, which is required to install pyproject.toml-based projects (0) | 2024.04.26 |
---|---|
AttributeError: 'ImageDraw' object has no attribute 'textsize' (0) | 2024.03.29 |
최대 마진 관련성(Maximal Marginal Relevance, MMR) (0) | 2024.03.26 |
ValueError: shapes (100,) and (1,100) not aligned: 100 (dim 0) != 1 (dim 0) (0) | 2024.03.23 |
파이썬으로 점점 늘어났다 줄어드는 숫자 랜덤하게 만들기 (0) | 2024.03.19 |
댓글