Анализ сущностей, настроений и синтаксиса с помощью Cloud Natural Language API

Cloud Natural Language API позволяет извлекать сущности из текста, выполнять тональный и синтаксический анализ, а также классифицировать текст по категориям.

В этой лабораторной работе мы узнаем, как использовать API естественного языка для анализа сущностей, тональности и синтаксиса.

Что вы узнаете

  • Создание запроса API на естественном языке и вызов API с помощью curl
  • Извлечение сущностей и запуск анализа тональности текста с помощью Natural Language API
  • Выполнение лингвистического анализа текста с помощью Natural Language API
  • Создание запроса API на естественном языке на другом языке

Что вам понадобится

  • Проект облачной платформы Google
  • Браузер, такой как Chrome или Firefox

Как вы будете использовать этот учебник?

Прочитайте только это Прочтите его и выполните упражнения

Как бы вы оценили свой опыт работы с Google Cloud Platform?

Новичок Средний Опытный

Самостоятельная настройка среды

Если у вас еще нет учетной записи Google (Gmail или Google Apps), вы должны создать ее. Войдите в консоль Google Cloud Platform ( console.cloud.google.com ) и создайте новый проект:

Скриншот от 10 февраля 2016 г., 12:45:26.png

Запомните идентификатор проекта, уникальное имя для всех проектов Google Cloud (имя выше уже занято и не будет работать для вас, извините!). Позже в этой кодовой лаборатории он будет упоминаться как PROJECT_ID .

Затем вам нужно включить выставление счетов в облачной консоли, чтобы использовать ресурсы Google Cloud.

Прохождение этой кодовой лаборатории не должно стоить вам больше нескольких долларов, но может стоить больше, если вы решите использовать больше ресурсов или оставите их работающими (см. раздел «Очистка» в конце этого документа).

Новые пользователи Google Cloud Platform имеют право на бесплатную пробную версию стоимостью 300 долларов США .

Нажмите на значок меню в левом верхнем углу экрана.

Выберите API и сервисы из раскрывающегося списка и нажмите «Панель инструментов».

Нажмите «Включить API и службы ».

Затем найдите «язык» в поле поиска. Нажмите на Google Cloud Natural Language API :

Нажмите « Включить », чтобы включить Cloud Natural Language API:

Подождите несколько секунд, пока он не включится. Вы увидите это, как только он будет включен:

Google Cloud Shell — это среда командной строки, работающая в облаке . Эта виртуальная машина на основе Debian загружена всеми необходимыми инструментами разработки ( gcloud , bq , git и другими) и предлагает постоянный домашний каталог размером 5 ГБ. Мы будем использовать Cloud Shell для создания нашего запроса к Natural Language API.

Чтобы начать работу с Cloud Shell, нажмите «Активировать Google Cloud Shell». Снимок экрана 08.06.2015, 17:30:32.png значок в правом верхнем углу панели заголовка

Сеанс Cloud Shell открывается внутри нового фрейма в нижней части консоли и отображает приглашение командной строки. Подождите, пока не появится приглашение user@project:~$

Поскольку мы будем использовать curl для отправки запроса к API естественного языка, нам нужно сгенерировать ключ API для передачи в URL-адрес нашего запроса. Чтобы создать ключ API, перейдите в раздел «Учетные данные» API и сервисов в вашей облачной консоли:

В выпадающем меню выберите ключ API :

Затем скопируйте только что сгенерированный ключ. Этот ключ понадобится вам позже в лаборатории.

Теперь, когда у вас есть ключ API, сохраните его в переменной среды, чтобы не вставлять значение вашего ключа API в каждый запрос. Это можно сделать в Cloud Shell. Обязательно замените <your_api_key> только что скопированным ключом.

export API_KEY=<YOUR_API_KEY>

Первый метод API естественного языка, который мы будем использовать, — analyzeEntities . С помощью этого метода API может извлекать объекты (такие как люди, места и события) из текста. Чтобы попробовать анализ сущностей API, мы будем использовать следующее предложение:

Джоан Роулинг, пишущая под псевдонимами Дж. К. Роулинг и Роберт Гэлбрейт, — британская писательница и сценарист, написавшая серию фэнтези о Гарри Поттере.

Мы построим наш запрос к Natural Language API в файле request.json . В среде Cloud Shell создайте файл request.json с приведенным ниже кодом. Вы можете создать файл с помощью одного из предпочитаемых вами редакторов командной строки (nano, vim, emacs) или использовать встроенный редактор Orion в Cloud Shell:

запрос.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 для анализа. API Natural Language также поддерживает отправку файлов, хранящихся в облачном хранилище, для обработки текста. Если бы мы хотели отправить файл из облачного хранилища, мы бы заменили content на gcsContentUri и присвоили ему значение uri нашего текстового файла в облачном хранилище. encodingType сообщает API, какой тип кодировки текста использовать при обработке нашего текста. API будет использовать это для вычисления того, где в нашем тексте появляются определенные объекты.

