이 자료는 패스트캠퍼스 김기현강사의 딥러닝을 활용한 자연어생성 올인원 패키지online 수업을 복습하고 내 맛대로 변경하면서 작성하는 글입니다.
1. AI-Hub에서 160만개의 데이터 수집
- 엑셀 형태임 —> txt파일로 추출하기
- 내부는 tab으로 나뉘어져있음(한국어 tab 영어)
- 형태는 다음과 같다.
총 1602419개의 text, 한국어 tab 영어로 이루어져있음
2. txt파일을 tsv파일로 변환
- cat ./해당 폴더/*.txt > corpus.tsv
3. shuffle하기
- 폴더내에 파일순으로 합쳐졌기 때문에 shuffling을 진행한다.
- 셔플하기전 모습
- 셔플후 모습 ※ 명령어 : gshuf ./corpus.tsv > ./corpus.shuf.tsv
- 오류없이 해결
4. train,valid,test set 나누기
- 총 1602419개의 데이터
- train : 120만
- valid : 20만
- test : 202419
※ 명령어 : head -n 1200000 ./corpus.shuf.tsv > corpus.shuf.train.tsv ; tail -n 402419 ./corpus.shuf.tsv | head -n 200000 > ./corpus.shuf.valid.tsv
tail -n 202419 ./corpus.shuf.tsv > ./corpus.shuf.test.tsv
다음과 같이 잘 분리 되었다
5. tokenization
5.1 한국어 영어 분리
- train data의 한국어, 영어 분리
- cut -f1 ./corpus.shuf.train.tsv > corpus.shuf.train.ko ; cut -f2 ./corpus.shuf.train.tsv > corpus.shuf.train.en
- valid data의 한국어, 영어 분리
- cut -f1 ./corpus.shuf.valid.tsv > corpus.shuf.valid.ko ; cut -f2 ./corpus.shuf.valid.tsv > corpus.shuf.valid.en
- test data의 한국어, 영어 분리
- cut -f1 ./corpus.shuf.test.tsv > corpus.shuf.test.ko ; cut -f2 ./corpus.shuf.test.tsv > corpus.shuf.test.en
5.2 tokenization
- train(한국어)
train data에 mecab tokenize 적용후 post_tokenize.py적용하기 >> cat ./data/corpus.shuf.train.ko | mecab -O wakati > ./data/corpus.shuf.train.tok.ko | python ./post_tokenize.py ./data/corpus.shuf.train.ko > ./data/corpus.shuf.train.tok.ko
- valid(한국어)
valid data에 mecab tokenize 적용후 post_tokenize.py적용하기 >> cat ./data/corpus.shuf.valid.ko | mecab -O wakati > ./data/corpus.shuf.valid.tok.ko | python ./post_tokenize.py ./data/corpus.shuf.valid.ko > ./data/corpus.shuf.valid.tok.ko
- test(한국어)
test data에 mecab tokenize 적용후 post_tokenize.py적용하기 >> cat ./data/corpus.shuf.test.ko | mecab -O wakati > ./data/corpus.shuf.test.tok.ko | python ./post_tokenize.py ./data/corpus.shuf.test.ko > ./data/corpus.shuf.test.tok.ko
추가로 detokenize까지 적용가능(_를 없애주는 역할)
- train(영어)
train data에 moses tokenize 적용후 post_tokenize.py적용하기 >> cat ./data/corpus.shuf.train.en | python ./tokenizer.py | python ./post_tokenize.py ./data/corpus.shuf.train.en > ./data/corpus.shuf.train.tok.en
- valid(영어)
valid data에 moses tokenize 적용후 post_tokenize.py적용하기 >> cat ./data/corpus.shuf.valid.en | python ./tokenizer.py | python ./post_tokenize.py ./data/corpus.shuf.valid.en > ./data/corpus.shuf.valid.tok.en
- test(영어)
test data에 moses tokenize 적용후 post_tokenize.py적용하기 >> cat ./data/corpus.shuf.test.en | python ./tokenizer.py | python ./post_tokenize.py ./data/corpus.shuf.test.en > ./data/corpus.shuf.test.tok.en
6. Subword Segmentation
tokenization을 진행 후, subword segmentation을 적용한다.
여기서 중요한 점은 train data set에서 bpe를 학습후 다른 데이터셋(valid,test)에 적용한다.
다른 데이터셋도 bpe를 학습하면 그것은 치팅..
- train(영어, 한국어) bpe 학습하기
- 영어 : python ./subword-nmt/learn_bpe.py --input ./data/corpus.shuf.train.tok.en --output bpe.en.model --symbols 50000 --verbose
- 한국어 : python ./subword-nmt/learn_bpe.py --input ./data/corpus.shuf.train.tok.ko --output bpe.ko.model --symbols 30000 --verbose
- train,valid,test(한국어) bpe 적용하기
>> cat ./data/corpus.shuf.train.tok.ko | python ./subword-nmt/apply_bpe.py -c ./bpe.ko.model > ./data/corpus.shuf.train.tok.bpe.ko ; cat ./data/corpus.shuf.valid.tok.ko | python subword-nmt/apply_bpe.py -c ./bpe.ko.model > ./data/corpus.shuf.valid.tok.bpe.ko ; cat ./data/corpus.shuf.test.tok.ko | python subword-nmt/apply_bpe.py -c ./bpe.ko.model > ./data/corpus.shuf.test.tok.bpe.ko
- train,valid,test(영어) bpe 적용하기
>> cat ./data/corpus.shuf.train.tok.en | python ./subword-nmt/apply_bpe.py -c ./bpe.en.model > ./data/corpus.shuf.train.tok.bpe.en ; cat ./data/corpus.shuf.valid.tok.en | python subword-nmt/apply_bpe.py -c ./bpe.en.model > ./data/corpus.shuf.valid.tok.bpe.en ; cat ./data/corpus.shuf.test.tok.en | python subword-nmt/apply_bpe.py -c ./bpe.en.model > ./data/corpus.shuf.test.tok.bpe.en
적용후 모습이다.
다 정확하게 이루어졌다.
Uploaded by Notion2Tistory v1.1.0