AWS에서 대용량 텍스트 문서를 번역하는 방법, Amazon Translate!

2020. 02. 17 | 블로그

이 게시물에서는 대용량 텍스트 문서를 Amazon Translate에서 처리할 수 있을 정도로 작은 크기로 분할하는 방법에 대해 설명합니다. 단어나 문장을 나누지 않고 문서를 분할하는 방법을 보여주고, 소스 텍스트가 문법적으로 정확하도록 유지하고 문장 경계를 감지하기 위해 Python NLTK 라이브러리를 사용하는 샘플 코드를 보여 드리겠습니다.

Amazon Translate 란 무엇입니까?

Amazon Translate 는 AWS (Amazon Web Services) 플랫폼에서 텍스트를 번역하는 서비스입니다. 프로그래밍 방식으로 사용하도록 설계되었으며 Python, Java, AWS Mobile SDK 및 AWS Command Line Interface (AWS CLI)의 인터페이스를 지원합니다. 이 서비스는 현재 54가지 언어 간 번역을 지원합니다!

Media Insights Engine 이라는 소수의 동료와 함께 구축한 비디오 검색 엔진에서 비디오 대본을 번역하기 위해 Amazon Translate를 사용하고 있습니다. 사용자는 방대한 비디오 컬렉션에서 콘텐츠를 검색하고 찾을 수 있는 비디오 사본, 번역 및 Amazon Rekognition 에서 생성한 데이터를 사용합니다. 예를 들어, 사용자는 “Hasta la vista, baby”와 같은 스크립트 발췌 또는 “Schwarzenegger”와 같은 유명인 이름 또는 “Violence”와 같은 핵심 콘텐츠 용어를 검색하여 The Terminator를 찾을 수 있습니다.

Amazon Translate의 제한 사항은 무엇입니까?

AWS 서비스에는 사용자가 서비스를 잘 못 사용하거나, 실수로 필요한 것보다 더 많은 리소스를 프로비저닝하지 못하도록 하는 기본 제한 사항이 포함되어 있습니다. 입력 개체의 최대 크기, 요청을 보낼 수 있는 횟수, 요청을 실행할 수 있는 기간 등을 제어할 수 있습니다.

예를 들어 널리 사용되는 서버리스 컴퓨팅 플랫폼인 AWS Lambda는 기능을 15분 이상 실행하도록 제한하며 경고없이 해당 제한을 초과하는 기능을 종료합니다. 다른 서비스의 경우에는 초과된 한도를 명시적으로 식별하는 오류를 반환하여 보여줍니다. 예를 들어, 입력 텍스트가 너무 긴 Amazon Translate에 전송하면 다음과 같은 오류가 표시됩니다.

An error occurred (TextSizeLimitExceededException) Input text size exceeds limit. Max length of request text allowed is 5000 bytes while in this request the text size is 5074 bytes

단일 요청에 허용된 것보다 더 많은 데이터를 처리하기 위해 서비스가 필요한 경우 작업의 부하를 여러 개의 작은 부분으로 분할하여야 합니다. Amazon Translate에 대한 지침 및 제한 설명서에 따라 앞의 오류 메시지는 서비스가 5,000 바이트 이하의 UTF-8 인코딩 문자를 허용할 수 있음을 알려줍니다. Python 명령을 사용하여 이것을 확인할 수 있습니다.

