OpenNMT 는 NMT(Neural Machine Translation, 신경망 기계번역) 분야의 유명한 오픈소스 프로젝트다.
OpenNMT 는 pytorch 기반의 라이브러리를 제공하는데 요게 OpenNMT-py 이다.
즉, 파이썬을 이용하여 OpenNMT 모델을 다루고 문장 번역을 해보고 싶다!
하면 OpenNMT-py 를 활용하면 된다.
OpenNMT 로 모델을 학습하고,
학습이 완료된 모델을 활용하여 문장을 번역(translate)할 수 있다.
번역 과정은 OpenNMT-py 를 이용한 방법과 ctranslate2 를 이용한 방법이 있다.
1. OpenNMT-py 를 이용한 방법
CLI 형태로 간단하게 사용하고 싶다면 이 방법을 사용하면 된다.
1) OpenNMT-py 라이브러리 설치
pip install OpenNMT-py
train 할 때 이미 OpenNMT-py 를 설치한 상태라면 위 내용은 지나가도 된다.
2) 번역하기(onmt_translate)
onmt_translate \
-model {모델경로} \ # model (.pt 파일) 경로
-src {input file 경로} \ # 번역하고자 하는 텍스트 파일 경로
-output {ouput file 경로} \ # 번역이 완료된 텍스트가 쓰일 파일 경로
-gpu 0 \
-verbose \
...
위 옵션들 말고도 아주 많은데 document 참고해서 필요한 옵션을 골라 쓰면 된다.
https://opennmt.net/OpenNMT-py/options/translate.html
2. ctranslate2 를 이용한 방법
파이썬 스크립트를 작성하여 실행시키고 싶을 때는 이 방법을 이용하면 된다.
1) ctranslate2 라이브러리 설치
pip install ctranslate2
* 참고
ctranslate2 말고 onmt 라이브러리를 사용해보려 했는데 잘 안됐음.
OpenNMT-py 는 torch==1.6.0 버전을 필요로 하는데 onmt 는 torch==1.3.1 버전을 필요로 한다.
둘이 호환도 안되고, 굳이 torch 버전을 down 시킬 필요는 없을 것 같아서 포기^,^!
ctranslate2 는 잘 되니까 이걸로 하도록 하자.
2) 모델 변환
ctranslate2 는 .pt 파일의 모델은 인식하지 못하므로, .bin 파일로 변환시켜주어야 한다.
import ctranslate2
converter = ctranslate2.converters.OpenNMTPyConverter(model_path=model_path) # model_path: .pt 파일 경로
converter.convert(output_dir=output_path, vmap=vocab_path)
이렇게 하면 .pt -> .bin 으로 모델이 변환되어 output_path 에 저장된다.
이 때, output_path 에 함께 생성된 source_vocabulary, target_vocabulary 파일은 번역할 때 꼭 필요하니 그대로 둘 것!
3) 번역하기
translator = ctranslate2.Translator(model_path=model_path, device="cpu")
outputs = translator.translate_batch(tokenized_texts, beam_size=5, num_hypotheses=2, sampling_temperature=0.8)
# outputs 형태
# [TranslationResult(hypotheses=[['I', 'am', 'hungry']], scores=[], attention=[]), ...]
ctranslate2 의 translate 도 document 를 참고하여 원하는 옵션을 추가하면 된다.
https://github.com/OpenNMT/CTranslate2/blob/master/docs/python.md
번역할 때 주의할 점이 몇 가지 있는데,
1) translate 할 때 input 으로 들어가는 데이터는 토크나이징된 데이터여야 한다.
opennmt-py 는 sentencepiece tokenizer 를 쓴다고 하니 sentencepiece 를 사용하자.
2) ctranslate2 에서 hypotheses 란, 번역으로 생성되는 문장이라고 보면 된다.
결과 형식을 보면 알겠지만 token list 형태로 출력되며, 문장 형태로 바꾸려면 sentencepiece 로 다시 decoding 해서 토큰들을 합쳐야 한다.
3) num_hypotheses 는 번역 결과 문장 갯수라고 보면 된다.
':: ai > nlp' 카테고리의 다른 글
NLP :: MecabTokenizer() 생성 시 MeCab Tagger 런타임 에러(RuntimeError) 해결 (0) | 2021.12.15 |
---|---|
NLP :: sentencepiece tokenizer 로 문장 토큰화하기 (0) | 2021.12.14 |
NLP :: Transformer 기반 문장 생성(Text Generation)과 decoding 옵션 (5) | 2021.11.17 |