웹개발 및 최신 테크 소식을 전하는 블로그, 웹이즈프리

HOME > webdevetc

네이버 번역 파파고 API Python 사용방법 및 사용기

Last Modified : 2018-02-01 / Created : 2018-02-01
12,231
View Count

네이버 번역을 쉽고 빠르게 적용하기 위한 방법으로 Naver의 PAPAGO(이하 파파고)를 사용할 수 있습니다.  파파고는 네이버 번역 어플리케이션으로 간단한 API 역시 제공됩니다. 이때 NMT / SMT 번역이 제공되며 원하는 번역 기능을 선택하여 사용하면 됩니다.




# 네이버 번역 NMT? SMT? 무엇인가

이 둘의 차이점은 네이버 페이지에 자세하게 설명되어 있습니다. 네이버 사이트에 보면 다음과 같이 적혀있습니다.

1. Neural Machine Translation
NMT는 Neural Machine Translation(인공신경망 기반 기계번역)의 약어입니다. 파파고의 NMT 기술은 입력 문장을 문장벡터로 변환하는 신경망(encoder)과 문장벡터에서 번역하는 언어의 문장을 생성하는 신경망(decoder)를 대규모의 병렬 코퍼스부터 자동으로 학습합니다. 입력문장의 일부가 아니라 문장 전체 정보를 바탕으로 번역을 수행하기때문에 기존 SMT방식의 번역보다 더욱 정확하고 문장 맥락에 맞는 번역을 하는것이 특징입니다. (출처: 네이버 Papago NMT 번역 사이트)

2. Statistical Machine Translation
SMT(Statistical Machine Translation)는 통계 기반 기계 번역 기술로, 속도가 빠르고 번역할 수 있는 어휘 수가 많아서 신조어 번역에 장점을 가집니다. 문장을 단어나 구문 단위로 쪼개어 통계상 가장 자연스럽다고 판단되는 번역 결과를 제시합니다. (출처: 네이버 Papago SMT 번역 사이트)


위 글을 보면 이 둘의 차이점이 인공지능을 이용했느냐 통계를 이용했느냐의 방식의 차이임을 알 수 있습니다. 아무래도 NMT쪽이 더 나은 결과를 가져오지 않을까 생각이 듭니다. 물론 현재로서는 큰 차이가 없을 수 있으나 시간이 지날 수록 점점 NMT에 무게가 실리겠지요...

참고로 둘 다 각각 일일 허용량 10000자로 제한되어 있습니다. 만약 제한없이 계속 사용해야 할 경우 추가 요금을 지불하여 제한없이 사용할 수 있을 것 같습니다. 그럼 아래부터는 실제로 Python에서 적용하는 방법을 알아보겠습니다.



# Python에 API를 사용하여 번역 적용하기

일단 제가 네이버 번역 API를 사용하기로 한 결정은 좀 더 빠른 번역을 위해서 RestAPI를 구현하기 위함입니다. 그래서 네이버의 NMT 번역 API를 사용하였고 그 결과 아래와 같이 동작할 수 있는 웹사이트를 구축할 수 있었습니다. 아래는 백오피스 페이지로 왼쪽에 한글을 넣고 번역 버튼을 누르면 우측에 번역 결과가 나타나게됩니다.

그림) REST API를 적용한 방법

! 어떤 과정이 필요할까

그렇다면 위 기능 구현을 하기까지 어떤 과정이 필요할까요? 간단하게 나열하면 아래와 같습니다.

  • 간단한 번역 UI 페이지 만들기 Ex) translate.html
  • 버튼 클릭시 API를 호출하는 함수 작성
  • API가 동작하는 서버 페이지 구축 Ex) /api_translation/
  • 호출 결과를 UI 페이지에 보여주고 완료


1. 번역 UI 페이지 구현
아주 간단합니다. 위에서 부터 천천히 알아보면 우선 html은 간단한 입력폼과 버튼 하나만 있으면 될 것입니다. 이 부분은 간단하므로 넘어가겠습니다.