Теперь вы можете передать тело запроса вместе с сохраненной ранее переменной среды ключа API в API естественного языка с помощью следующей команды curl (все в одной командной строке):

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 и индексы того, где эта сущность появляется в тексте. Важность — это число в диапазоне [0,1], которое указывает на центральное положение объекта по отношению к тексту в целом. API естественного языка также может распознавать один и тот же объект, упоминаемый по-разному. Взгляните на список mentions в ответе: ​API может сказать, что «Джоанна Роулинг», «Роулинг», «писатель» и «Роберт Гэлбриат» указывают на одно и то же.

В дополнение к извлечению сущностей, Natural Language API также позволяет выполнять анализ тональности блока текста. Наш запрос JSON будет включать те же параметры, что и наш запрос выше, но на этот раз мы изменим текст, чтобы включить что-то более сильное. Замените файл request.json следующим и не стесняйтесь заменять content ниже своим собственным текстом:

запрос.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
      }
    }
  ]
}

Обратите внимание, что мы получаем два типа значений тональности: тональность для нашего документа в целом и тональность с разбивкой по предложениям. Метод сентиментов возвращает два значения: score и magnitude . score — это число от -1,0 до 1,0, указывающее, насколько утверждение положительное или отрицательное. magnitude — это число в диапазоне от 0 до бесконечности, представляющее вес настроения, выраженного в утверждении, независимо от того, положительное оно или отрицательное. Более длинные блоки текста с сильно взвешенными утверждениями имеют более высокие значения амплитуды. Оценка для нашего первого предложения положительна (0,7), тогда как оценка для второго предложения нейтральна (0,1).

В дополнение к предоставлению сведений о тональности всего текстового документа, который мы отправляем NL API, он также может разбивать тональность по сущностям в нашем тексте. Давайте используем это предложение в качестве примера:

Мне понравились суши, но обслуживание было ужасным .

В этом случае получение оценки тональности для всего предложения, как мы сделали выше, может оказаться не столь полезным. Если бы это был обзор ресторана и были сотни отзывов об одном и том же ресторане, мы хотели бы точно знать, что людям понравилось и что не понравилось в их отзывах. К счастью, в NL API есть метод, который позволяет нам получить тональность для каждой сущности в нашем тексте, который называется analyzeEntitySentiment . Обновите ваш request.json предложением выше, чтобы попробовать:

запрос.json

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

Затем вызовите конечную точку analyzeEntitySentiment с помощью следующей команды curl:

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. Прохладный! Вы также можете заметить, что для каждой сущности возвращаются два объекта тональности. Если какой-либо из этих терминов упоминается более одного раза, API будет возвращать разные оценки тональности и величину для каждого упоминания, а также совокупную тональность для объекта.

Рассматривая третий метод API Natural Language — синтаксическую аннотацию — мы углубимся в лингвистические детали нашего текста. analyzeSyntax — это метод, предоставляющий полный набор сведений о семантических и синтаксических элементах текста. Для каждого слова в тексте API сообщит нам часть речи (существительное, глагол, прилагательное и т. д.) и как оно связано с другими словами в предложении (это корень глагола? модификатор?).

Давайте попробуем это с простым предложением. Наш запрос JSON будет похож на приведенный выше, с добавлением ключа функций. Это сообщит API, что мы хотели бы выполнить синтаксическую аннотацию. Замените ваш request.json следующим:

запрос.json

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

Затем analyzeSyntax метод analysisSyntax API:

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

Ответ должен возвращать объект, подобный приведенному ниже, для каждого токена в предложении. Здесь мы посмотрим на ответ на слово «использует»:

{
  "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 — это каноническая форма слова (для «употреблений» это «использование»). Например, слова run , run , run и running имеют лемму run . Значение леммы полезно для отслеживания появления слова в большом фрагменте текста с течением времени.

dependencyEdge включает данные, которые можно использовать для создания дерева разбора зависимостей текста. Это диаграмма, показывающая, как слова в предложении соотносятся друг с другом. Дерево синтаксического анализа зависимостей для приведенного выше предложения будет выглядеть так:

headTokenIndex в нашем ответе выше — это индекс токена, у которого есть дуга, указывающая на «использование». Мы можем думать о каждой лексеме в предложении как о слове в массиве, а значение headTokenIndex , равное 2, для «использует» относится к слову «часто», с которым оно связано в дереве.

API Natural Language также поддерживает языки, отличные от английского (полный список здесь ). Давайте попробуем следующий запрос объекта с предложением на японском языке:

запрос.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 как организацию, а также страницы Википедии для каждого из них.

Вы узнали, как выполнять анализ текста с помощью Cloud Natural Language API, извлекая сущности, анализируя тональность и делая синтаксические аннотации.

Что мы рассмотрели

  • Создание запроса API на естественном языке и вызов API с помощью curl
  • Извлечение сущностей и запуск анализа тональности текста с помощью Natural Language API
  • Выполнение лингвистического анализа текста для создания деревьев разбора зависимостей
  • Создание запроса API на естественном языке на японском языке

Следующие шаги