Notice
Recent Posts
Recent Comments
Today
Total
04-26 17:29
Archives
관리 메뉴

Jeongchul Kim

Google Cloud Platform 이용한 엔티티와 감정 분석 Natural Language API 본문

Google Cloud Platform

Google Cloud Platform 이용한 엔티티와 감정 분석 Natural Language API

김 정출 2018. 6. 5. 17:37


Google Cloud Platform 이용한 엔티티와 감정 분석 Natural Language API



Google Cloud ML Vision API를 이용한 이미지 텍스트 추출 그리고 번역을 위한 Translation API와 Natural Language API

첫 링크 글에서 API_KEY Set up을 따라하면서 진행해주세요!


Google Cloud Platform 이용한 텍스트 카테고리 분류 Natural Language API

Google Cloud Platform Cloud Vision API를 이용한 이미지, 얼굴 Detection




Natural Language API


Natural Language API 사용 승인

https://console.developers.google.com/apis/api/language.googleapis.com/

사용 설정 버튼을 클릭합니다.



API 사용을 시작합니다.

사용자 인증 정보 만들기

메뉴에서 API 및 서비스를 클릭하고 사용자 인증 정보 버튼을 클릭합니다.


사용자 인증 정보 만들기 버튼을 클릭하여 API 키를 클릭합니다.



API 키 생성 완료로 나온 API 키를 복사합니다.



$ vi ~/.bashrc

맨 밑 줄에

export API_KEY=<YOUR_API_KEY>

저장합니다.

$ source ~/.bashrc

$ echo $API_KEY


엔티티 분석 요청 만들기

우리가 사용할 첫 번째 Natural Language API 메소드는 analyzeEntities입니다. 이 메소드를 사용하면 API가 텍스트에서 인물, 장소 및 이벤트와 같은 엔티티를 추출 할 수 있습니다. API의 엔티티 분석을 시도하기 위해 다음 문장을 사용합니다.


Joanne Rowling, who writes under the pen names J. K. Rowling and Robert Galbraith, is a British novelist and screenwriter who wrote the Harry Potter fantasy series.


request.json 파일에서 Natural Language API에 대한 요청을 작성합니다. 연필 아이콘을 클릭하면 열리는 기본 명령 행 편집기 (nano, vim 또는 emacs) 또는 Cloud Shell 편집기를 사용할 수 있습니다.

$ mkdir natural-language-api && cd natural-language-api

$ vi request.json


{
 "document":{
   "type":"PLAIN_TEXT",
   "content":"Joanne Rowling, who writes under the pen names J. K. Rowling and Robert Galbraith, is a British novelist and screenwriter who wrote the Harry Potter fantasy series."
 },
 "encodingType":"UTF8"
}


파일을 저장합니다.


요청에서 자연어 API에 보낼 텍스트를 알려줍니다. 지원되는 유형 값은 PLAIN_TEXT 또는 HTML입니다. 콘텐츠에서는 분석을 위해 Natural Language API에 보낼 텍스트를 전달합니다. Natural Language API는 텍스트 처리를 위해 Cloud Storage에 저장된 파일을 보낼 수도 있습니다. Cloud Storage에서 파일을 보내려면 gcsContentUri로 콘텐츠를 대체하고 Cloud Storage에 텍스트 파일의 URI 값을 지정합니다. encodingType은 텍스트를 처리 할 때 사용할 텍스트 인코딩 유형을 API에 알려줍니다. API는이 텍스트를 사용하여 텍스트에 특정 엔터티가 표시되는 위치를 계산합니다.


Natural Language API 요청

이전에 저장 한 API 키 환경 변수와 함께 요청 본문을 다음 curl 명령 (하나의 명령 줄에 모두 있음)을 사용하여 Natural Language API에 전달할 수 있습니다.


$ curl "https://language.googleapis.com/v1/documents:analyzeEntities?key=${API_KEY}" -s -X POST -H "Content-Type: application/json" --data-binary @request.json


응답 결과는 다음과 같습니다.