2. 버튼 클릭시 API 호출하기
빠르게 동작하기 위해 비동기 방식의 API를 호출하도록 스크립트를 작성합니다.
papagoTranslate = function() {
    var url = '/api_translation';
    var _text = '안녕' // 번역할 문자
    var params = {
      text: _text
    };
    $http({
        method: 'GET',
        params: params,
        url: url
    }).then(function(response) {
      var result = response.data;
      // result를 View 영역에 반영
    });
  };

위 예제는 AngluarJS인 경우의 소스입니다. 꼭 AngularJS가 아니더라도 XMLHttpRequest 객체를 사용하거나 jQuery를 사용하는 등 원하시는 방식에 맞게 작성하여 사용하시면 됩니다.


3. API가 동작하는 서버 페이지 작성
여기서는 Python을 예로 들어보았습니다. 하지만 다양한 서버 환경에 맞게 구축이 가능하며 자세한 설명은 아래 링크인 Naver Sample Examples에서 찾아보시면 더 빠를 것입니다.

링크 바로가기 > https://developers.naver.com/docs/nmt/examples/#python

제 경우 위 Python 예제를 변형하여 적용하였습니다. 여기서 한 가지 문제가 되는 부분이 있었는데 바로 urllib 모듈과 관련된 부분입니다... 해당 예제는 Python 3를 기준으로 urllib 모듈을 사용하였기 때문에 저를 비롯한 Python 2 버전을 사용할 경우 동작하지 않을 수 있습니다... 이때 해결책으로 urllib2 모듈을 사용할 수 있습니다. 제 경우 이렇게 수정하여 사용하였고 정상 동작됨을 확인하였습니다. 소스는 아래와 같습니다. 안녕하세요를 번역해보겠습니다.

@ Python 2 버전인 경우
import os
import sysimport url
lib2
    client_id = "Your client id"
    client_secret = "Your secret id"
    encText = "안녕하세요."
    data = "source=ko&target=en&text=" + encText
    url = "https://openapi.naver.com/v1/papago/n2mt"
    requesturl = urllib2.Request(url)
    requesturl.add_header("X-Naver-Client-Id", client_id)
    requesturl.add_header("X-Naver-Client-Secret", client_secret)
    response = urllib2.urlopen(requesturl, data = data.encode("utf-8"))
    rescode = response.getcode()
    if rescode == 200:
        response_body = response.read()
        return toJson(response_body.decode('utf-8'))
    else:
        return "Error Code:" + rescode

Python 3의 경우 위 링크의 Python 부분을 적용하시면 될 것 같습니다.


4. 호출 결과를 UI의 View에 반영
정상적으로 API가 동작하면 Response를 얻을 수 있을 것입니다. 전달된 값을 JSON으로 받아서 처리합니다. 이때 String 문자로 들어온 response는 JSON.parse()를 사용하여 파싱 과정을 통해 원하는 프로퍼티와 값만 View에 처리하도록 합니다.



# 마치면서

예전부터 하나하나 적던 블로그 글이 어느 덧 1500개가 넘어가다보니 영문 페이지를 만들겠다는 부분에 번역이라는 걸림돌이 생기게 되었습니다... 직접 번역하는 것은 결과도 좋지 않고 시간도 오래 걸릴 것 같아 좀 더 효율적인 방법을 찾다보니 네이버 번역 API NMT를 사용하게 되었습니다. 빠른 번역이 필요한 경우 저와 같이 REST API를 사용하면 더 빠른 작업이 가능할 것으로 기대됩니다.

! 끄적 끄덕

번역은 참 어려운 과정입니다. 특히 개발관련 콘텐츠를 여러 방법으로 번역해 보았으나 그 결과가 좋지 않았습니다... 평이한 국문의 경우 영문 번역의 결과가 대부분 높은 수준의 번역 결과를 가져왔으나 개발 등의 부분들을 번역할 경우 의도하지 않은 오역이 생길 수 있으니 참고하시기 바랍니다. 이런 번역은 NMT 방식보다는 아무래도 통계적인 방법으로 접근한 SMT 방법이 더 효과적이지 않을까라고 개인적으로 생각하는 바입니다. 아무쪼록 위 글이 도움이 되셨기를 바랍니다 ^^

Previous

자바스크립트 이미지핑 기술 알아보기

Previous

도메인 TypeA로 연결방법 및 nginx 설정하기