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 앱)이 아직 없다면 계정을 만들어야 합니다. Google Cloud Platform Console (console.cloud.google.com)에 로그인하여 새 프로젝트를 만듭니다.

2016-02-10 12:45:26.png 스크린샷

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

다음으로 Google Cloud 리소스를 사용하려면 Cloud Console에서 결제를 사용 설정해야 합니다.

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

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

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

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

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

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

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

사용 설정될 때까지 몇 초 정도 기다립니다. 사용 설정이 완료되면 다음과 같이 표시됩니다.

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

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

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

curl을 사용하여 Natural Language API에 요청을 보낼 것이므로 요청 URL을 전달할 API 키를 생성해야 합니다. API 키를 만들려면 Cloud Console에서 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.

Natural Language API에 대한 요청을 request.json 파일에 빌드합니다. 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 키 환경 변수와 함께 요청 본문을 모든 단일 명령줄에 전달할 수 있습니다.

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, 연결된 위키백과 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).

Google은 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

응답에서 두 개의 항목 객체를 반환합니다. 하나는 '스시' 및 '서비스'. 전체 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"
}

'스시'에서 반환된 점수는 0.9였고, '서비스'는 -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

응답은 문장의 각 토큰에 대해 다음과 같은 객체를 반환해야 합니다. 여기에서 '{quot;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는 단어의 표준 형태입니다(“quot;uses"s"use"). 예를 들어 run, runs, ranrunning이 모두 run입니다. lemma 값은 시간이 지나면서 분량이 커진 텍스트에서 단어가 등장한 횟수를 추적하는 데 유용합니다.

dependencyEdge에는 텍스트의 종속 항목 파싱 트리를 만드는 데 사용할 수 있는 데이터가 포함됩니다. 이 문장은 각 문장의 단어가 서로 어떻게 연관되어 있는지 보여줍니다. 위 문장의 종속 항목 파싱 트리는 다음과 같습니다.

위 응답의 headTokenIndex는 "uses"를 가리키는 아치가 있는 토큰의 색인입니다. 문장의 각 토큰은 배열에 있는 단어로 간주할 수 있으며, "uses&quot를 나타내는 2의 headTokenIndex는 트리에서 연결된 'often,&quot'라는 단어를 나타냅니다.

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는 일본을 위치 및 조직으로 추출하고 각각에 대한 Wikipedia 페이지를 가져옵니다.

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

학습한 내용

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

다음 단계