(第7回)リンクMRCとRetrieval
31238 ワード
1. Introduction to Open-domain Question Answering (ODQA)
Linking MRC and Retrieval: Open-domain Question Answering (ODQA)
History of ODQA
例えば、
Recent ODQA Research
2. Retriever-Reader Approach
検索-リーダメソッド
学習段階
Distant supervision
Inference
3. Issues and Recent Approaches
Different granularities of text at indexing time
Single-passage training vs Multi-passage training
Importance of each passage
リーダーの立場では、点数ではなくtop-kチャネルを受け入れることであり、最終結果にtop-k scoreを加算して合算として考えると、よく表現される場合もあります.
実習
Requirements
!pip install datasets==1.4.1 > /dev/null 2>&1 # execute command in silence
!pip install transformers==4.4.1 > /dev/null 2>&1
!pip install tqdm==4.41.1 > /dev/null 2>&1
import random
import numpy as np
from pprint import pprint
from datasets import load_dataset, load_metric
from sklearn.feature_extraction.text import TfidfVectorizer
!pip install datasets==1.4.1 > /dev/null 2>&1 # execute command in silence
!pip install transformers==4.4.1 > /dev/null 2>&1
!pip install tqdm==4.41.1 > /dev/null 2>&1
import random
import numpy as np
from pprint import pprint
from datasets import load_dataset, load_metric
from sklearn.feature_extraction.text import TfidfVectorizer
データのロードと評価指標
dataset = load_dataset("squad_kor_v1")
# metric = load_metric('squad')
Sparse Retrieverのインポート
corpus = list(set([example['context'] for example in dataset['train']]))
corpus.extend(list(set([example['context'] for example in dataset['validation']])))
tokenizer_func = lambda x: x.split(' ')
vectorizer = TfidfVectorizer(tokenizer=tokenizer_func, ngram_range=(1,2))
sp_matrix = vectorizer.fit_transform(corpus)
corpus = list(set([example['context'] for example in dataset['train']]))
corpus.extend(list(set([example['context'] for example in dataset['validation']])))
tokenizer_func = lambda x: x.split(' ')
vectorizer = TfidfVectorizer(tokenizer=tokenizer_func, ngram_range=(1,2))
sp_matrix = vectorizer.fit_transform(corpus)
テスト
""" 1. 정답이 있는 데이터셋으로 검색해보기 """
# random.seed(1)
# sample_idx = random.choice(range(len(dataset['train'])))
# query = dataset['train'][sample_idx]['question']
# ground_truth = dataset['train'][sample_idx]['context']
# answer = dataset['train'][sample_idx]['answers']
""" 2. 원하는 질문을 입력해보기 """
query = input("Enter any question: ") # "미국의 대통령은 누구인가?"
# query = "미국의 대통령은 누구인가?"
_, doc_id = get_relevant_doc(vectorizer, query, k=1)
""" 결과 확인 """
print("{} {} {}".format('*'*20, 'Result','*'*20))
print("[Search query]\n", query, "\n")
print(f"[Relevant Doc ID(Top 1 passage)]: {doc_id.item()}")
print(corpus[doc_id.item()])
# print(answer)
Enter any question: 에이핑크의 리더는 누구인가
******************** Result ********************
[Search query]
에이핑크의 리더는 누구인가
[Relevant Doc ID(Top 1 passage)]: 446
오바마는 어린 시절에 대하여 "아버지는 내 주변 사람들과 전혀 다르게 생겼다는 점 - 아버지는 피치처럼 시꺼멓고, 어머니는 우유처럼 하얗다 - 을 나는 개의치 않았다"라고 회상하였다. 그는 그의 투쟁을 자신의 다민족 혈통과 사회적 인식을 화해시키기 위한 어린 성년이라고 말하였다. 오바마는 호놀룰루에서 지낸 자신의 성장기를 반추하며, "하와이에서 얻는 기회 - 상호 존중의 분위기 속에서 다양한 문화를 경험한 것 - 는 내 세계관에서 중요한 부분이 되었으며, 내가 가장 아끼는 가치의 근간이 되었다"라고 썼다. 오바마는 또 십대 시절 알코올, 마리화나, 코카인을 복용한 사실에 대해 "나는 누구인가 하는 질문을 머리 속에서 잊으려" 했던 것이라고 밝혔다. 2008년 대통령 후보 공개 토론(Civil Forum on the Presidency)에서 오바마는 자신의 고등학교 시절 마약에 손 댄 일이 자신의 "최대의 도덕적 과오"라고 말하였다.
研修済みMRCモデルのインポート
import torch
from transformers import (
AutoConfig,
AutoModelForQuestionAnswering,
AutoTokenizer
)
model_name = 'sangrimlee/bert-base-multilingual-cased-korquad'
mrc_model = AutoModelForQuestionAnswering.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(
model_name,
use_fast=True
)
mrc_model = mrc_model.eval()
def get_answer_from_context(context, question, model, tokenizer):
encoded_dict = tokenizer.encode_plus(
question,
context,
truncation=True,
padding="max_length",
max_length=512,
)
non_padded_ids = encoded_dict["input_ids"][: encoded_dict["input_ids"].index(tokenizer.pad_token_id)]
full_text = tokenizer.decode(non_padded_ids)
inputs = {
'input_ids': torch.tensor([encoded_dict['input_ids']], dtype=torch.long),
'attention_mask': torch.tensor([encoded_dict['attention_mask']], dtype=torch.long),
'token_type_ids': torch.tensor([encoded_dict['token_type_ids']], dtype=torch.long)
}
outputs = model(**inputs)
start, end = torch.max(outputs.start_logits, axis=1).indices.item(), torch.max(outputs.end_logits, axis=1).indices.item()
answer = tokenizer.decode(encoded_dict['input_ids'][start:end+1])
return answer
context = corpus[doc_id.item()]
answer = get_answer_from_context(context, query, mrc_model, tokenizer)
print("{} {} {}".format('*'*20, 'Result','*'*20))
print("[Search query]\n", query, "\n")
print(f"[Relevant Doc ID(Top 1 passage)]: {doc_id.item()}")
pprint(corpus[doc_id.item()], compact=True)
print(f"[Answer Prediction from the model]: {answer}")
******************** Result ********************
[Search query]
에이핑크의 리더는 누구인가
[Relevant Doc ID(Top 1 passage)]: 446
('오바마는 어린 시절에 대하여 "아버지는 내 주변 사람들과 전혀 다르게 생겼다는 점 - 아버지는 피치처럼 시꺼멓고, 어머니는 우유처럼 '
'하얗다 - 을 나는 개의치 않았다"라고 회상하였다. 그는 그의 투쟁을 자신의 다민족 혈통과 사회적 인식을 화해시키기 위한 어린 성년이라고 '
'말하였다. 오바마는 호놀룰루에서 지낸 자신의 성장기를 반추하며, "하와이에서 얻는 기회 - 상호 존중의 분위기 속에서 다양한 문화를 '
'경험한 것 - 는 내 세계관에서 중요한 부분이 되었으며, 내가 가장 아끼는 가치의 근간이 되었다"라고 썼다. 오바마는 또 십대 시절 '
'알코올, 마리화나, 코카인을 복용한 사실에 대해 "나는 누구인가 하는 질문을 머리 속에서 잊으려" 했던 것이라고 밝혔다. 2008년 '
'대통령 후보 공개 토론(Civil Forum on the Presidency)에서 오바마는 자신의 고등학교 시절 마약에 손 댄 일이 '
'자신의 "최대의 도덕적 과오"라고 말하였다.')
[Answer Prediction from the model]: [CLS]
統合後のODQAシステムの構築
def open_domain_qa(query, corpus, vectorizer, model, tokenizer, k=1):
# 1. Retrieve k relevant docs by usign sparse matrix
_, doc_id = get_relevant_doc(vectorizer, query, k=1)
context = corpus[doc_id.item()]
# 2. Predict answer from given doc by using MRC model
answer = get_answer_from_context(context, query, mrc_model, tokenizer)
print("{} {} {}".format('*'*20, 'Result','*'*20))
print("[Search query]\n", query, "\n")
print(f"[Relevant Doc ID(Top 1 passage)]: {doc_id.item()}")
pprint(corpus[doc_id.item()], compact=True)
print(f"[Answer Prediction from the model]: {answer}")
query = input("Enter any question: ") # "미국의 대통령은 누구인가?"
open_domain_qa(query, corpus, vectorizer, mrc_model, tokenizer, k=1)
Enter any question: 미국의 마지막 대통령은 누구인가
******************** Result ********************
[Search query]
미국의 마지막 대통령은 누구인가
[Relevant Doc ID(Top 1 passage)]: 7859
('리오넬 조스팽 전 프랑스 총리는 "김 대통령은 나에게 살아가야 할 힘, 살아가야 할 도덕적 스승이자 길잡이다"라고 극찬했다. 요하네스 '
'라우 전 독일 대통령은 "김 대통령에 대한 존경심이 독일이 한국의 금융위기 때 한국을 돕는 동기가 됐다"라고 밝혔다. 빌 클린턴 전 미국 '
'대통령은 한미 정상 백악관 기자회견에서 대북정책에 대해 "김 대통령은 지금 한반도의 정세를 본질적으로 변화시키는 전주곡을 연주하고 '
'있습니다. 김 대통령의 일관된 비전과 강인한 의지는 이를 성공작으로 만들것이라 믿습니다. 그렇게 되면 국방예산을 줄여 사회복지를 늘릴 수 '
'있겠지요"라고 평가했다. 클린턴 전 대통령이 김대중에게 "나에게 1년이라는 시간만 더 있었다면 한반도의 명운이 달라졌을 것"이라며 '
'아쉬워했다고 밝혔다. 한종우 시러큐스 대학교 교수는 "김 전 대통령은 민주화에 가장 큰 공헌을 하셨고, IMF 경제위기를 극복하시고, '
'북한과의 교류를 탄탄대로에 올려놓으셨다"라고 평가했다.')
[Answer Prediction from the model]: 빌 클린턴
Reference
この問題について((第7回)リンクMRCとRetrieval), 我々は、より多くの情報をここで見つけました https://velog.io/@sangmandu/7강-Linking-MRC-and-Retrievalテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol