:: ai/nlp

NLP :: 파이썬(python) 으로 OpenNMT 모델 통해 문장 번역하기(translate)

토람이 2021. 12. 10. 00:05

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 는 번역 결과 문장 갯수라고 보면 된다. 

 

 

300x250