여전히 구름 baseline code를 활용해 실습을 했다.
지난번에 데이터를 불러왔는데 이번엔 이어서 토크나이징하는 것을 정리해 보았다.
1
2
|
! pip install konlpy "tweepy<4.0.0"
! /bin/bash <(curl -s https://raw.githubusercontent.com/konlpy/konlpy/master/scripts/mecab.sh)
|
cs |
먼저 파이썬 한국어 NLP처리기인 Konlpy와
형태소 분석기인 Mecab-korean을 설치해준다.
그 다음 토크나이징 class를 정해볼건데 앞서 만든 KoMRC라는 class를 상속해 작성하였다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class TokenizedKoMRC(KoMRC):
def __init__(self, data, indices: List[Tuple[int, int, int]]) -> None:
super().__init__(data, indices)
self._tagger = konlpy.tag.Mecab()
def _tokenize_with_position(self, sentence: str) -> List[Tuple[str, Tuple[int, int]]]:
position = 0
tokens = []
for morph in self._tagger.morphs(sentence): #형태소
position = sentence.find(morph, position) #형태소, 포지션
tokens.append((morph, (position, position + len(morph)))) #형태소, (start, end)
position += len(morph)
return tokens
|
cs |
(편의를 위해서 class 코드를 중간에 끊었는데 밑에 계속 이어지게 작성해주면 된다.)
그냥 Mecab을 써서 형태소 단위로 나눠준다면 공백을 고려하지 못하기에
공백을 포함한 위치를 인덱스로 저장하는 방식으로 진행했다.
그렇기 위해 tokens이라는 리스트를 생성한 뒤
위치를 포함한 정보를 position으로 정의하고
형태소, 해당 위치에 해당하는 시작과 끝으로 토큰을 저장하고 추가해주었다.
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
|
def __getitem__(self, index: int) -> Dict[str, Any]:
sample = super().__getitem__(index)
context, position = zip(*self._tokenize_with_position(sample['context']))
context, position = list(context), list(position)
question = self._tagger.morphs(sample['question'])
if sample['answers'] is not None: #정답찾기
answers = []
for answer in sample['answers']:
for start, (position_start, position_end) in enumerate(position):
if position_start <= answer['answer_start'] < position_end: #위치찾기
break #찾으면 깸
else:
print(context, answer)
raise ValueError("No mathced start position") #못찾았을경우
target = ''.join(answer['text'].split(' ')) #공백기준으로 합쳐줌
source = ''
for end, morph in enumerate(context[start:], start):
source += morph #end 토큰 찾기
if target in source:
break
else:
print(context, answer)
raise ValueError("No Matched end position")
answers.append({
'start': start,
'end': end
})
else:
answers = None
return {
'guid': sample['guid'],
'context_original': sample['context'],
'context_position': position,
'question_original': sample['question'],
'context': context,
'question': question,
'answers': answers
}
|
cs |
이제 정답을 찾는 함수를 구현해보았는데
일단 sample에서 answer가 있는 경우(trainning data)는 answer의 start position을 찾은 다음
해당 text를 공백을 포함해 합쳐준다.
그 다음 answer의 start를 찾았으니 end도 찾아준 다음
토큰기반으로 위치변환한 값을 append 해준다.
만약 sample answer가 없는경우는 none으로 그냥 놔두면 된다.
1
2
3
4
5
6
|
dataset = TokenizedKoMRC.load('/content/drive/MyDrive/competitions/groom/MRC/train.json')
train_dataset, dev_dataset = TokenizedKoMRC.split(dataset)
print("Number of Train Samples:", len(train_dataset))
print("Number of Dev Samples:", len(dev_dataset))
print(dev_dataset[1])
|
cs |
Number of Train Samples: 10834
Number of Dev Samples: 1203
{'guid': '31650c1dfb3a46c09c6600cfc31b1ec4',
'context_original': '정부가 저축은행의 수익성 확보를 위해 내년 2월부터 펀드와 보험, 신용카드 판매를 활성화하기로 했다. 또 지역 밀착형 서민금융회사라는 저축은행 본연의 기능을 강화하기 위해 비 수도권 저축은행의 지역 내 점포 확장 기준을 완화해주기로 했다.금융위원회는 17일 이 같은 내용을 골자로 한 ‘저축은행의 건전한 발전을 위한 정책방향’을 발표했다. 금융위는 우선 펀드판매와 할부금융 등 법적 근거가 필요한 업무는 세부 시행기준을 마련해 활성화하기로 했다. 저축은행의 펀드판매는 불완전판매가 최소화되도록 기준을 마련해 제한적으로 허용된다. 할부금융은 하위 법령이 정비되면 내년 2월부터 취급할 수 있게 된다. 보험과 신용카드는 저축은행중앙회가 카드·보험사와 계약 후 모든 저축은행에서 판매하는 방식으로 추진된다.금융위는 아울러 여신심사 능력을 갖춘 저축은행을 선별해 △정책금융공사의 온렌딩(중소기업 간접 지원)대출 △주택금융공사 보금자리론 △미소금융 등과 같은 서민과 중소기업 대상 정책자금도 취급할 수 있도록 할 방침이다.영업실적이나 대출모집인 활용도를 평가해 지역밀착형·관계형 영업을 충실히 수행하는 저축은행에 대해서는 영업구역 내 점포를 신설할 때 증자요건 등을 완화(수도권 제외)해 주기로 했다. 금융위는 또 저축은행이 체계적인 신용평가를 통해 금리를 적용하는 대신 높은 수준의 최고 금리를 적용하는 경우가 많다는 지적에 따라 신용평가시스템(CSS)을 개선하기로 했다. 자체 CSS가 있는 대형 저축은행의 경우 은행권 수준으로 시스템을 발전시키고, 자체 CSS 구축이 어려운 저축은행은 중앙회의 표준 CSS를 활용하도록 하는 방식이다.금융위는 다만 서민 대출이 늘어날 것으로 예상됨에 따라 소액신용대출 비중이 높은 저축은행의 관리·감독을 강화하고 개별 차주에 대한 신용공여 한도(법인 100억원)의 적정성을 재검토하는 등 건전성 관리에도 힘을 쏟을 방침이다.',
'context_position': [(0, 2), (2, 3), (4, 6), (6, 8), (8, 9), (10, 12), (12, 13), (14, 16), (16, 17), (18, 20), (21, 23), (24, 25), (25, 26), (26, 28), (29, 31), (31, 32), (33, 35), (35, 36), (37, 41), (42, 44), (44, 45), (46, 48), (48, 49), (49, 50), (50, 51), (51, 52), (53, 54), (54, 55), (55, 56), (57, 58), (59, 61), (62, 64), (64, 65), (66, 68), (68, 70), (70, 72), (72, 74), (75, 77), (77, 79), (80, 82), (82, 83), (84, 86), (86, 87), (88, 90), (90, 91), (91, 92), (93, 95), (96, 97), (98, 100), (100, 101), (102, 104), (104, 106), (106, 107), (108, 110), (111, 112), (113, 115), (116, 118), (119, 121), (121, 122), (123, 125), (125, 126), (126, 127), (127, 128), (128, 129), (130, 131), (131, 132), (132, 133), (133, 135), (135, 138), (138, 139), (140, 142), (142, 143), (144, 145), (146, 147), (147, 148), (149, 151), (151, 152), (153, 155), (155, 156), (157, 158), (159, 160), (160, 162), (162, 164), (164, 165), (166, 168), (168, 169), (170, 172), (172, 173), (174, 176), (177, 179), (179, 181), (181, 182), (182, 183), (184, 186), (186, 187), (187, 188), (188, 189), (190, 192), (192, 193), (193, 194), (195, 197), (198, 200), (200, 202), (202, 203), (204, 206), (206, 208), (209, 210), (211, 212), (212, 213), (214, 216), (216, 217), (218, 220), (220, 221), (222, 224), (224, 225), (226, 228), (229, 231), (231, 233), (233, 234), (235, 237), (237, 238), (239, 241), (241, 242), (242, 243), (243, 244), (244, 245), (246, 247), (247, 248), (248, 249), (250, 252), (252, 254), (254, 255), (256, 258), (258, 260), (260, 261), (262, 263), (263, 265), (265, 267), (267, 268), (269, 271), (271, 272), (272, 273), (273, 275), (276, 278), (278, 279), (280, 282), (282, 283), (284, 286), (286, 287), (287, 289), (290, 292), (292, 294), (294, 295), (296, 297), (297, 298), (298, 300), (300, 301), (302, 304), (305, 307), (307, 308), (309, 311), (311, 312), (312, 313), (314, 316), (317, 318), (318, 319), (319, 321), (322, 324), (324, 325), (326, 327), (328, 329), (329, 330), (331, 333), (333, 334), (335, 337), (337, 338), (339, 343), (343, 344), (345, 347), (347, 349), (349, 351), (351, 353), (354, 356), (356, 357), (357, 359), (359, 360), (360, 361), (362, 364), (365, 366), (367, 369), (370, 372), (372, 374), (374, 376), (377, 379), (379, 380), (380, 381), (382, 384), (384, 386), (387, 389), (389, 391), (391, 392), (392, 394), (394, 395), (395, 396), (397, 400), (401, 403), (403, 405), (406, 408), (408, 409), (410, 412), (413, 415), (415, 417), (417, 418), (419, 421), (421, 422), (423, 424), (424, 428), (428, 430), (430, 431), (432, 433), (433, 434), (434, 435), (435, 436), (436, 440), (441, 443), (444, 446), (446, 447), (447, 449), (450, 451), (451, 453), (453, 455), (455, 457), (458, 462), (462, 463), (464, 465), (465, 469), (470, 471), (471, 472), (473, 474), (474, 475), (476, 478), (478, 479), (480, 484), (485, 487), (488, 490), (490, 492), (492, 493), (494, 496), (496, 497), (498, 499), (500, 501), (501, 503), (504, 505), (506, 508), (508, 509), (509, 510), (510, 511), (511, 513), (513, 515), (515, 517), (518, 520), (520, 523), (524, 526), (526, 527), (527, 528), (529, 531), (531, 532), (533, 535), (535, 537), (537, 538), (538, 539), (539, 541), (541, 542), (543, 545), (545, 546), (547, 550), (551, 553), (553, 554), (554, 555), (556, 558), (558, 560), (560, 561), (562, 565), (565, 566), (567, 569), (569, 571), (572, 573), (574, 576), (576, 577), (578, 580), (580, 581), (582, 583), (584, 586), (586, 588), (589, 590), (590, 591), (592, 594), (594, 595), (595, 597), (597, 598), (599, 601), (601, 602), (602, 603), (604, 605), (605, 606), (606, 607), (608, 609), (609, 610), (610, 611), (612, 614), (614, 615), (615, 616), (617, 618), (619, 621), (621, 623), (623, 624), (625, 627), (627, 628), (628, 629), (630, 632), (632, 634), (634, 635), (636, 638), (639, 641), (641, 642), (643, 645), (645, 646), (646, 647), (648, 650), (651, 652), (652, 653), (654, 656), (656, 657), (658, 660), (661, 663), (663, 664), (665, 667), (667, 668), (668, 669), (670, 672), (672, 673), (674, 675), (675, 677), (678, 680), (680, 681), (682, 684), (685, 687), (687, 689), (689, 692), (692, 693), (693, 696), (696, 697), (697, 698), (699, 701), (701, 702), (702, 703), (703, 704), (705, 706), (706, 707), (707, 708), (709, 711), (712, 715), (715, 716), (717, 718), (718, 719), (720, 722), (723, 725), (725, 727), (727, 728), (729, 731), (732, 734), (734, 735), (736, 738), (738, 740), (741, 744), (744, 745), (746, 748), (748, 750), (750, 751), (751, 752), (753, 755), (756, 759), (760, 762), (762, 763), (764, 767), (768, 770), (770, 772), (772, 773), (774, 776), (776, 778), (779, 781), (782, 785), (785, 786), (787, 789), (789, 790), (790, 792), (793, 794), (794, 795), (796, 798), (798, 799), (799, 800), (800, 801), (801, 803), (803, 804), (804, 805), (806, 808), (809, 811), (812, 814), (814, 815), (816, 819), (820, 821), (821, 823), (824, 826), (826, 827), (827, 828), (829, 831), (832, 834), (834, 836), (836, 838), (839, 841), (841, 842), (843, 844), (844, 845), (846, 848), (848, 850), (850, 851), (852, 854), (854, 855), (855, 857), (857, 858), (859, 861), (861, 862), (862, 863), (864, 866), (867, 869), (869, 870), (871, 873), (874, 876), (876, 878), (879, 881), (881, 882), (882, 884), (885, 888), (888, 889), (889, 890), (890, 891), (891, 892), (893, 895), (895, 896), (896, 897), (898, 899), (899, 901), (901, 902), (902, 903), (904, 905), (906, 908), (908, 909), (910, 912), (912, 913), (913, 914), (915, 916), (916, 917), (918, 919), (919, 920), (921, 923), (923, 924), (924, 925), (925, 926)],
'question_original': '자체 신용평가시스템이 없는 저축은행은 어느 기관의 시스템을 따르는가?',
'context': ['정부', '가', '저축', '은행', '의', '수익', '성', '확보', '를', '위해', '내년', '2', '월', '부터', '펀드', '와', '보험', ',', '신용카드', '판매', '를', '활성', '화', '하', '기', '로', '했', '다', '.', '또', '지역', '밀착', '형', '서민', '금융', '회사', '라는', '저축', '은행', '본연', '의', '기능', '을', '강화', '하', '기', '위해', '비', '수도', '권', '저축', '은행', '의', '지역', '내', '점포', '확장', '기준', '을', '완화', '해', '주', '기', '로', '했', '다', '.', '금융', '위원회', '는', '17', '일', '이', '같', '은', '내용', '을', '골자', '로', '한', '‘', '저축', '은행', '의', '건전', '한', '발전', '을', '위한', '정책', '방향', '’', '을', '발표', '했', '다', '.', '금융', '위', '는', '우선', '펀드', '판매', '와', '할부', '금융', '등', '법', '적', '근거', '가', '필요', '한', '업무', '는', '세부', '시행', '기준', '을', '마련', '해', '활성', '화', '하', '기', '로', '했', '다', '.', '저축', '은행', '의', '펀드', '판매', '는', '불', '완전', '판매', '가', '최소', '화', '되', '도록', '기준', '을', '마련', '해', '제한', '적', '으로', '허용', '된다', '.', '할', '부', '금융', '은', '하위', '법령', '이', '정비', '되', '면', '내년', '2', '월', '부터', '취급', '할', '수', '있', '게', '된다', '.', '보험', '과', '신용카드', '는', '저축', '은행', '중앙', '회가', '카드', '·', '보험', '사', '와', '계약', '후', '모든', '저축', '은행', '에서', '판매', '하', '는', '방식', '으로', '추진', '된다', '.', '금융', '위', '는', '아울러', '여신', '심사', '능력', '을', '갖춘', '저축', '은행', '을', '선별', '해', '△', '정책금융', '공사', '의', '온', '렌', '딩', '(', '중소기업', '간접', '지원', ')', '대출', '△', '주택', '금융', '공사', '보금자리', '론', '△', '미소금융', '등', '과', '같', '은', '서민', '과', '중소기업', '대상', '정책', '자금', '도', '취급', '할', '수', '있', '도록', '할', '방침', '이', '다', '.', '영업', '실적', '이나', '대출', '모집인', '활용', '도', '를', '평가', '해', '지역', '밀착', '형', '·', '관계', '형', '영업', '을', '충실히', '수행', '하', '는', '저축', '은행', '에', '대해서', '는', '영업', '구역', '내', '점포', '를', '신설', '할', '때', '증자', '요건', '등', '을', '완화', '(', '수도', '권', '제외', ')', '해', '주', '기', '로', '했', '다', '.', '금융', '위', '는', '또', '저축', '은행', '이', '체계', '적', '인', '신용', '평가', '를', '통해', '금리', '를', '적용', '하', '는', '대신', '높', '은', '수준', '의', '최고', '금리', '를', '적용', '하', '는', '경우', '가', '많', '다는', '지적', '에', '따라', '신용', '평가', '시스템', '(', 'CSS', ')', '을', '개선', '하', '기', '로', '했', '다', '.', '자체', 'CSS', '가', '있', '는', '대형', '저축', '은행', '의', '경우', '은행', '권', '수준', '으로', '시스템', '을', '발전', '시키', '고', ',', '자체', 'CSS', '구축', '이', '어려운', '저축', '은행', '은', '중앙', '회의', '표준', 'CSS', '를', '활용', '하', '도록', '하', '는', '방식', '이', '다', '.', '금융', '위', '는', '다만', '서민', '대출', '이', '늘어날', '것', '으로', '예상', '됨', '에', '따라', '소액', '신용', '대출', '비중', '이', '높', '은', '저축', '은행', '의', '관리', '·', '감독', '을', '강화', '하', '고', '개별', '차주', '에', '대한', '신용', '공여', '한도', '(', '법인', '100', '억', '원', ')', '의', '적정', '성', '을', '재', '검토', '하', '는', '등', '건전', '성', '관리', '에', '도', '힘', '을', '쏟', '을', '방침', '이', '다', '.'], 'question': ['자체', '신용', '평가', '시스템', '이', '없', '는', '저축', '은행', '은', '어느', '기관', '의', '시스템', '을', '따르', '는가', '?'],
'answers': [{'start': 178, 'end': 181}, {'start': 388, 'end': 389}]}
어제 정의한 load 메서드로 데이터를 분류하고 토크나이징 한 후
answer의 위치를 찾았다.
이렇게 간단하게 토크나이징을 해 보았고 다음 번에도 구름 베이스라인을 토대로 간단하게 실습할 지는 모르겠다
베이스라인은 거의 활용안하고 당장 발표준비가 급해서 ㅠ
일단은 오늘은 끝!
'자연어처리 > 실습' 카테고리의 다른 글
한국 대중가요 가사 분석 프로젝트 (3) 장소 어휘 (0) | 2022.10.24 |
---|---|
한국 대중가요 가사 분석 프로젝트 (2) word cloud (0) | 2022.10.23 |
MRC(기계독해) 실습 1 : JSON 데이터셋 불러오기 (Groom Competition) (0) | 2022.10.06 |
구름 AI 자연어처리 team project bug search (0) | 2022.09.28 |
대화 텍스트로 감정 예측하기 대회 실습 (1) (0) | 2022.09.23 |
댓글