Cloud Natural Language API를 사용한 항목, 감정, 구문 분석

Cloud Natural Language API를 사용하면 텍스트에서 항목을 추출하고 감정 및 구문 분석을 수행하며 텍스트를 카테고리로 분류할 수 있습니다.

이 실습에서는 Natural Language API를 사용하여 항목, 감정 및 구문을 분석하는 방법을 알아봅니다.

학습할 내용

  • Natural Language API 요청 만들기 및 curl로 API 호출하기
  • Natural Language API를 사용하여 텍스트에서 항목 추출하기 및 감정 분석 실행하기
  • Natural Language API를 사용하여 텍스트에서 언어 분석 수행하기
  • 여러 언어로 Natural Language API 요청 만들기

필요한사항

  • Google Cloud Platform 프로젝트
  • 브라우저(Chrome, Firefox 등)

이 튜토리얼을 어떻게 사용하실 계획인가요?

읽기만 할 계획입니다. 읽은 다음 연습 활동을 완료할 계획입니다.

귀하의 Google Cloud Platform 사용 경험을 평가해 주세요.

초급 중급 고급

자습형 환경 설정

아직 Google 계정 (Gmail 또는 Google Apps)이 없으면 계정을 만들어야 합니다. Google Cloud Platform 콘솔 (console.cloud.google.com)에 로그인하고 새 프로젝트를 만듭니다.

Screenshot from 2016-02-10 12:45:26.png

모든 Google Cloud 프로젝트에서 고유한 이름인 프로젝트 ID를 기억하세요(위의 이름은 이미 사용되었으므로 사용할 수 없습니다). 이 ID는 나중에 이 Codelab에서 PROJECT_ID라고 부릅니다.

그런 다음 Google Cloud 리소스를 사용할 수 있도록 Cloud 콘솔에서 결제를 사용 설정해야 합니다.

이 codelab을 실행하는 과정에는 많은 비용이 들지 않지만 더 많은 리소스를 사용하려고 하거나 실행 중일 경우 비용이 더 들 수 있습니다(이 문서 마지막의 '삭제' 섹션 참조).

Google Cloud Platform 신규 사용자는 $300 상당의 무료 체험판을 사용할 수 있습니다.

화면 왼쪽 상단의 메뉴 아이콘을 클릭합니다.

드롭다운에서 API 및 서비스를 선택하고 대시보드를 클릭합니다.

API 및 서비스 사용 설정을 클릭합니다.

그런 다음 검색창에 '언어'를 검색합니다. Google Cloud Natural Language API를 클릭합니다.

사용 설정을 클릭하여 Cloud Natural Language API를 사용 설정합니다.

사용 설정될 때까지 몇 초간 기다립니다. 사용 설정되면 다음이 표시됩니다.

Google Cloud Shell은 Cloud에서 실행되는 명령줄 환경입니다. 이 Debian 기반 가상 머신은 필요한 모든 개발 도구 (gcloud, bq, git 등)와 함께 로드되며, 영구 5GB 홈 디렉터리를 제공합니다. Cloud Shell을 사용하여 Natural Language API에 대한 요청을 만듭니다.

Cloud Shell을 시작하려면 헤더 바의 오른쪽 상단에 있는 'Google Cloud Shell 활성화' Screen Shot 2015-06-08 at 5.30.32 PM.png 아이콘을 클릭합니다.

콘솔 하단에 있는 새 프레임 내에 Cloud Shell 세션이 열리면서 명령줄 프롬프트가 표시됩니다. user@project:~$ 프롬프트가 표시될 때까지 기다립니다.

Natural Language API로 요청을 전송하기 위해 curl을 사용할 것이므로, 요청 URL에 전달할 API 키를 만들어야 합니다. API 키를 만들려면 Cloud 콘솔의 API 및 서비스 사용자 인증 정보 섹션으로 이동하세요.

드롭다운 메뉴에서 API 키를 선택합니다.

방금 만든 키를 복사합니다. 이 키는 나중에 실습에서 필요합니다.

이제 API 키가 있으므로 각 요청에 API 키의 값을 삽입하지 않도록 환경 변수에 저장하겠습니다. Cloud Shell에서 이 작업을 수행할 수 있습니다. <your_api_key>를 방금 복사한 키로 대체해야 합니다.

