한국어 코퍼스
Pre-train 모델의 성능은 데이터의 양질에 완전히 의존한다. 한국어는 영어만큼 많은 코퍼스가 존재하지 않지만, 점점 늘어나는 추세이다. 아래는 내가 찾고 직접 다운 받아서 살펴본 코퍼스 리스트:
- KAIST Corpus: Raw 코퍼스를 각 분야 별로 다운 받을 수 있고, Eng-Chinese-Japanese Parallel Corpus도 다운 받을 수 있음. DOWN을 누르고 메일 주소와 소속만 기재하면 바로 다운 받을 수 있는 링크가 전송된다.
- 국립국어원 모두의 말뭉치: 국립국어원에서 2020년도에 공개한 따끈따끈한 코퍼스. 소속과 목적을 간단하게 써서 신청하면 코퍼스를 다운 받을 수 있다. 코퍼스 목록은 구문 분석 말뭉치, 문법성 말뭉치, 문서 요약 말뭉치 등 주로 Task로 나눠져있다. 근데 이 task를 사용해서 모델 평가를 하는 건 아직 못 봤고 주로 학습에 사용하는 것 같다. 깨끗한 데이터이기 때문에 전처리가 비교적 쉬운 것이 가장 큰 장점인 거 같다. (최근 “이루다” 챗봇 논란으로 메신저 말뭉치는 다운 받을 수 없다…)
- 나무위키: 나무위키의 덤프 데이터를 바탕을 제작한 wikitext 형식의 텍스트 파일입니다. 학습 및 평가를 위하여 위키페이지 별로 train (99%), dev (0.5%), test (0.5%) 로 나뉘어져있습니다.
- 세종 말뭉치: 쉽게 세종 말뭉치를 다운 받을 수 있는 깃헙으로 링크를 해두었다. 데이터 양도 많지 않고 깨끗하지 않기 때문에 사용할까 말까 고민되는 말뭉치…
- HANTEC 2.0: 1998년부터 2003년까지 한국과학기술정보연구원과 충남대학교가 공동으로 개발한 정보검색시스템 평가를 위한 한글 테스트 컬렉션.
- OSCAR: CommonCrawl 코퍼스를 언어별로 필터링해서 정리해 놓은 사이트. 한국어 데이터가 약 12GB 되는데 깨끗한 데이터는 아님
위에 나온 한국어 코퍼스 외에도 다양한 말뭉치가 존재한다.
Korpora
최근에 한국어 코퍼스 데이터를 모아서 쉽게 다운 받을 수 있도록 모듈 Korpora: Korean Corpora Archives이 생겼다. 일부 데이터는 이 모듈을 사용해서 다운로드 받았다. 사용하기도 편리하고 파이썬에서 바로 nltk 모듈과 같이 데이터셋을 불러올 수 있어서 편리하게 사용할 수 있다. 나는 terminal에서 다운 받아서 잘 되는지는 모르겠지만… 어쨋든 한국어 코퍼스 쉽게 다운 받고 싶다면 꼭 한 번 참고할만한 패키지! 앞으로 더 많은 데이터셋이 추가되었으면 좋겠다.
전-전처리
본격적인 데이터 전처리를 하기 전에 전처리 준비를 해야된다. 참고로 나는 Mac OS를 사용하고 있다.
무슨 말이냐면, 데이터가 아주 깨끗하게 한줄에 한 문장 씩 딱 나와있으면 좋겠지만 그런 경우는 드물고 encoding을 변경해야되는 경우도 있다. 그래서 전-전처리가 필요하다. 데이터를 전처리할 수 있도록 데이터를 가공해주는 것이다. 크게 보면 아래 세 가지 작업으로 나눌 수 있다:
- 필요한 text만 파일에서 추출
- 한 파일에 모든 문서 이어서 저장
- 인코딩 변환 (필요하면)
–
kaist corpus
를 보면서 설명해보자.
kaist-raw-corpus
는 압축을 풀면 아래와 같이 폴더별로 데이터가 정리되어 있다.
academic/ generality/ law/ literature/ mass-media/ religion/ textbook/ utility/
literature
폴더에 들어가보면 또 폴더별로 정리가 되어있다:
autobiography/ biography/ criticism/ diary/ essay/ juvenileAndfable/ novel/ poem/ theatre/
biography
폴더를 보면, 그제서야 .txt
파일이 나온다:
kaistcorpus_written_raw_or_literature_biography_mh2-0048.txt kaistcorpus_written_raw_or_literature_biography_mh2-0749.txt
kaistcorpus_written_raw_or_literature_biography_mh2-0264.txt kaistcorpus_written_raw_or_literature_biography_mh2-0916.txt
kaistcorpus_written_raw_or_literature_biography_mh2-0316.txt kaistcorpus_written_raw_or_literature_biography_mh2-0917.txt
kaistcorpus_written_raw_or_literature_biography_mh2-0320.txt kaistcorpus_written_raw_or_literature_biography_mh2-1005.txt
kaistcorpus_written_raw_or_literature_biography_mh2-0340.txt kaistcorpus_written_raw_or_literature_biography_mh2-1011.txt
kaistcorpus_written_raw_or_literature_biography_mh2-0392.txt kaistcorpus_written_raw_or_literature_biography_mh2-1053.txt
kaistcorpus_written_raw_or_literature_biography_mh2-0479.txt kaistcorpus_written_raw_or_literature_biography_mh2-1155.txt
kaistcorpus_written_raw_or_literature_biography_mh2-0488.txt kaistcorpus_written_raw_or_literature_biography_mh2-1480.txt
kaistcorpus_written_raw_or_literature_biography_mh2-0511.txt kaistcorpus_written_raw_tr_literature_biography_mh2-0122.txt
kaistcorpus_written_raw_or_literature_biography_mh2-0524.txt kaistcorpus_written_raw_tr_literature_biography_mh2-0217.txt
kaistcorpus_written_raw_or_literature_biography_mh2-0736.txt kaistcorpus_written_raw_tr_literature_biography_mh2-1489.txt
이 중에 아무거나 한 번 열어보면:
<language> Korean </language>
<textcode> KSC-5601-1988 </textcode>
<process> raw </process>
<version> 2001(tr)</version>
<filename> kaistcorpus_written_raw_tr_literature_biography_mh2-1489.txt </filename>
<title> ¼Õ¹® ÆòÀü </title>
<author> ½ÃÇÁ¸° Àú ; ¹ÎµÎ±â ¿ª</author>
<date> 1990 </date>
<publisher> Áö½Ä»ê¾÷»ç </publisher>
<kdc> 819</kdc>
<tdmsfiletext>
Á¦ 1Àå Á÷¾÷Àû Çõ¸í°¡ÀÇ Åº»ý
¼Õ¹®(áÝÙþ)Àº Áß±¹ µ¿³²ºÎ ÇؾÈÀÇ ±¤µ¿¼º(ÎÆÔÔàý)ÁÖ°(ñÁË°)»ï°¢ÁÖ¿¡ À§Ä¡ÇÑ Çâ»êÇö(úÅߣúã)ÃëÇüÃÌ(ö¨úûõ½)¿¡¼ 1866³â 11¿ù 12ÀÏ¿¡ ž´Ù. ÀÌ°÷Àº ±× »ý¾Ö¿Í ¾ß¸ÁÀÌ ¼±¸¿Í ³Ê¹«³ª ¹ÐÁ¢ÇÏ°Ô ¿¬°üµÇ°Ô µÉ ¿î¸íÀ̾ú´ø »ç¶÷¿¡°Ô´Â ÀûÀýÇÑ Ãâ»ý±â¿´´Ù. ¼ºµµ(àýÔ´)±¤ÁÖ(ÎÃñ¶)·ÎºÎÅÍ ÆÛÁ®³ª°¡´Â Àα¸°¡ Á¶¹ÐÇÑ »ï°¢ÁÖ´Â Áß±¹°ú ¼±¸ ÇؾçÁ¦±¹(ð³ÏÐ)°£ÀÇ °¡Àå ¿À·¡µÈ ¿¬°èÁ¡À̾ú´Ù. 1517³â Æ÷¸£Åõ°¥ÀÎÀÌ µµÂøÇÑ ÀÌÈÄ ±¤ÁÖ´Â ¼±¸¿ÍÀÇ ±³¿ªÀ» À§ÇÑ °¡Àå Áß¿äÇÑ Ç×±¸°¡ µÇ¾úÀ¸¸ç, 18¼¼±â Áß¿±ºÎÅÍ ¾ÆÆíÀüÀï±îÁö °ÅÀÇ 1¹é ³â µ¿¾È ¿©ÀüÈ÷ Áß±¹ ÇؾÈÀÇ À¯ÀÏÇÑ ÇÕ¹ýÀûÀÎ ÃâÀÔÁöÁ¡À¸·Î ³²¾Æ ÀÖ¾ú´Ù.
...
이렇게 나타난다.
이럴 땐 파이썬으로 끄적끄적 뭘 하려고 고생하는 것 보다 linux command를 사용하면 편하다.
아래 command는 폴더에 있는 모든 파일을 utf-8
로 인코딩을 해주고 concat해서 지정한 경로 (path/directory
)에 저장을 해준다.
iconv -c -f euc-kr -t utf-8 * > /path/directory/filename.txt
벌써 (2), (3) 끝!
–
그럼 파일의 형태는 이렇게 바뀌어있을 것이다:
<language> Korean </language>
<textcode> KSC-5601-1988 </textcode>
<process> raw </process>
<version> 2001(or)</version>
<filename> kaistcorpus_written_raw_or_literature_biography_mh2-0048.txt </filename>
<title> 부하린 : 혁명과 반혁명의 사이 </title>
<author> 김남국 </author>
<date> 1993 </date>
<publisher> 문학과지성사 </publisher>
<kdc> 340.99 </kdc>
<tdmsfiletext>
제 1 장
서론 : 부하린과 그의 시대
19세기와 20세기에 걸친 러시아는 심각한 자기 모순과 고민 속에서 혁명을 행해 소용돌이치던 격정의 대륙이었다. 이 시기의 러시아는 또한 전
제 정치와 무정부주의, 민족주의와 보편주의, 개인주의와 집단주의, 잔학성과 인간성, 예속과 저항 등 극명하게 대조를 이루는 두 얼궁의 민족>적 특징이 시대마다 그 모습을 달리하며 나타나는 가운데 점증하는 급진적 혁명주의가 볼셰비즘을 중심으로 한 조직적인 결사에로 수렴되어가는
시기이기도 했다.
보면 알 수 있겠지만 이 말뭉치에 있는 모든 파일은 html
처럼 정리가 되어있고 사실 필요한 부분은 <tdmsfiletext>
와 </tdmsfiletext>
사이에 있는 문장들이다. 그 외 내용은 모델 pre-training에 별 도움이 안될 것이다.
이제는 파이썬을 사용해서 <tdmsfiletext>
와 </tdmsfiletext>
사이에 있는 문장들만 추출하자.
나는 아래 코드를 짜서 사용했다.
def extract_text(in_path,out_path,start_marker,end_marker):
"""
This code extracts text between start_marker and end_marker
in input file and writes a new file as output.
in_path: path of input file
out_path: path of output file
"""
with open(in_path,'r') as r:
is_text = False
with open(out_path,'w') as o:
for line in r:
if line.strip() == start_marker: is_text = True; continue
elif line.strip() == end_marker: is_text = False
if is_text and line.strip() != '' and not line.startswith('<'):
o.write(line)
사실 파이썬으로 인코딩도 바꿔줄 수 있고 한 파일로 모든 줄을 출력할 수 있을텐데, 인코딩 변환은 파이썬에서 더 까다롭고 잘 안되는 경우가 있다(내 능력의 한계인가ㅠㅠ). 리눅스로는 간단하고 빠르게 인코딩을 변환할 수 있기 때문에 리눅스로 하는 것을 추천한다. 그리고 인코딩을 파이썬에서 변환하려고 하면 parameter도 늘어나고 함수도 더 복잡해진다. 파이썬을 통해서 모든 문서를 한 파일로 출력하는 건 open(document, 'w')
를 그냥 바깥 loop 에 빼주면 된다. 필요에 따라 코드를 변형해서 사용하면 된다.
이렇게 간단히(?) 전-전처리가 끝나고 이제 정말 어려운 전처리를 해야될 차례다.
그건 다음 포스팅에…