Passage Retrieval
Open-domain Question Answering
대규모 문서 중 질문에 대한 답을 찾는 것
Passage Retrieval과 MRC를 이어 2단계로 만들 수 있음
Overview
Query와 Passage를 embedding한 뒤 유사도로 랭킹을 매기고, 유사도가 가장 높은 Passage 선택
Passage Embedding Space
Passage Embedding의 벡터 공간
벡터화 된 Passage를 이용해 Passage 간 유사도를 계산 가능
Sparse Embedding
Bag-of-Words (BoW)
단어 개수가 차원의 개수
구성 방법으로 n-gram 사용
특징
등장 단어가 많아질수록 차원이 증가
n-gram의 n이 커질수록 증가
term overlap을 정확하게 잡아내야 할 때 유용
의미가 비슷하나 다른 단어인 경우 비교 불가
TF-IDF 소개
TF : Term Frequency, 단어 등장 빈도
IDF : Inverse Document Frequency, 단어가 제공하는 정보량
TF (Term Frequency)
해당 문서 내 단어 등장 빈도
특정 단어 등장 횟수 / 전체 단어 개수
IDF (Inverse Document Frequency)
단어가 제공하는 정보의 양
DF (Document Frequency) : Term t가 등장한 document 개수
N : 총 document 개수
Combine TF & IDF
a, an, the 같이 다수 document에서 나오는 단어
TF는 높을 수 있지만 IDF가 0에 가까움
자주 등장하지 않는 고유명사 (e.g., 사람 이름, 지명)
TF-IDF를 이용해 유사도 구하기
계산한 문서 TF-IDF를 가지고 질의 TF-IDF 계산 후 가장 관련있는 문서 탐색
보통 두 TF-IDF 사이의 cosine 유사도로 계산
BM25
docs = [
'먹고 싶은 사과',
'먹고 싶은 바나나',
'길고 노란 바나나 바나나',
'저는 과일이 좋아요'
]
# 총 문서의 수
N = len(docs)
def tf(t, d):
return d.count(t)
def idf(t):
df = 0
for doc in docs:
df += t in doc
return log(N/(df+1))
def tfidf(t, d):
return tf(t,d)* idf(t)
TF-IDF 계산
from sklearn.feature_extraction.text import TfidfVectorizer
tokenizer_func = lambda x: x.split(' ')
vectorizer = TfidfVectorizer(tokenizer=tokenizer_func, ngram_range=(1,2))
ngram_range=(1, 2)
uni-gram과 bi-gram 모두 포함Query를 TF-IDF 벡터로 변환
query_vec = vectorizer.transform([query])
변환된 query vector을 document들의 vector와 dot product 수행
result = query_vec * sp_matrix.T
Top-3개 passage retrieve
sorted_result = np.argsort(-result.data)
doc_scores = result.data[sorted_result]
doc_ids = result.indices[sorted_result]
doc_scores[:3], doc_ids[:3]
※ 모든 이미지 및 코드 출처는 네이버 커넥트재단 부스트캠프 AI Tech 5기입니다. ※