export API_KEY=<YOUR_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에 대한 요청을 빌드합니다. Cloud Shell 환경에서 아래 코드를 사용하여 request.json 파일을 생성합니다. nano, vim, emacs와 같이 원하는 명령줄 편집기를 사용하거나 Cloud Shell의 기본 Orion 편집기를 사용할 수 있습니다.

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"
}

요청에서는 전송할 텍스트에 대한 사항을 Natural Language API에 알립니다. 지원되는 유형 값은 PLAIN_TEXT 또는 HTML입니다. 콘텐츠(content)에서는 Natural Language API에 전송하여 분석하려는 텍스트를 전달합니다. 또한 Natural Language API는 Cloud Storage에 저장된 파일을 전송하여 텍스트 처리를 할 수 있도록 지원합니다. Cloud Storage에서 파일을 전송하려면 contentgcsContentUri로 바꾸고 Cloud Storage의 텍스트 파일로 연결되는 URI 값으로 지정해야 합니다. encodingType은 API에 텍스트를 처리할 때 사용할 텍스트 인코딩 유형을 알려줍니다. API는 이를 사용하여 특정 항목이 텍스트의 어느 위치에 포함되는지 계산합니다.

이제 아래 curl 명령어를 사용하여 이전에 저장한 API 키 환경 변수와 함께 요청 본문을 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

대답의 시작 부분이 다음과 같이 표시됩니다.

{
  "entities": [
     {
      "name": "Robert Galbraith",
      "type": "PERSON",
      "metadata": {
        "mid": "/m/042xh",
        "wikipedia_url": "https://en.wikipedia.org/wiki/J._K._Rowling"
      },
      "salience": 0.7980405,
      "mentions": [
        {
          "text": {
            "content": "Joanne Rowling",
            "beginOffset": 0
          },
          "type": "PROPER"
        },
        {
          "text": {
            "content": "Rowling",
            "beginOffset": 53
          },
          "type": "PROPER"
        },
        {
          "text": {
            "content": "novelist",
            "beginOffset": 96
          },
          "type": "COMMON"
        },
        {
          "text": {
            "content": "Robert Galbraith",
            "beginOffset": 65
          },
          "type": "PROPER"
        }
      ]
    },

    ...
  ]
}

응답의 각 항목에서 항목 type, 연결된 Wikipedia URL(있는 경우), salience, 텍스트에서 항목이 나타난 위치의 색인을 가져옵니다. Salience는 텍스트 전체에 대한 항목의 중심을 가리키는 [0,1] 범위의 숫자입니다. Natural Language API는 다른 방식으로 언급된 동일한 항목을 인식할 수도 있습니다. 응답에서 mentions 목록을 확인해 봅니다. API는 'Joanne Rowling', 'Rowling', 'novelist' 및 'Robert Galbriath'가 모두 같은 사람임을 판단할 수 있습니다.

항목 추출 외에도 Natural Language API를 사용하면 텍스트 블록에서 감정 분석을 수행할 수 있습니다. JSON 요청에는 위 요청과 동일한 매개변수가 포함되지만, 이번에는 텍스트를 변경하여 더 강한 감정이 포함되도록 하겠습니다. request.json 파일을 다음으로 바꾸고 아래 content을 원하는 텍스트로 바꿔도 됩니다.

request.json

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

그런 다음 요청을 API의 analyzeSentiment 엔드포인트에 전송합니다.

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

다음과 같은 응답이 나타납니다.

{
  "documentSentiment": {
    "magnitude": 0.8,
    "score": 0.4
  },
  "language": "en",
  "sentences": [
    {
      "text": {
        "content": "Harry Potter is the best book.",
        "beginOffset": 0
      },
      "sentiment": {
        "magnitude": 0.7,
        "score": 0.7
      }
    },
    {
      "text": {
        "content": "I think everyone should read it.",
        "beginOffset": 31
      },
      "sentiment": {
        "magnitude": 0.1,
        "score": 0.1
      }
    }
  ]
}