len(source_text.encode(‘utf-8’)) < 5000`. 5,000 바이트를 초과하는 텍스트 문서를 사용하는 경우 소스 텍스트를 작은 크기로 분할하고 각 부분에 대해 Amazon Translate를 호출 한 다음 번역 된 결과를 완료하면 결합할 수 있습니다.

소스 텍스트의 문법적 무결성을 유지하기 위해 단어나 문장 중간에서 나눠서는 안됩니다. 문장 경계를 찾는 가장 간단한 방법은 마침표 뒤에 대문자를 사용하는 것입니다. 보다 정확한 전략은 마침표를 포함하지만 영어 단어 Missus는 Mrs.로 약칭하거나 독일어 Frau는 Fr로 약자와 같이 반드시 문장을 종료하지는 않는 언어별 약어를 고려합니다.

Python 용 Natural Language Toolkit으로 텍스트 분할

파이썬 자연 언어 툴킷 (NLTK)은 다양한 언어에 대한 문장 텍스트를 분할 할 수 있는 편리한 방법을 제공합니다. 다음 Python 코드는 텍스트를 문장 목록으로 나누기 위해 사전 훈련된 모델 또는 토크 나이저를 다운로드하는 방법을 보여줍니다. 이 예에서는 영어 토크나이저(낱말 분석기)가 사용됩니다.

tokenizers/punkt/ 디렉토리에서 다른 언어의 토크나이저를 찾을 수 있습니다.

다음 코드 블록을 스크롤하려면 마우스를 올리십시오.

​Python

# Be sure to first install nltk and boto3
import nltk.data
import boto3
# Define the source document that needs to be translated
source_document = “My little pony heart is yours...”
# Tell the NLTK data loader to look for resource files in /tmp/
nltk.data.path.append("/tmp/")
# Download NLTK tokenizers to /tmp/
nltk.download('punkt', download_dir='/tmp/')
# Load the English language tokenizer
tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')
# Split input text into a list of sentences
sentences = tokenizer.tokenize(source_document)
print("Input text length: " + str(len(source_document)))
print("Number of sentences: " + str(len(sentences)))
translated_text = ''
source_text_chunk = ''
translate_client = boto3.client('translate')
source_lang = "en"
target_lang = "fr"
for sentence in sentences:
    # Translate expects utf-8 encoded input to be no more than 
    # 5000 bytes, so we’ll split on the 5000th byte.
    if ((len(sentence.encode('utf-8')) + len(source_text_chunk.encode('utf-8')) < 5000):
        source_text_chunk = source_text_chunk + ' ' + sentence
    else:
        print("Translation input text length: " + str(len(source_text_chunk)))
        translation_chunk = translate_client.translate_text(Text=source_text_chunk,SourceLanguageCode=source_lang,TargetLanguageCode=target_lang)
        print("Translation output text length: " + str(len(translation_chunk)))
        translated_text = translated_text + ' ' + translation_chunk["TranslatedText"]
        source_text_chunk = sentence
# Translate the final chunk of input text
print("Translation input text length: " + str(len(source_text_chunk)))
translation_chunk = translate_client.translate_text(Text=source_text_chunk,SourceLanguageCode=source_lang,TargetLanguageCode=target_lang)
print("Translation output text length: " + str(len(translation_chunk)))
translated_text = translated_text + ' ' + translation_chunk["TranslatedText"]
print("Final translation text length: " + str(len(translated_text)))

위의 코드를 실행하려면 Github 에서 다운로드 하고 NLTKboto3 Python 패키지를 설치한 다음 ‘python3 app.py’를 실행하십시오. 다음과 같은 출력이 표시 되어야합니다.

Python

$ python3 app.py
[nltk_data] Downloading package punkt to /tmp/...
[nltk_data]   Package punkt is already up-to-date!
Input text length: 32
Number of sentences: 1
Translation input text length: 33
Translation output text length: 4
Final translation text length: 37

이 예제 실행을 마친 후에는 지속적인 비용 발생을 피하기 위해, 사용되는 AWS 서비스 또는 리소스를 종료해야 합니다.

요약

이 블로그 게시물에서는, 대용량 텍스트 문서를 문장 경계를 고려하며 작은 크기로 분할하여, Amazon Translate에서 처리하는 방법을 알아보았습니다. 다른 서비스의 지침을 준수한다면, 이 방법으로 번역 할 수 없는 문서는 없습니다.

Amazon Translate에 대한 자세한 내용은 개발자 안내서를 참조하십시오.

원문 : https://aws.amazon.com/ko/blogs/media/how-to-translate-large-text-documents-with-amazon-translate/


원문

Ian Downard

번역

영업컨설팅2팀