-
[개발일지] T5 학습시키기(1) - 데이터 준비개발일지 2021. 7. 10. 14:30728x90
회사에서 T5를 사용하고 있는데, 회사용이 아닌 개인용 모델도 하나 준비하려 한다.
Pre-training을 하기 위해 가장 먼저 필요한건 데이터.
구글에서는 원래 C4 데이터셋을 사용하는데 이건 내가 알기론 영어..이므로
영어 데이터보다는 그 수가 현저히 적더라도 한국어 데이터를 따로 확보해야한다.
한국어 데이터는 보통 위키데이터를 많이 사용해왔다.
위키백과:데이터베이스 다운로드 - 위키백과, 우리 모두의 백과사전
이 문서는 한국어 위키백과의 정보문입니다.이 문서는 정책과 지침은 아니지만, 위키백과의 규범과 관습 측면에서 공동체의 확립된 관행을 설명하고 있습니다. 공동체의 총의나 검토를 어느 정
ko.wikipedia.org
여길 참고해 한국어 위키데이터를 다운 받아도 되고,
dump데이터라 추출하기가 귀찮으므로..
나는 KorQuad에 있는 위키 데이터를 이용하기로 했다.
KorQuAD
What is KorQuAD 2.0? KorQuAD 2.0은 KorQuAD 1.0에서 질문답변 20,000+ 쌍을 포함하여 총 100,000+ 쌍으로 구성된 한국어 Machine Reading Comprehension 데이터셋 입니다. KorQuAD 1.0과는 다르게 1~2 문단이 아닌 Wikipedia artic
korquad.github.io
이곳에서 데이터를 받자.
2.1 버전을 보면 train/dev 데이터가 나뉘어있는데, 이건 QnA용으로 나뉘어져 있는 것.
Pre-train은 train/dev를 나누지 않고 많은 데이터가 있을 수록 좋으므로
모든 데이터를 쓴다.
꼭 이것만 쓰지 말고 한국어로 된 정형데이터는 모두 갖다 써보자.
json 파일을 하나하나 열어 보면,
우리가 쓸건 key가 context, qas로 되어있다.
context 는 본문 내용이고, qas는 question과 answer가 담겨있는데,
question과 answer까지 사용해주자.
문제는 이 안에 html 태그와 wihte space, 또 공통으로 붙은 위키문장이 붙어 있는데, 정규표현식을 이용해 제거해주자.
import re pattern = "(<.*?>)|(\n)|(\xa0)" re.sub(string=re.sub(string=re.sub(string=q["question"], pattern=pattern, repl=" "), pattern="원본 주소 .*", repl=" "), pattern=" +", repl=" ").strip()나같은 경우엔 위와 같이 데이터를 다듬었다.
이렇게 해서 모든 데이터를 저장해준다.
전체 코드는 아래와 같다
import os from tqdm import tqdm import json import re dirs_train = os.listdir("./korquad.github.io-master/korquad.github.io-master/dataset/KorQuAD_2.1/train/") dirs_dev = os.listdir("./korquad.github.io-master/korquad.github.io-master/dataset/KorQuAD_2.1/dev/") dirs = ["./korquad.github.io-master/korquad.github.io-master/dataset/KorQuAD_2.1/train/"+d for d in dirs_train if d[-4:]=="json"] + ["./korquad.github.io-master/korquad.github.io-master/dataset/KorQuAD_2.1/dev/"+d for d in dirs_dev if d[-4:]=="json"] with open("./korquad.github.io-master/korquad.github.io-master/dataset/KorQuAD_2.1/train/answers.txt", mode="wt", encoding="utf-8") as f:f.write("") with open("./korquad.github.io-master/korquad.github.io-master/dataset/KorQuAD_2.1/train/questions.txt", mode="wt", encoding="utf-8") as f:f.write("") with open("./korquad.github.io-master/korquad.github.io-master/dataset/KorQuAD_2.1/train/docs.txt", mode="wt", encoding="utf-8") as f:f.write("") pattern = "(<.*?>)|(\n)|(\xa0)" for d in tqdm(dirs): docs = [] questions = [] answers = [] with open(d, mode="rb") as f: data = json.load(f) data = data["data"] for d in data: docs.append(re.sub(string=re.sub(string=re.sub(string=d["context"], pattern=pattern, repl=" "), pattern="원본 주소 .*", repl=" "), pattern=" +", repl=" ").strip()) qas = d["qas"] for q in qas: questions.append(re.sub(string=re.sub(string=re.sub(string=q["question"], pattern=pattern, repl=" "), pattern="원본 주소 .*", repl=" "), pattern=" +", repl=" ").strip()) answers.append(re.sub(string=re.sub(string=re.sub(string=q["answer"]["text"], pattern=pattern, repl=" "), pattern="원본 주소 .*", repl=" "), pattern=" +", repl=" ").strip()) with open("./korquad.github.io-master/korquad.github.io-master/dataset/KorQuAD_2.1/train/answers.txt", mode="at", encoding="utf-8") as f:f.write("\n".join(answers)) with open("./korquad.github.io-master/korquad.github.io-master/dataset/KorQuAD_2.1/train/questions.txt", mode="at", encoding="utf-8") as f:f.write("\n".join(questions)) with open("./korquad.github.io-master/korquad.github.io-master/dataset/KorQuAD_2.1/train/docs.txt", mode="at", encoding="utf-8") as f:f.write("\n".join(docs))'개발일지' 카테고리의 다른 글
[개발일지] Transformer로 긴 문서 학습시키기 (0) 2021.07.14 [개발일지] T5 학습시키기(2) - tokenizer 만들기 (bpe, byte pair encoding) (0) 2021.07.10 [개발일지] Colab Pro 결제 (0) 2021.04.03 [개발일지] 한국어 위키 데이터 다운로드 (0) 2021.03.15 [개발일지] 비트코인 분봉 데이터 쌓기 (0) 2021.03.07