두 가지 감정 값이 반환되는 것을 알 수 있는데, 하나는 문서 전체의 감정이고 다른 하나는 문장별로 나눠진 감정입니다. 감정 메서드는 scoremagnitude의 두 값을 반환합니다. score는 -1.0~1.0 사이의 수치로, 표현이 긍정적이거나 부정적인 정도를 나타냅니다. magnitude는 0에서 무한대에 이르는 수치로, 긍정적이거나 부정적인 정도와 상관없이 진술에 표현된 감정의 비중을 나타냅니다. 가중치가 높은 표현이 있는 텍스트 블록의 길이가 길수록 magnitude 값이 커집니다. 첫 번째 문장의 점수는 긍정적 (0.7)이지만 두 번째 문장의 점수는 중립적 (0.1)입니다.

NL API에 전송하는 전체 텍스트 문서의 감정 세부정보를 제공하는 것 외에도, 텍스트의 항목별로도 감정을 분석할 수 있습니다. 다음 문장을 예로 사용해 보겠습니다.

I liked the sushi but the service was terrible.

이 경우, 위에서처럼 전체 문장의 감정 점수를 가져오는 것이 그리 유용하지 않을 수도 있습니다. 이 문장이 식당 리뷰이고 동일한 식당에 대해 수백 개의 리뷰가 있다면, 여러분은 리뷰에서 정확하게 어떤 부분을 사람들이 좋아하고 싫어했는지 알고 싶을 것입니다. 다행히도 NL API에는 텍스트의 각 항목에 대한 감정을 얻을 수 있는 analyzeEntitySentiment라는 메서드가 있습니다. 위 문장으로 request.json을 업데이트하여 사용해 보세요.

request.json

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

그런 다음 다음 curl 명령어를 사용하여 analyzeEntitySentiment 엔드포인트를 호출합니다.

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

응답에서 두 개의 항목 객체, 'sushi'에 대한 객체와 'service'에 대한 객체가 반환됩니다. 전체 JSON 응답은 다음과 같습니다.

{
  "entities": [
    {
      "name": "sushi",
      "type": "CONSUMER_GOOD",
      "metadata": {},
      "salience": 0.52716845,
      "mentions": [
        {
          "text": {
            "content": "sushi",
            "beginOffset": 12
          },
          "type": "COMMON",
          "sentiment": {
            "magnitude": 0.9,
            "score": 0.9
          }
        }
      ],
      "sentiment": {
        "magnitude": 0.9,
        "score": 0.9
      }
    },
    {
      "name": "service",
      "type": "OTHER",
      "metadata": {},
      "salience": 0.47283158,
      "mentions": [
        {
          "text": {
            "content": "service",
            "beginOffset": 26
          },
          "type": "COMMON",
          "sentiment": {
            "magnitude": 0.9,
            "score": -0.9
          }
        }
      ],
      "sentiment": {
        "magnitude": 0.9,
        "score": -0.9
      }
    }
  ],
  "language": "en"
}

'sushi'에 대해 반환된 점수는 0.9이지만, 'service'에 대해서는 -0.9가 반환되었음을 알 수 있습니다. 아주 잘 분석하죠! 또한 항목별로 반환된 감정 개체가 2개임을 알 수 있습니다. 이러한 용어 중 하나가 두 번 이상 언급된 경우, API는 항목에 대한 집계된 감정과 함께 각 언급에 대해 다른 감정 score와 magnitude를 반환합니다.

Natural Language API의 세 번째 메서드인 구문 주석을 살펴보면서 텍스트의 언어적 세부사항을 자세히 알아보겠습니다. analyzeSyntax는 텍스트의 의미론적 요소와 구문 요소에 관한 전체 세부정보를 제공하는 메서드입니다. API는 텍스트의 각 단어에 대해 단어의 품사 (명사, 동사, 형용사 등)와 문장에서 다른 단어와의 관계 (어근 동사인지 또는 수식어인지)를 알려줍니다.

간단한 문장으로 시험해 보겠습니다. JSON 요청은 위의 요청과 비슷하지만 특성 키가 추가되어 있습니다. 따라서 API에 구문 주석 추가를 수행하고 싶다는 점을 전달하게 됩니다. request.json을 다음으로 바꿉니다.

request.json

{
  "document":{
    "type":"PLAIN_TEXT",
    "content": "Hermione often uses her quick wit, deft recall, and encyclopaedic knowledge to help Harry and Ron."
  },
  "encodingType": "UTF8"
}

그런 다음 API의 analyzeSyntax 메서드를 다음과 같이 호출합니다.

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

