본문 바로가기

Computer/NLP

Moses 학습 & 실행

이번 글에서는 moses를 이용하여 번역 모델을 학습하고, 실행하는 방법에 대해 공유한다.

moses 공식 사이트에 있는 baseline 실행하고, 정리한 내용이다.

baseline url : http://www.statmt.org/moses/?n=Moses.Baseline



이 글을 검색해서 보고 있다는 것 자체가 번역모델이 무엇인지, 그리고 학습이 왜 필요한지에 대해 알고 있는 분이라 생각하여 why에 대한 부분은 생략하고 바로 실행하는 부분에 대해 설명한다.


학습과정을 나누면 5단계로 구성되어 있다.(baseline 기준)


1. 말뭉치를 전처리하고, moses 학습 형태로 변경

2. 언어 모델(lanaguage model)을 빌드

3. 번역 모델 학습 

4. 파라미터 튜닝

5. 번역 모델 바이너리화


* 영어를 한국어로 번역하기 위해, 번역모델을 학습하는 방법이다.

* 학습에 사용할 말뭉치가 준비되어 있다고 가정한다.

  (말뭉치 : eng_kor.learn.kor, eng_kor.learn.eng)


1. 말뭉치 전처리


# tokenisation

$ ~/mosesdecoder/scripts/tokenizer/tokenizer.perl -l en \

    < eng_kor.learn.eng \

    > eng_kor.learn.tok.eng


$ ~/mosesdecoder/scripts/tokenizer/tokenizer.perl -l ko \

    < eng_kor.learn.kor \

    > eng_kor.learn.tok.kor


# truecaser : 말뭉치에서 각 단어의 대소문자 빈도를 조사하여 대소문자 변환을 위한 모델 빌드

$ ~/mosesdecoder/scripts/recaser/train-truecaser.perl \

    --corpus eng_kor.learn.tok.eng \

    --model truecase-model.en


$ ~/mosesdecoder/scripts/recaser/train-truecaser.perl \

    --corpus eng_kor.learn.tok.kor \

    --model truecase-model.ko


# truecasing : truecasing에서 빌드된 모델을 토대로 대소문자 변환

$ ~/mosesdecoder/scripts/recaser/truecase.perl \

    --model truecase-model.en \

    < eng_kor.learn.tok.eng \

    > eng_kor.learn.true.eng


$ ~/mosesdecoder/scripts/recaser/truecase.perl \

    --model truecase-model.ko \

    < eng_kor.learn.tok.kor \

    > eng_kor.learn.true.kor


# limit sentence length to 80(with direction)

$ ~/mosesdecoder/scripts/training/clean-corpus-n.perl \

    eng_kor.learn.true en ko \

    eng_kor.learn.clean 1 80


2. 언어 모델(lanaguage model) 빌드 : target language에 대해 언어 모델을 빌드한다.


# build lm (eng to kor, using ko) : tri-grams 빌드

$ ~/mosesdecoder/bin/lmplz -o 3 --discount_fallback < eng_kor.learn.true.ko > kor.arpa


# make binarise : 바이너리화

$ ~/mosesdecoder/bin/build_binary kor.arpa kor.blm


3. 번역 모델 학습 : 학습 말뭉치의 크기에 따라 시간이 오래 걸리는 작업이므로, 백그라운드로 실행하는 것이 좋다.

-mgiza, -cores는 필요에 따라 설정하여 사용하면 된다.


$ ~/mosesdecoder/scripts/training/train-model.perl \

    -root-dir train \

    -corpus eng_kor.learn.clean \

    -f en -e ko -alignment grow-dial-final-and -reordering msd-bidirectional-fe \

    -lm 0:3:kor.blm:8 \

    -mgiza -cores 12 \

    -external-bin-dir ~/mosesdecoder/tools/


4. 파라미터 튜닝


- 튜닝 데이터 준비


# tokenisation

$ ~/mosesdecoder/scripts/tokenizer/tokenizer.perl -l en \

    < eng_kor.tune.eng \

    > eng_kor.tune.tok.en


$ ~/mosesdecoder/scripts/tokenizer/tokenizer.perl -l ko \

    < eng_kor.tune.kor \

    > eng_kor.tune.tok.ko


# truecasing

$ ~/mosesdecoder/scripts/recaser/truecase.perl \

    --model truecase-model.en \

    < eng_kor.tune.tok.en \

    > eng_kor.tune.true.en


$ ~/mosesdecoder/scripts/recaser/truecase.perl \

    --model truecase-model.ko \

    < eng_kor.tune.tok.ko \

    > eng_kor.tune.true.ko


- 파라미터 튜닝


$ ~/mosesdecoder/scripts/training/mert-moses.pl \

    --working-dir=mert-work \

    --decoder-flags="-threads 12" \

    eng_kor.tune.true.en eng_kor.tune.true.ko \

    ~/mosesdecoder/bin/moses ./train/model/moses.ini --mertdir ~/mosesdecoder/bin/


5. 번역 모델 바이너리화
cmph를 설치했을 경우에 가능한 과정이다.
phrase table, reordering table을 바이너리화하여, 로딩 속도를 향상 시킬 수 있다.

# compress
$ ~/mosesdecoder/bin/processPhraseTableMin \
    -in train/model/phrase-table.gz \
    -nscores 4 \
    -out phrase-table

$ ~/mosesdecoder/bin/processLexicalTableMin \
    -in train/model/reordering-table.wbe-msd-bidirectional-fe.gz \
    -out reordering-table

이렇게 한 다음에는 mert-work/moses.ini에서
PhraseDictionaryMemory => PhraseDictionaryCompact로 변경
PhraseDictionaryCompact Path, LexicalReordering path = 바이너리화 되어 있는 파일로 변경해야 한다.

* 실행
$ ~/mosesdecoder/bin/moses -f mert-work/moses.ini

끝.