최근 AWS 자격증 준비를 하면서 Dump문제들을 많이 풀어보고 있는데 대부분이 영어로 되어있다. 문제 풀 때 크게 지장이 있진 않지만 가끔 문제가 복잡하거나 그에 대한 설명을 한글로 후딱 읽고 싶을땐 번역이 필요하다. 영어 문제 text들을 쭉 긁어와서 문제에 해당하는 영역만 뽑아내어 List 형태로 가지고 있을 때, 일반 번역 사이트를 이용하여 이 문제들을 하나하나 번역하기 위해선 수십번의 복붙이 필요하게된다.
AWS에서 제공하는 Translate 서비스를 Python SDK인 BOTO3를 이용하여 불러와 간단히 번역을 수행해보자!
1. 본문
아래는 최종적으로 완성된 코드이다. 필요 변수들은 아래와 같다. (번역만을 위한 함수이기 때문에 text_list에 넣기 전 추출한 문장에 대해 개행문자, 여백 등은 미리 조금 정제를 해주는게 좋다.)
text_list : 번역이 필요한 문장 (list or string 형태)
source_language_code : 번역 전 언어
target_language_code : 번역 후 언어
save_file (Otional) : 파일 저장 여부(파일명 입력)
importboto3,redefaws_translate(text_list,source_language_code,target_language_code,save_file:bool=False):# boto3를 이용하여 translate 서비스 연결
translate_client=boto3.client('translate')# 우선 입력된 text의 형태 파악 후 list로 감싼다.
text_list_bool=isinstance(text_list,list)text_list=[text_list]iftext_list_bool!=Trueelsetext_list# 번역을 수행해주는 inner function
deftrans_(text):response=translate_client.translate_text(Text=text,SourceLanguageCode=source_language_code,TargetLanguageCode=target_language_code)translated_text=response['TranslatedText']returntranslated_text# 번역 결과를 파일형태로 저장하고 싶다면 save_file 변수에 파일명 입력
ifsave_file:withopen(save_file,'w')asfile:fori,textinenumerate(text_list):translated_text=trans_(text)# Customize the writing format
file.write(f'{i+1}. {translated_text}\n')# 파일형태의 저장이 아니라면 번역 결과를 text로 return.
# input이 list면 list형으로, string형이면 string으로 return.
else:iftext_list_bool:translated_text=[trans_(text)fortextintext_list]returntranslated_textelse:returntrans_(text_list[0])
예시
text="""
A company wants to improve the performance of its popular API service
that offers unauthenticated read access to daily updated statistical information
via Amazon API Gateway and AWS Lambda. What measures can the company take?
"""source_language_code='en'target_language_code='ko'print(aws_translate(text,source_language_code,target_language_code))>인기있는API서비스의성능을개선하려는회사가있습니다.>매일업데이트되는통계정보에대한인증되지않은읽기액세스를제공합니다.>아마존API게이트웨이와AWS람다를통해회사는어떤조치를취할수있습니까?
문장 추출 관련 코드
# word_a와 word_b 사이의 문장을 추출하는 함수
defextract_text_between_keywords(word_a,word_b,text):pattern=r"{}(.*?){}".format(word_a,word_b)matches=re.findall(pattern,text,re.DOTALL)returnmatches
Leave a comment