대답에서 문장의 각 토큰마다 아래와 같은 객체를 반환합니다. 여기서는 'uses'라는 단어에 대한 대답을 살펴보겠습니다.

{
  "text": {
    "content": "uses",
    "beginOffset": 15
  },
  "partOfSpeech": {
    "tag": "VERB",
    "aspect": "ASPECT_UNKNOWN",
    "case": "CASE_UNKNOWN",
    "form": "FORM_UNKNOWN",
    "gender": "GENDER_UNKNOWN",
    "mood": "INDICATIVE",
    "number": "SINGULAR",
    "person": "THIRD",
    "proper": "PROPER_UNKNOWN",
    "reciprocity": "RECIPROCITY_UNKNOWN",
    "tense": "PRESENT",
    "voice": "VOICE_UNKNOWN"
  },
    "dependencyEdge": {
      "headTokenIndex": 2,
      "label": "ROOT"
    },
    "lemma": "use"
}

대답을 분석해 보겠습니다. partOfSpeech은 각 단어에 관한 언어적 세부정보를 제공합니다 (영어 또는 이 특정 단어에 적용되지 않으므로 알 수 없는 경우가 많음). tag는 이 단어의 품사(이 경우 동사)를 나타냅니다. 또한 시제, 양태, 단수인지 복수인지에 관한 세부정보도 가져옵니다. lemma은 단어의 기본형입니다('uses'의 경우 'use'). 예를 들어 run, runs, ran, running의 기본형은 모두 run입니다. lemma 값은 분량이 많은 텍스트에서 단어의 어커런스를 점차적으로 추적하는 데 유용합니다.

dependencyEdge에는 텍스트의 종속 항목 파싱 트리를 만드는 데 사용할 수 있는 데이터가 있습니다. 이는 문장 내 개별 단어가 서로 어떻게 연관되는지를 보여주는 다이어그램입니다. 위 문장의 종속 항목 파싱 트리는 다음과 같습니다.

위의 대답에 있는 headTokenIndex은 'uses'를 가리키는 호가 있는 토큰의 색인입니다. 문장의 각 토큰을 배열의 단어로 생각할 수 있으며, 'uses'의 headTokenIndex 2는 트리에서 연결된 단어인 'often'을 나타냅니다.

Natural Language API는 영어 이외의 언어도 지원합니다 (여기에서 전체 목록 확인). 일본어 문장으로 다음 항목 요청을 시도해 보겠습니다.

request.json

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

API에 어떤 언어의 텍스트인지 알려주지 않아도 자동으로 언어를 감지할 수 있습니다. 그런 다음 analyzeEntities 엔드포인트에 전송합니다.

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

다음은 대답의 처음 두 항목입니다.

{
  "entities": [
    {
      "name": "日本",
      "type": "LOCATION",
      "metadata": {
        "mid": "/m/03_3d",
        "wikipedia_url": "https://en.wikipedia.org/wiki/Japan"
      },
      "salience": 0.23854347,
      "mentions": [
        {
          "text": {
            "content": "日本",
            "beginOffset": 0
          },
          "type": "PROPER"
        }
      ]
    },
    {
      "name": "グーグル",
      "type": "ORGANIZATION",
      "metadata": {
        "mid": "/m/045c7b",
        "wikipedia_url": "https://en.wikipedia.org/wiki/Google"
      },
      "salience": 0.21155767,
      "mentions": [
        {
          "text": {
            "content": "グーグル",
            "beginOffset": 9
          },
          "type": "PROPER"
        }
      ]
    },
    ...
  ]
  "language": "ja"
}

API는 일본을 위치로, Google을 조직으로 추출하고 각 항목의 Wikipedia 페이지를 추출합니다.

지금까지 Cloud Natural Language API를 통해 항목을 추출하고, 감정을 분석하고, 구문 주석을 추가하여 텍스트를 분석하는 방법을 알아보았습니다.

학습한 내용

  • Natural Language API 요청 만들기 및 curl로 API 호출하기
  • Natural Language API를 사용하여 텍스트에서 항목 추출하기 및 감정 분석 실행하기
  • 텍스트에 언어 분석을 수행한 후 종속 항목 파싱 트리 생성하기
  • 일본어로 Natural Language API 요청 만들기

다음 단계