В Code For Africa мы часто сталкиваемся с ситуациями, когда нам нужно работать с неструктурированными данными: документами в формате PDF, новостными статьями и публикациями в социальных сетях. Мы используем множество методов, инструментов и API для количественной оценки этих данных и извлечения из них сущностей.

Мы с Евой были приглашены на Dev-Craft 2016, чтобы провести сессию, посвященную инструментам языковой обработки, которыми могут воспользоваться разработчики. Мы решили охватить IBM AlchemyAPI и Polyglot для анализа настроений и извлечения сущностей. Мы провели практическое занятие, на котором создали простые рабочие инструменты, использующие возможности обработки естественного языка. Вот что было покрыто:

AlchemyAPI с Javascript

Документация по API: http://www.ibm.com/watson/developercloud/alchemy-language/api/v1/

1) Перейдите на http://www.alchemyapi.com/ и получите ключ API.

2) Рабочая область: http://jsfiddle.net/mevey/wgL0vmy4/43/

  • Предварительно заполненный HTML и CSS вверху слева и справа
  • Изменить Javascript внизу слева
  • Результаты внизу справа

3) В разделе Javascript на JS-Fiddle введите ключ API Alchemy.

key = 'xxxx1112223333'

4) Заполните URL-адреса API для каждой конечной точки. Ссылка: http://www.ibm.com/watson/developercloud/alchemy-language/api/v1/#sentiment

sentiment_api = 'https://gateway-a.watsonplatform.net/calls/url/URLGetTextSentiment?outputMode=json&apikey=' + key
entities_api = 'https://gateway-a.watsonplatform.net/calls/url/URLGetRankedNamedEntities?outputMode=json&sentiment=1&apikey=' + key

5) На своем терминале используйте curl для проверки URL-адресов и просмотра формата ответа.

curl -X POST \
-d "outputMode=json" \
-d "url=http://www.huffingtonpost.com/2010/06/22/iphone-4-review-the-worst_n_620714.html" \
"https://gateway-a.watsonplatform.net/calls/url/URLGetTextSentiment?apikey=xxx111222333"
curl -X POST \
-d "outputMode=json" \
-d "maxRetrieve=3" \
-d "url=http://www-03.ibm.com/press/us/en/pressrelease/49384.wss" \
"https://gateway-a.watsonplatform.net/calls/url/URLGetRankedNamedEntities?apikey=xxx111222333"

6) Пример формата ответа:

{
    "status": "OK",
    "usage": "By accessing AlchemyAPI or using information generated by AlchemyAPI, you are agreeing to be bound by the AlchemyAPI Terms of Use: http://www.alchemyapi.com/company/terms.html",
    "totalTransactions": "1",
    "language": "english",
    "docSentiment": {
        "score": "0.603233",
        "type": "positive"
    }
}

7) Вернувшись в JS-Fiddle, напишите код Javascript, чтобы сделать запрос к API.

$.ajax({
        method: "POST",
        url: sentiment_api + outputMode,
        data: $('#form').serialize(),
        contentType: 'application/x-www-form-urlencoded',
        success: function(msg) {
        // Write your response handling code here
        }
      });

8) Продолжайте и отобразите свой результат (№ 6 выше) на HTML-странице.

9) Пример обработки ответа для анализа настроений:

//Sentiment Analysis
       $.ajax({
        method: "POST",
        url: sentiment_api + outputMode,
        data: $('#form').serialize(),
        contentType: 'application/x-www-form-urlencoded',
        success: function(msg) {

          $('#sentiment-results').html('<span>' + msg.docSentiment.type + '</span> with a score of <span>' + msg.docSentiment.score + '</span>')

        }
      });
      //Entity extraction
      $.ajax({
        method: "POST",
        url: entities_api + outputMode,
        data: $('#form').serialize(),
        contentType: 'application/x-www-form-urlencoded',
        success: function(msg) {

            markup = ''
            for (k in msg.entities) {
                v = msg.entities[k]
                markup += '<span>Text: ' + v.text + '</span>  <span>count: ' + v.count + '</span>  <span>Type: ' + v.type + '</span>  Relevance: <span>' + v.relevance + '</span>  Sentiment: <span>' + v.sentiment.type + '</span><br>'
            }
            $('#entities-results').html(markup)

        }
      });

10) Добавьте еще один обработчик ответов для извлечения сущностей.

11) Тест.

Полиглот (с Python)

1) Клонируйте репозиторий github: https://github.com/CodeForAfricaLabs/sentiment_icebreaker

git clone https://github.com/CodeForAfricaLabs/sentiment_icebreaker

1) Получите ключи Twitter API.

  • Создайте новое приложение Twitter здесь: https://apps.twitter.com/
  • Получите Consumer Key, Consumer secret на вкладке «Ключи и токены доступа».
  • Обновите разрешения, чтобы разрешить «Чтение, запись и доступ к прямым сообщениям».
  • Сгенерируйте токены доступа и получите «Токен доступа» и «Секрет токена доступа».

2) Скопируйте учетные данные twitter API в файл конфигурации: twitter_/config.py.

TW_AUTH_CREDENTIALS['consumer_key'] = ""   # Consumer Key (API Key)
TW_AUTH_CREDENTIALS['consumer_secret'] = ""   # Consumer Secret (API Secret)
TW_AUTH_CREDENTIALS['access_token_key'] = ""  # Access Token
TW_AUTH_CREDENTIALS['access_token_secret'] = ""  # Access Token Secret

3) [НЕОБЯЗАТЕЛЬНО] Создайте виртуальную среду Python.

pip install virtualenv
virualenv /path/to/your/env

4) Откройте корневую директорию сентимент_ледокол.

cd sentiment_icebreaker

5) Установите зависимости Python

pip install -r requirements.txt

⚠️ Зависимости от OSX:

CFLAGS=-I/usr/local/opt/icu4c/include LDFLAGS=-L/usr/local/opt/icu4c/lib pip install pyicu

⚠️ Зависимости Ubuntu:

sudo apt-get install libicu-dev

6) Установите языковые пакеты полиглот

make install-language-packs

7) Откройте twitter_/listener.py: выполните определение языка.

msg_text = payload["message"]
language_detector = Detector(msg_text)
language = language_detector.language.name

8) Проведите анализ настроений

try:
    msg_polarity = Text(msg_text).polarity
except ZeroDivisionError:
    msg_polarity = 0

9) Выполните извлечение сущности

msg_entities = []
for entity in Text(msg_text).entities:
    msg_entities.append(entity)

10) Изменить вопрос на HTML: web/app/templates/index.html

<center><h1 class="question">Tell us what you think about this session.</h1></center>

11) Запустите прослушиватель потока прямых сообщений Twitter:

make start

12) Запустите веб-сервер Flask:

make webserver

⚠️ Если у вас возникли проблемы с импортом,

export PYTHONPATH=/location/of/your/project/

⚠️ Если у вас возникла проблема с расположением файла журнала

mkdir -p /location/of/your/project/sentiment_icebreaker/logs

💡 Журналы хвоста, чтобы увидеть активность приложения:

tail -f logs/twitter-stream.log

Полезные ресурсы