brunch

You can make anything
by writing

C.S.Lewis

by 이영민 Nov 27. 2017

구글의 자연어 처리 기술

Google Natural Language API

Prologue

작년 7월, 구글 클라우드 플랫폼(Google cloud platform, GCP)에서 자연어(natural language) API를 베타 버전으로 공개했는데 현재는 v1을 서비스하고 있다. 이게 무슨 말인가 하면, 구글이 사람의 언어(자연어)를 기계가 이해할 수 있도록 하는 기술을 누구나 이용할 수 있도록 무료로(일정 부분) 제공하고 있다는 뜻이다. 구글이 했으니 또 얼마나 잘했을지 한번 알아보려 한다.


나는 개발 언어로 주로 Python을 사용하는데, 구글 클라우드 플랫폼에서는 Python뿐 아니라 Go, Java, .NET, Node.js, PHP, Ruby를 지원하고 있고 관련 매뉴얼도 상당히 알기 쉽게 제공하고 있으니 필요한 부분은 얼마든지 검색해서 활용할 수 있을 것이다.


자연어 API는 영어뿐 아니라 중국어(간체 및 번체), 프랑스어, 독일어, 이탈리아어, 일본어, 한국어, 포르투갈어, 스페인어에 대한 분석이 가능한데, 일부 기술은 아직 영어만 가능한 상태다. 그럼 지금 어떤 기술을 사용할 수 있는지 알아보자.


구글 자연어 API에서 제공하는 5가지 메서드
1. 감성 분석(sentiment analysis)
2. 엔터티 분석(entity analysis)
3. 구문 분석(syntax analysis)
4. 엔터티 감성 분석(entity sentiment analysis) - 영어만 가능
5. 내용 분류(content classification) - 영어만 가능

위 기술이 어떤 것인지 쉽게 이해할 수 있는 방법은 각 분석 결과를 시각적으로 확인해 보는 것이다. 영리한 구글에서 그 기능 또한 제공하고 있다(여기서 해 볼 수 있음). 이해를 돕기 위해 먼저 한국어로 시도해 보았다. 인풋 문서(텍스트)는 아래와 같다. 


샤로수길에 새로 생긴 맛집인 새우당 인테리어가 너무 예쁘다. 음식도 맛있다.
특히 간장새우덮밥이 예술이다. 그런데 칠리새우덮밥은 별로였다.



1. 감성 분석 결과 (한국어)


감성 분석 결과는 문장 단위 문서 단위로 나눠서 확인해 볼 수 있다. 또한 아래 감성 분석 결과를 보면 'score'와 'magnitude'라는 항목에 대한 점수가 매겨져 있는데, score 감성을 정량화한 수치로, -1 이상 +1 이하의 범위를 갖는다. -1에 가까울수록 부정, +1에 가까울수록 긍정의 의미로 해석하면 된다. magnitudescore의 정도를 나타내는 수치로, 0 이상~무한대의 값을 가지며 값이 클수록 score의 세기가 세진다고 볼 수 있다.


위 문서에는 세 개의 긍정적 문장과 하나의 부정적 문장이 있는데, GCP 시스템은 전체 score와 magnitude를 각각 0.7, 2.8로 계산, 전반적으로 긍정적 문서라고 평가했다. 문장별로 보면, 앞의 세 문장은 모두 유사한 수치로 긍정적으로 평가한 반면 마지막 문장은 중립으로 평가했는데, 여기에 약간의 트릭이 있다.


'그런데 칠리새우덮밥은 그저 그랬다.'

'그런데 칠리새우덮밥은 별로였다.'


위 두 문장은 유사한 의미이다. 그런데 시스템은 이를 구분하지 못했다. 처음에는 '그저 그랬다'로 입력했는데, 이를 긍정(0.7, 0.7)의 의미로 분석했다. 한국어 모델은 아직 학습이 더 필요해 보인다. 


그리고 전체 score는 문장별 score의 평균, magnitude는 문장별 magnitude의 합이라는 것을 알 수 있다.


GCP 자연어 API를 이용한 감성 분석 결과


2. 엔터티 분석 결과 (한국어)


엔터티 분석은 알려진 텍스트(유명인, 랜드마크 같은 고유명사 또는 식당, 경기장 등과 같은 보통명사)에 대한 분석 결과를 반환한다. 고유명사가 위키피디아에 등록된 경우 해당 URL도 함께 반환해 준다. 아래 분석 결과를 보면 'salience'라는 수치가 있는데, 이것은 각 단어가 전체 문서에서 가지는 중요성(관련성)을 의미한다. 0 이상 1 이하의 값을 가지며 1에 가까울수록 중요한 단어인 것이다. 


위 문서에서 가장 중요한 엔터티는 뭘까? 정답은 0.19의 salience 값을 가지는 '새우당'이다(오, 잘 찾네?). 아래 그림을 보면 salience 값이 높은 순서대로 출력되는 것을 알 수 있다. 흥미로운 것은 새우당에서 판매하는 메뉴인 '간장새우덮밥'과 '칠리새우덮밥'이 유사한 salience 값을 가지고 있는데, 문서에서 맛있다고 한 간장새우덮밥의 salience 값이 약간 더 높다는 사실.