응답의 각 엔티티에 대해 엔티티 유형, 연관된 Wikipedia URL (있는 경우), 중요성 및이 엔티티가 텍스트에 표시된 위치의 인덱스를 가져옵니다. Salience는 텍스트 전체에 대한 엔티티의 중심을 나타내는 [0,1] 범위의 숫자입니다. Natural Language API는 다른 방식으로 언급 된 동일한 개체를 인식 할 수도 있습니다. API는 "Joanne Rowling", "Rowling", "novelist"및 "Robert Galbriath"가 모두 똑같은 것을 가리킨다는 응답에 대한 언급 목록을 살펴봅시다.


한국어로 테스트를 기사 내용을 발췌하였습니다.

“문재인 대통령은 한국 가수 최초 미국 빌보드 1위로 K팝의 역사를 쓴 아이돌그룹 방탄소년단에 축전을 보냈다.”


$ curl "https://language.googleapis.com/v1/documents:analyzeEntities?key=${API_KEY}" -s -X POST -H "Content-Type: application/json" --data-binary @request.json

감정 분석(Sentiment analysis)

엔티티를 추출하는 것 외에도 Natural Language API를 사용하면 텍스트 블록에 대한 감정 분석을 수행 할 수 있습니다. 이 JSON 요청에는 위 요청과 동일한 매개 변수가 포함되지만 이번에는 더 강한 정서가 포함 된 텍스트가 변경됩니다.

sentiment-request.json 파일을 다음으로 바꾸고 아래 내용을 작성합니다.

$ vi sentiment-request.json

{
 "document":{
   "type":"PLAIN_TEXT",
   "content":"Harry Potter is the best book. I think everyone should read it."
 },
 "encodingType": "UTF8"
}


API를 호출해봅시다.

$ curl "https://language.googleapis.com/v1/documents:analyzeSentiment?key=${API_KEY}" -s -X POST -H "Content-Type: application/json" --data-binary @sentiment-request.json


감정 수치의 두 가지 유형, 즉 전체 문서에 대한 감정과 문장으로 구분된 감정을 확인합니다. sentiment method는 두 가지 값을 반환합니다.


score: -1.0에서 1.0 사이의 숫자로 문장의 양수 또는 음수를 나타냅니다.

magnitude: 양수 또는 음수와 관계없이 구문에서 표현된 감정의 무게를 나타내는 0에서 무한대까지의 숫자입니다.


가중치가 높은 명령문이있는 긴 텍스트 블록은 더 큰 값을가집니다. 첫 번째 문장의 점수는 양 (0.7)이고 두 번째 문장의 점수는 중립입니다 (0.1).


이번에는 한국어로 테스트 해보겠습니다.

나는 오늘 기분이 좋다. 너와 함께 하는 이 밤이 길었으면 좋겠어.

결과를 살펴봅시다.

$ curl "https://language.googleapis.com/v1/documents:analyzeSentiment?key=${API_KEY}" -s -X POST -H "Content-Type: application/json" --data-binary @sentiment-request.json


엔티티 감정 분석

Natural Language API는 전체 텍스트 문서에 대한 감정 세부 정보를 제공하는 것 외에도 텍스트의 엔티티에 대한 감정을 분석할 수 있습니다. 예를 들어 다음 문장을 사용해봅시다.


I liked the sushi but the service was terrible.


이 경우, 위에서 한 것처럼 문장 전체에 대한 감정 점수를 얻는 것은 그리 유용하지 않을 수 있습니다. 이것이 식당 리뷰이고 동일한 레스토랑에 대한 수백 개의 리뷰가있는 경우 사람들이 좋아하는 점과 리뷰에서 싫어하는 점을 정확하게 알고 싶을 것입니다. 다행스럽게도 Natural Language API에는 analyzeEntitySentiment라는 텍스트의 각 엔터티에 대한 감정을 얻을 수있는 메서드가 있습니다. 그것이 어떻게 작동하는지 봅시다.


$ vi analyze-entity-sentiment-request.json

