자연어처리

SQuAD를 사용한 BERT Transformers 자연어 처리 Q&A

coding art 2022. 6. 24. 19:34
728x90
참조: BERT Based Q&A System

 

 
Transformers 라이브러리를 사용하는 Q&A 문제를 다루어 보자. 인간은 항상 흥미로운 기사를 간단히 살펴봄으로써 내용을 파악하고 필요하다면 몇가지 간단한 질문을 떠 올릴 수 있다.
BERT 의 Transformers 라이브러리에 의한 즉 사전 학습된 모델 어떻게 학습되었는지 알아보자. 머신 러닝 모델 학습을 위해서는 다소 방대할 수도 있는 적절한 양의 데이터 세트가 필요하다. Q&A(질문과 답변) 모델을 개발하기 위해 미리 정의된 구절(passage: 여러개의 문장으로 구성된 단위)과 질문 세트에 대한 답변을 제시하기 위해 어느 정도 방대한 텍스트 모음을 사전에 학습 처리하였다. 그런 다음 이전에 볼 수 없었던 새로운 질문을 제시할 경우에도 만족스러운 답변을 제공하는 것으로 밝혀졌다.
학습에 사용된 데이터세트는 SQuAD(Stanford Question Answering Dataset)이며, 학습된 내용은 라이브러리 Transformers에 담겨졌다. 
BERT(Bidirectional Embedding Representations from Transformers), SQuAD 및 Hugging Face사의 Transformers 사용법에 이미 앞 블로그에서 괄호친 [MASK] 단어 예측 사례에서 요점을 간략하게 소개했으며, 이에 추가하여 어떤 임의로 제공되는 예문이 있을 경우 관련된 적절한 질문이 주어지면 예문으로부터 해답을 찾아내는 Q&A 과정을 Colab을 사용하여 코딩해 보자.

첫 단계에 transformers 라이브러리를 설치한다. 이로부터 Tokenizer와 QuestionAnswering을 불러들인다.

이하 작업들은 tensorflow 라이브러리와 연관하여 실행이 이루어진다.

모델명 설정을 살펴보면' ~squad' 를 확인할 수 있다. 이 모델 명을 사용하여 사전 학습되어 있는 Tokenizer 와 QuestionAnswering 을 준비한다. 즉 이미 사전 학습과 validation 평가가 이루어져 있으므로 새 데이터인 예문과 질문지를 사용하여 실행시키면 되는 것이다.

 

 

예문  source 와 질문지 question 을 준비한다. "r"은 raw data 를 의미하며 특수문자까지 포함한다.

 

예문과 질문을 분리마크 [SEP]를 사용 결합하고 엔코딩하여 토큰의 id 를 얻어낸다.

토큰의 id 를 텐서화 한 input_masked 를 준비하자. 토큰의 id 를 decoding 하면 id 별로 단어가 생성된다.

[SEP]을 기준으로 즉 토큰 id 값 기준  [102] 앞은 0으로 마스킨 하고 그 후는 1로 마스킹해서 token_ids 를 준비한다.

 

input_masked 텐서와 token_ids 텐서를 모델에 입력하여 output 을 얻어낸다.

튜플 텐서인 output으로부터 answer 의 시작위치값과 끝나는 위치 값을 확인한다.

input_ids 를 사용하여 예문과 질문 전체를 구성하는 토큰들 즉 input_token을 생성한다.

 

함수 process에 answer에 해당하는 input_token  상의 위치를 지정해 주면 얻어지는 낱낱의 토큰들을 합쳐(join) 해답을 출력하자. covid-19의 증상레 해당하는 열(fever), 기침(cough), 피로(fatigue), 호흡의 짧아짐 및 후각상실증이 정확하게 해답으로 체크되었다.
 
 
 

Under Construction ...