GCP 자연어 API를 이용한 엔터티 분석 결과


또한 각 엔터티에 대한 type 정보(엔터티 별로 오른쪽 상단에 표시된)도 분석할 수 있는데, 찾아보니 type은 8개가 있다(아래 그림 참고). 만약 문서에 사람(person), 위치(location), 기관(organization), 이벤트(event), 예술품(work of art), 소비재(consumer goods) 같은 것들이 포함돼 있다면 그것을 찾아낼 수 있는 것이다. 새우당 문서에서는 '맛집'을 기관(organization)으로 판단했다. 


맛집을 위치(location)로 파악하는 것이 낫지 않은가도 싶었는데, 정확한 좌표를 알 수 없으니까 불가능한 것이 맞지 싶다. 참고로 '서울역'을 입력한 경우에는 이를 위치(location)로 식별하는데, '프랑스 파리'는 기관(organization)으로 식별했다.

 

GCP 자연어 API에서 제공하는 엔터티 type 정보


3. 구문 분석 결과 (한국어)


구문 분석은 주어진 텍스트를 일련의 문장과 토큰으로 분리하여 분석한 결과를 반환한다. 아래 그림을 보면 의존성(dependency), 구문 분석 라벨(parse label), 품사(part of speech, POS), 기본형(lemma), 형태학(morphology)에 대한 분석 결과를 볼 수 있다(morphology 분석까지 포함하면 이미지가 너무 커져서 그 부분은 선택 해제함). parse label에 대한 정보는 여기에서POS에 대한 정보는 여기에서 확인할 수 있다. 


GCP 자연어 API를 이용한 구문 분석 결과


앞에서 말했다시피 현재 GCP 자연어 API에서는 위 3개 메서드(감성 분석, 엔터티 분석, 구문 분석)에 대해서만 다국어 분석을 지원하고, 나머지 2개 메서드(엔터티 감성 분석, 내용 분류)는 영어만 분석 가능하다. 영어 분석만 가능한 메서드에 대해서는 Yelp에서 제공하는 이탈리안 레스토랑에 대한 실제 리뷰글을 인풋으로 활용해 보겠다.


Came for dinner, $70 coupon clutched in hand. One server--the owner--coping with a growing crowd and doing very well. House wine is cheap and good, appetizers (warm funghi salad) excellent, but my steak frites was way overdone and piled atop what looked like frozen fries. My wife's pasta ($17) was, she said, very good. Our shared dessert--a lime tart--was excellent. So overall, pretty good.



4. 엔터티 감성 분석 결과 (영어)


엔터티 감성분석은 1. 감성 분석 + 2. 엔터티 분석으로, 각 엔터티 별로 감성 분석 결과를 반환해 주는 메서드이다. 현재 이 기능은 'Try the API'에서는 확인해 볼 수 없기에 Python에서 API를 호출하여 분석을 수행했다(Jupyter notebook 이용). 


아래 결과를 보면 엔터티 분석에서와 마찬가지로 salience의 값이 높은 엔터티부터 순서대로 출력되는 것을 알 수 있다. 문장 내에서의 엔터티 위치를 알고 싶다면 'begin offset' 항목을 확인해 보면 되겠다. 이 항목은 해당 엔터티가 몇 음절에서 시작되는지를 알려주는 정보다. 여기서는 'coupon', 'dinner', 'hand'가 동일하게 가장 높은 salience 값을 보이는데 분석 결과의 신뢰도가 좀 의심스럽다.


sentiment에 대한 값은 전체 16개 엔터티 중에 6개('steak frites', 'appetizers', 'salad', 'dessert', 'wife' 'pasta')만이 포함하고 있었다. 그런데 이 중 'appetizers', 'dessert', 'wife', 'pasta'의 sentiment score와 magnitude 값이 모두 약 0.1로 동일하다. 그리고 6개 모두 sentiment score와 magnitude 값이 동일한 것이 이상하다. 

  

GCP 자연어 API를 이용한 엔터티 감성 분석 결과(영어)


5. 내용 분류 결과 (영어)


내용 분류는 텍스트 내용을 분석하여 해당하는 카테고리 정보를 반환한다. 어떤 카테고리가 있는지에 대한 정보는 여기에서 확인할 수 있다. 위 영어 문서에 대한 내용 분류 결과는 0.5의 신뢰도로 'Food & Drink'이다. 'Italian restaurant'라는 카테고리가 없다는 것을 감안했을 때 괜찮은 결과다. 여러 번 해 보니 문장이 너무 짧으면 카테고리를 찾아내지 못한다.


GCP 자연어 API를 이용한 내용 분류 결과(영어)




구글의 자연어 처리 기술에 대해 간략하게 살펴봤는데, 생각보다 세심한 분석은 아직 불가능한 것 같다. 자연어 API는 구글 검색 엔진과 구글 어시스턴트에서 사용되는 언어 이해 시스템과 동일한 머신 러닝(그리고 딥러닝) 기술을 활용하고 있다고 하는데, 이에 대해 계속해서 스터디해 볼 예정이다.  

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari