자연어처리
(14) DistilBERT를 활용한 MRC 실습
빠스무
2023. 8. 2. 00:40
728x90
1. MRC(Machine Reading Comprehension)
- 주어진 질문에 정확한 답변을 추출하는 자연어처리 작업
- 컴퓨터가 사람처럼 텍스트를 이해하고 추론하여 정보를 얻고 질문에 맞는 답변을 찾는 과정
!pip install -U transformers datasets scipy scikit-learn evaluate
import datasets
from datasets import load_dataset, ClassLabel
import random
import pandas as pd
from IPython.display import display, HTML
from transformers import AutoTokenizer, pipeline
raw_datasets = load_dataset('klue', 'mrc')
def show_rand_elements(dataset, num_examples = 10):
picks = []
for _ in range(num_examples):
pick = random.randint(0,len(dataset)-1)
while pick in picks:
pick = random.randint(0,len(dataset)-1)
picks.append(pick)
df = pd.DataFrame(dataset[picks])
for column, typ in dataset.features.items():
if isinstance(typ, ClassLabel):
df[column] = df[column].transform(lambda i: typ.names[i])
display(HTML(df.to_html()))
show_rand_elements(raw_datasets['train'])
raw_datasets['train'][0]
print('context: ',raw_datasets['train'][0]['context'])
print('question: ',raw_datasets['train'][0]['question'])
print('answers: ',raw_datasets['train'][0]['answers'])
print('context: ',raw_datasets['validation'][0]['context'])
print('question: ',raw_datasets['validation'][0]['question'])
print('answers: ',raw_datasets['validation'][0]['answers'])
tokenizer = AutoTokenizer.from_pretrained('bespin-global/klue-bert-base-mrc')
context = raw_datasets['train'][0]['context']
question = raw_datasets['train'][0]['question']
inputs = tokenizer(question, context)
tokenizer.decode(inputs['input_ids'])
inputs = tokenizer(
question,
context,
max_length = 100,
truncation = 'only_second',
stride = 50,
return_overflowing_tokens=True
)
for ids in inputs['input_ids']:
print(tokenizer.decode(ids))
inputs = tokenizer(
question,
context,
max_length = 100,
truncation = 'only_second',
stride = 10,
return_overflowing_tokens=True,
return_offsets_mapping=True
)
for ids in inputs['input_ids']:
print(tokenizer.decode(ids))
inputs.keys()
inputs['input_ids'][0][:10]
inputs['overflow_to_sample_mapping']
print(inputs['offset_mapping'])
question_answerer = pipeline('question-answering',model = 'domyoung/squad-test')
question_answerer(question = question, context = context)
context = '''
날카로운 포핸드와 자타공인 완벽한 백핸드를 가졌다. 예전에는 수준급 방어력을 앞세운 카운터펀처였으나 현재는 공수 밸런스를 갖춘 완벽한 올라운드 플레이어로 거듭났다.[30] 독보적인 리턴을 보유하고 있어 압도적이지 않은 서브로도 최고의 기량을 과시하는 중이다.[31] 플레이 스타일은 전형적인 어그레시브 베이스라이너로서 네트로 나오는 일은 드물며, 그래서 네트플레이에서 에러가 가끔 있는 편이다. 대신 수비력이 아주 좋아서 어지간한 볼은 전부 다 쳐낸다. 2014년 이후로는 더욱 더 강력해져서 전성기의 나달 수준, 혹은 그 이상의 방어력을 보여주고 있는 괴물 같은 선수.전성기 조코비치를 한마디로 요약하자면 코트를 가리지 않는 이상적인 베이스라이너(baseliner)라 할 수 있다. 민첩함과 유연함을 모두 갖춘만큼 엄청난 코트 커버리지를 자랑하며 통곡의 벽이 무엇인지 보여준다.[32] 나달이 클레이코트 수비의 정점이라면 하드코트 수비에선 조코비치가 그 위치에 있다. 랠리를 끝낼만한 상대의 훌륭한 샷을 기어코 쫓아가 받아내는 모습을 심심찮게 볼 수 있다. 왕년의 최고의 베이스라이너인 안드레 애거시의 완성형이라는 표현에 고개가 끄덕여진다.수비력이 뛰어난 선수지만 공격력이 약하다고 생각하면 큰 오산이다. 심리전이 엄청나게 좋아서 상대방의 빈 곳으로 공을 보내는 것에 능하며 기본적으로 뛰어난 포핸드를 가지고 있다. 그러나 조코비치 공격의 진면목은 완벽한 백핸드[33]에 있다. 상대방이 본인의 백핸드 쪽으로 리턴을 하면 백핸드를 상대의 빈 코스 또는 거의 한 손 백핸드에 가까운 각도로 보내는 장면이 나올 정도로 완벽한 백핸드를 가지고 있다. 역대급 코트 커버리지에 더해 이런 사기적인 스트로크를 가진 조코비치를 랠리 싸움에서 이기는 건 여간해선 힘들다.서비스 게임 당 에이스 개수 0.443개를 보면 알 수 있듯이, 조코비치의 서브는 위력만 놓고 보면 특별하다고 볼 수 없다. 실제로 남자 선수로서 평범하다면 평범할 수 있는 180km 후반에서 190km 중반 수준의 서브 속도를 가지고 있다. 하지만 에이스가 터지지 않아도 정확한 코스 선택으로 이후 이어지는 랠리에서 주도권을 가지고 가며, 뛰어난 세컨드 서브[34] 또한 가지고 있다.
'''
quetion = '서비스 게임 당 에이스 개수는?'
question_answerer(question = question, context = context)