자연어처리/실습
MRC(기계독해) 실습 1 : JSON 데이터셋 불러오기 (Groom Competition)
아인슈페너먹고싶다
2022. 10. 6. 23:21
구름 자연어처리 과정 팀 미션 2번째 주제인 MRC를 시작했다.
확실히 단순하게 분류하여 Score만 측정했던 첫번째 주제보다 코드의 난이도부터 빡세서
어려웠다. 그래서 오늘 Baseline Code를 기반으로 JSON 데이터셋을 불러오는 연습을 해보았다.
필수 라이브러리를 후딱 설치해주고
1
2
3
4
|
from typing import List, Tuple, Dict, Any
import json
import random
|
cs |
먼저 JSON 데이터를 볼 수 있는 클래스를 만들었다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
class KoMRC:
def __init__(self, data, indices: List[Tuple[int, int, int]]):
self._data = data
self._indices = indices
# Json을 불러오는 메소드
@classmethod
def load(cls, file_path: str):
with open(file_path, 'r', encoding='utf-8') as fd:
data = json.load(fd)
indices = []
for d_id, document in enumerate(data['data']): #'data에서 document를 불러옴
for p_id, paragraph in enumerate(document['paragraphs']): #document에서 paragraph를 불러옴
for q_id, _ in enumerate(paragraph['qas']): #paragraph에서 qas를 불러옴
indices.append((d_id, p_id, q_id))
return cls(data, indices)
# 데이터 셋을 잘라내는 메소드
@classmethod
def split(cls, dataset, eval_ratio: float=.1, seed=42): #비율만큼 잘라내기
indices = list(dataset._indices)
random.seed(seed) #시드고정
random.shuffle(indices)
train_indices = indices[int(len(indices) * eval_ratio):] #앞에서부터
eval_indices = indices[:int(len(indices) * eval_ratio)] #뒤에서부터
return cls(dataset._data, train_indices), cls(dataset._data, eval_indices) #데이터 중복되지 ㅏㄶ음
def __getitem__(self, index: int) -> Dict[str, Any]:
d_id, p_id, q_id = self._indices[index]
paragraph = self._data['data'][d_id]['paragraphs'][p_id]
context = paragraph['context']
qa = paragraph['qas'][q_id]
guid = qa['guid']
question = qa['question']
answers = qa['answers']
return {
'guid': guid,
'context': context,
'question': question,
'answers': answers
}
def __len__(self) -> int:
return len(self._indices)
|
cs |
주어진 데이터는 data안에 title이 있고 title안에 paragraphs로 이루어져 있다.
그 paragraphs안에 context가 있고 또 context안에 qas가 있으며
마지막으로 qas안에 question과 answers, quid가 있다.
하지만 처리 과정에서는 context, question, answer만 사용하기에 title은 따로 불러오지 않는다.
클래스 내 정의한 메소드를 사용해서 train 데이터를 불러와봤다.
1
2
3
|
dataset = KoMRC.load('/content/drive/MyDrive/competitions/groom/MRC/train.json')
print("Samples 개수:", len(dataset))
print(dataset[1])
|
cs |
Samples 개수: 12037
{'guid': '67c85e4f86ae43939b807684537c909c', 'context': '부산시와 (재)부산정보산업진흥원(원장 이인숙)이 ‘2020~2021년 지역SW서비스사업화 지원사업’ 공모사업에 4개 과제가 선정되어 본격적인 사업 착수에 나선다. 과학기술정보통신부가 주관하는 ‘지역SW서비스사업화 지원사업’은 강소SW기업 및 초기 스타트업의 SW서비스 사업화 지원과 신시장 진출 지원을 통해 기업 경쟁력 강화와 지역경제 활성화를 도모하는 사업이다. 올해부터 2개년으로 진행되며, 국비와 시비, 민자 등 2년간 약 37억원의 예산이 투입된다. 앞서 진흥원은 부산의 미래 먹거리산업인 스마트해양, 지능형기계, 지능정보서비스 분야로 사전 수요조사를 진행했고, 평가를 통해 선정된 5개 과제를 공모사업에 신청했다. 그 결과 부산의 4개 과제가 최종 선정되는 쾌거를 거뒀다. 당 사업은 전국 진흥기관을 대상으로 공모를 시작해, 총 17개 지역에서 42개 과제가 선정되었으며, 4개 과제가 선정된 곳은 부산과 강원지역 뿐이다. 금번 선정된 과제들은 ‘인공지능융합센서와 서보 이송 로봇을 이용한 전단보강재의 자동용접시스템 개발’ 등 총 4개 과제다. 부산시가 지원하고, 부산정보산업진흥원과 지역기업, 대학, 연구소 등이 컨소시엄을 구성하여 기술개발 및 사업화 지원을 추진한다. 2개의 Track으로 구분되는 이번사업은 Track 1(SW중소기업)에서 ㈜에이아이플랫폼, 엔컴(주), Track 2(스타트업)에서는 ㈜토즈, 삼보테크놀로지를 지원한다. ○ ‘Track 1‘의 (주)에이아이플랫폼이 주관기업으로 진행하는 <인공지능 기반 망막 내 아밀로이드 플라크 영상 분석을 통한 치매조기진단 플랫폼 상용화>는 치매 확진의 원인이 되는 중요 단백질(아밀로이드 플라크)을 자체개발 관측장비로 진단한다. 이를 통해 치매를 조기 발견하여, 각종 경제적 비용과 치료 및 예방 등 사회적 문제를 해 결하고 시민들이 쉽게 접근 가능한 실효성 있는 치매관리체계 개발을 목표로 한다. ○ 엔컴(주)이 주관기업으로 참여하는 <AI영상분석 기반 가공철근 생산성 향상 시스템 기술개발 및 사업화>는 산업안전, 환경규제, 생산체계의 변화로 침체된 부산 핵심 산업인 철강업 활성화에 나선다. 실시간으로 절곡되어 나오는 가공철근의 형상을 인식하고 불량 형상 판단 시 적합한 교정 값을 절곡설비에 전달함으로써, 무중단 생산이 가능한 영상분석 기술과 생산설비 자동화 제어기술을 개발한다. ○ ‘Track 2’의 ㈜토즈는 자립기반이 약한 국내 중소형 조선소의 산업기술 변화에 혁신적인 대응을 위해 <가상현실 기반 원격 다자간 선박 및 해양구조물 사전 검사 시스템>을 개발한다. 선박 건조 前, 설계 단계에서 설계자 뿐만 아니라 생산관리자, 품질관리자, 선급검사관, 선주감독관 등의 이해관계자가 공동으로 가상의 환경에서 선박 및 해양구조물의 자재 배치와 간섭, 작업성, 설계 오작 등에 대한 검사를 진행할 수 있는 기술을 확보하여 조선소의 업무효율을 극대화 할 예정이다. ○ 삼보테크놀로지는 재래식 건설 부자재의 시공성, 안전성, 내구성 등의 문제점을 보완하여 시민 안전과 건설근로자의 환경개선, 생산성 및 수익성 향상을 위해 <인공지능융합센서와 새들형 토치 서보 이송 로봇을 이용한 고속 SRD 전단보강재 자동용접시스템>을 개발한다. 로봇응용 SRD 용접자동화 설비를 제작하고, 용접 모니터링 및 품질검사 소프트웨어를 개발하여 건설분야에 4차산업 대비 지능형 생산자동화 기반기술을 확보할 예정이다. (재)부산정보산업진흥원 이인숙 원장은 “이번 코로나19 사태로 인해 부산 기업들이 매출과 고용유지, 자재수급 등에 큰 타격을 입었지만, 지역SW서비스사업화 지원사업을 통해 지역과 기업차원에서 기반을 다지는 계기가 됐으면 좋겠다‘며 ”진흥원은 어려운 사태를 대비해 지역 기업들을 지원할 수 있는 다른 방편을 계속 모색 중이며, 더욱 성장해 나갈 수 있도록 적극 지원하겠다“고 전했다.', 'question': '지능형 생산자동화 기반기술을 개발중인 스타트업은?', 'answers': [{'text': '삼보테크놀로지', 'answer_start': 1422}]}
context, question, answers 모두 제대로 불러진 모습이다.
다음은 클래스 정의한 메소드를 사용하여 데이터셋을 train과 dev로 나누어주었다.
1
2
3
4
|
train_dataset, dev_dataset = KoMRC.split(dataset)
print("Train Samples 개수:", len(train_dataset))
print("Dev Samples 개수:", len(dev_dataset))
print(dev_dataset[1])
|
cs |
Train Samples 개수: 10834
Dev Samples 개수: 1203
{'guid': '31650c1dfb3a46c09c6600cfc31b1ec4', 'context': '정부가 저축은행의 수익성 확보를 위해 내년 2월부터 펀드와 보험, 신용카드 판매를 활성화하기로 했다. 또 지역 밀착형 서민금융회사라는 저축은행 본연의 기능을 강화하기 위해 비 수도권 저축은행의 지역 내 점포 확장 기준을 완화해주기로 했다.금융위원회는 17일 이 같은 내용을 골자로 한 ‘저축은행의 건전한 발전을 위한 정책방향’을 발표했다. 금융위는 우선 펀드판매와 할부금융 등 법적 근거가 필요한 업무는 세부 시행기준을 마련해 활성화하기로 했다. 저축은행의 펀드판매는 불완전판매가 최소화되도록 기준을 마련해 제한적으로 허용된다. 할부금융은 하위 법령이 정비되면 내년 2월부터 취급할 수 있게 된다. 보험과 신용카드는 저축은행중앙회가 카드·보험사와 계약 후 모든 저축은행에서 판매하는 방식으로 추진된다.금융위는 아울러 여신심사 능력을 갖춘 저축은행을 선별해 △정책금융공사의 온렌딩(중소기업 간접 지원)대출 △주택금융공사 보금자리론 △미소금융 등과 같은 서민과 중소기업 대상 정책자금도 취급할 수 있도록 할 방침이다.영업실적이나 대출모집인 활용도를 평가해 지역밀착형·관계형 영업을 충실히 수행하는 저축은행에 대해서는 영업구역 내 점포를 신설할 때 증자요건 등을 완화(수도권 제외)해 주기로 했다. 금융위는 또 저축은행이 체계적인 신용평가를 통해 금리를 적용하는 대신 높은 수준의 최고 금리를 적용하는 경우가 많다는 지적에 따라 신용평가시스템(CSS)을 개선하기로 했다. 자체 CSS가 있는 대형 저축은행의 경우 은행권 수준으로 시스템을 발전시키고, 자체 CSS 구축이 어려운 저축은행은 중앙회의 표준 CSS를 활용하도록 하는 방식이다.금융위는 다만 서민 대출이 늘어날 것으로 예상됨에 따라 소액신용대출 비중이 높은 저축은행의 관리·감독을 강화하고 개별 차주에 대한 신용공여 한도(법인 100억원)의 적정성을 재검토하는 등 건전성 관리에도 힘을 쏟을 방침이다.', 'question': '자체 신용평가시스템이 없는 저축은행은 어느 기관의 시스템을 따르는가?', 'answers': [{'text': '저축은행중앙회', 'answer_start': 345}, {'text': '중앙회', 'answer_start': 774}]}
비율에 맞게 잘 나누어진 모습이다.
실습 팀 미션의 아주 기초단계를 끝마쳤다.
사실 이 부분까지는 베이스라인 코드를 그대로 참고해도 되기에 한 번 복습해보았고
pre, post processing부터 modeling까지 해야할게 많다.
대학원 입시도 다가오는데 .... 바쁘다 바빠