{
 "document":{
   "type":"PLAIN_TEXT",
   "content":"I liked the sushi but the service was terrible."
 },
 "encodingType": "UTF8"
}


$ curl "https://language.googleapis.com/v1/documents:analyzeEntitySentiment?key=${API_KEY}" -s -X POST -H "Content-Type: application/json" --data-binary @analyze-entity-sentiment-request.json


"sushi"에 대해 반환 된 점수는 0.9 였지만 "service"에 대한 점수는 -0.9였습니다. 좋습니다. 또한 각 엔터티에 대해 반환되는 두 개의 정서 개체가 있음을 알 수 있습니다. 이 용어 중 하나가 두 번 이상 언급되면 API는 엔티티에 대한 총체적 정서와 함께 각 설명에 대해 서로 다른 감정 점수와 크기를 반환합니다.


한국어로도 테스트해봅시다. -> 지원되지 않습니다.

“그 가게 음식은 맛있는데, 직원 서비스는 별로야.”


한국어는 지원이 되지 않네요..

문법(syntax)와 구문(pos: parts of speech) 분석

Natural Language API의 세 번째 방법 인 텍스트 주석을 살펴보면 텍스트의 언어적인 세부 사항을 더 깊이 파고들 것입니다. annotateText는 텍스트의 의미 및 구문 요소에 대한 전체 세부 정보를 제공하는 고급 방법입니다. 텍스트의 각 단어에 대해 API는 단어의 품사(noun, verb, adjective 등)와 문장의 다른 단어 (이것이 root verb입니까? modifier인가)와 어떻게 관련이 있는지 알려줍니다.


간단한 문장으로 시도해봅시다. 이 JSON 요청은 기능 키가 추가 된 위의 요청과 비슷합니다. 그러면 API에 구문 주석을 수행하고 싶습니다.


$ vi syntax-pos-request.json

{
 "document":{
   "type":"PLAIN_TEXT",
   "content": "Joanne Rowling is a British novelist, screenwriter and film producer."
 },
 "encodingType": "UTF8"
}


$ curl "https://language.googleapis.com/v1/documents:analyzeSyntax?key=${API_KEY}" -s -X POST -H "Content-Type: application/json" --data-binary @syntax-pos-request.json


partOfSpeech: "Joanne"이 명사임을 알려줍니다.


dependencyEdge: 텍스트의 종속성 구문 분석 트리를 만드는 데 사용할 수있는 데이터가 포함되어 있습니다. 본질적으로, 이것은 문장 내의 단어가 서로 어떻게 관련되어 있는지를 보여주는 다이어그램입니다. 위의 문장에 대한 의존성 구문 분석 트리는 다음과 같습니다.


headTokenIndex: "Joanne"을 가리키는 호가있는 토큰의 색인입니다. 문장의 각 토큰을 하나의 단어로 생각할 수 있습니다.

"Joanne"의 headTokenIndex는 트리에 연결된 단어 "Rowling"을 의미합니다. 레이블 NN (명사 화합물 수정 자의 약자)은 문장에서 단어의 역할을 설명합니다. "Joanne"은 문장의 주제 인 "Rowling"을 수정합니다.


lemma: 단어의 표준 형태이다. 예를 들어, 실행, 실행, 실행 및 실행중인 단어에는 실행의 보조 정리가 있습니다. 보조 정리 값은 시간이 지남에 따라 많은 수의 텍스트에서 단어의 발생을 추적하는 데 유용합니다.


Multilingual natural language processing

Natural Language API가 제공하는 언어는 https://cloud.google.com/natural-language/docs/languages 다음의 사이트와 같습니다.


일본어로 테스트를 해볼까요?

$ vi japanese-request.json

{
 "document":{
   "type":"PLAIN_TEXT",
   "content":"日本のグーグルのオフィスは、東京の六本木ヒルズにあります"
 }
}


$ curl "https://language.googleapis.com/v1/documents:analyzeEntities?key=${API_KEY}" -s -X POST -H "Content-Type: application/json" --data-binary @japenese-request.json


포스팅은 여기서 마치겠습니다.



Comments