
В 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
Полезные ресурсы
- Скрипт JS: http://jsfiddle.net/mevey/wgL0vmy4/24/
- Код: https://github.com/CodeForAfricaLabs/sentiment_icebreaker
- Анализ предвыборных настроений УГ: https://goo.gl/jcuJjC
- Алеф: https://data.Investigativecenters.org/
- Алхимический API: http://www.ibm.com/watson/developercloud/alchemy-language/api/v1/
- Полиглот: http://polyglot.readthedocs.io
- Семантрия: https://www.lexalytics.com/semantria
- Языковые API Google: https://cloud.google.com/natural-language
- Слайд-презентация: https://docs.google.com/presentation/d/1efYr_K-Na-T5DkGEUpXDELVpv2esiuGKvsxOG_OSyxQ/

