В этом посте я покажу, как воспользоваться API анализа тональности в социальных медиа на русском языке. Одной из отличительных фич системы является возможность определять тональность по отношению к заданному объекту мониторинга. Проиллюстрирую на примере:

Мне нравится телефон X, но телефон Y ужасен.


Логично ожидать, что если мы интересуемся телефонами X, то хотим получить позитивную метку тональности. И негативную для телефона Y. Именно такой результат вы получите, введя это предложение на сайте www.mashape.com/dmitrykey/russiansentimentanalyzer (понадобится регистрация) и указав в качестве объектов X либо Y.

Ниже вы найдёте пример кода на Java, который позволяет легко подключиться к API, послать запрос и получить результат. Этот и другие примеры взаимодействия с нашими системами можно найти на нашем гитхабе.

package com.semanticanalyzer;

import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.JsonNode;
import com.mashape.unirest.http.Unirest;
import com.mashape.unirest.http.exceptions.UnirestException;

public class RussianSentimentAnalyzerMashapeClient {

    private final static String mashapeKey = "ВАШ_MASHAPE_KEY_ЗДЕСЬ";

    public static void main(String[] args) throws UnirestException {

        String textToAnnotate = "'ВТБ кстати неплохой банк)'";
        String targetObject = "'ВТБ'";

        // These code snippets use an open-source library. http://unirest.io/java
        HttpResponse response = Unirest.post("https://russiansentimentanalyzer.p.mashape.com/ru/sentiment/polarity/json/")
                .header("X-Mashape-Key", mashapeKey)
                .header("Content-Type", "application/json")
                .header("Accept", "application/json")
                .body("{'text':" + textToAnnotate + ",'object_keywords':" + targetObject + ",'output_format':'json'}")
                .asJson();

        System.out.println("Input text = " + textToAnnotate + "\n" + "Target object: " + targetObject);
        System.out.println("RussianSentimentAnalyzer response:" + response.getBody().toString());
    }
}


Если запрос обработался успешно, то система выдаст следующий результат:

Input text = 'ВТБ кстати неплохой банк)'
Target object: 'ВТБ'
RussianSentimentAnalyzer response:{"sentiment":"POSITIVE","synonyms":"[ВТБ]"}


Помимо Java на сайте API можно найти примеры для других языков: Node, PHP, Python, Objective-C, Ruby и .NET.
В какой области Вам был бы интересен анализ тональности?

Проголосовало 64 человека. Воздержалось 49 человек.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Комментарии (18)


  1. zz_wolf
    10.07.2015 16:51

    Появление подобных сервисов вызывает у меня строго позитивную тональность. Спасибо!


    1. DKey Автор
      10.07.2015 17:09

      Спасибо, приятно слышать! Буду рад тестам и фидбеку.


  1. elingur
    10.07.2015 20:35
    +9

    По-моему, это похоже в лучшем случае на рекламу, а в худшем на фишинг: для работы даже с «бесплатным» демо требуется ввести данные банковской карты…


    1. DKey Автор
      10.07.2015 22:53

      Карту требует платформа API mashape: выберите бесплатный тариф (100 сообщений в день = 3000 в месяц) и платить ничего не придётся.

      Мы используем mashape, чтобы не прикручивать собственный биллинг + ради инструментов мониторинга API.


      1. elingur
        10.07.2015 23:05

        Если платить не надо, то зачем нужны данные банковской карты, в том числе cvv код? Это как-то странно.
        И хотелось бы поподробнее узнать, что за метод, какова скорость, какова точность? А то пока это слишком голословно выглядит — известна только цена.


        1. DKey Автор
          10.07.2015 23:12

          Карта требуется для Freemium типов API. Если у вас есть необходимость проверить на бОльшем, чем 100 в день, количестве сообщений мы делаем разовые личные тарифные планы (пишите в личку или по почте dk[@]semanticanalyzer.info).

          Метод основан на собственном алгоритме shallow parsing с применением машинного обучения. Более подробно можно посмотреть в видео доклада: www.youtube.com/watch?v=0qfK713BVW4

          Точность варьируется в зависимости от домена — от 60-70% до 90% и выше.

          Скорость высокая, среднее время на запрос (размера нескольких предложений) — 30-50 миллисекунд.


          1. grossws
            11.07.2015 00:08

            Можно ссылки на статьи, где вы на SRL получили 90%?


            1. DKey Автор
              11.07.2015 09:23

              У нас была одна собственная публикация на Диалоге 2012:
              Kan D. Rule-based approach to sentiment analysis at ROMIP 2011. Komp’iuternaia Lingvistika i Intellektual’nye Tekhnologii: Trudy Mezhdunarodnoi Konferentsii “Dialog 2012? // Computational Linguistics and Intellectual Technologies: Proceedings of the International Conference “Dialog 2012?. Bekasovo, 2012.

              где, в частности, показано качество 90% для позитивного класса. С тех пор мы подтянули и негативный класс.

              На самом деле, будучи пользователем таких систем, я бы не смотрел на декларируемое качество, а проверял конкретно для своего домена и своих текстов.


  1. velezh
    10.07.2015 21:10
    -2

    DEL


  1. lany
    11.07.2015 05:58

    Вы прямо так и конкатенируете JSON в прокадшен-коде (побежал писать твиты с большим количеством апострофов)? Любопытно, что в вашем примере после конкатенации валидный JSON вообще не получится: строки будут без кавычек. Это точно сработает?

    Не хватает хаба «Я пиарюсь».

    Это работает на контенте уровня твитов? Что ваш движок скажет про, например, такой отзыв (случайно выбранный на Yandex.Market):

    Довольно долго сопротивлялся смартфонам. Да и сейчас основной звонилкой остается nokia 8800. Но необходимость оставаться мобильным и развитие сетей 4G определили выбор. По началу таскал с собой iPad, но потом перешел на валявшийся без дела iphone4. Удобно черт возьми, но стала утомлять его неторопливость. iphone6 по части быстродействия на голову выше. а джейл дает достаточную свободу действий при работе с файлами и архивами (по старой памяти люблю поковыряться в консоли).
    Многие могут возразить — вот мол Андроид. Но как то исторически не заладилось еще с версии 2.1. Да и хорошая тушка с андроидом немногим дешевле стоит.

    Target = iPhone, target = iPad, target = Андроид, какие будут результаты во всех трёх случаях?


    1. DKey Автор
      11.07.2015 09:29

      Вы прямо так и конкатенируете JSON в прокадшен-коде (побежал писать твиты с большим количеством апострофов)? Любопытно, что в вашем примере после конкатенации валидный JSON вообще не получится: строки будут без кавычек. Это точно сработает?


      Изначально текст и объект в примере были в апострофах, но перед публикацией я их зачем-то убрал. Поправил пост, спасибо. Пишите твиты, потестим :)

      Это работает на контенте уровня твитов? Что ваш движок скажет про, например, такой отзыв (случайно выбранный на Yandex.Market):


      Лучше уровня твитов, коротких заметок вконтакте. Т.е. то, где есть явный «message», окрашенный эмоционально. На данный момент для Ваших таргет-объектов все метки выдаются позитивные. Мы работаем над улучшением качества для более длинных, чем твиты, текстов.


  1. fainalex
    13.07.2015 10:30
    +1

    участвовали ли вы в конкурсе сентимент-анализаторов на «Диалоге» в этом году?
    не могу протестировать ваше API на примерах (платформа требует денег, регистрации, потом опять регистрации, потом опять денег). Как работают примеры с анафорой? А заковыристые примеры с анафорой?
    а) Был недавно в ВТБ. Он расположен в ветхом здании на улице 1 мая. Но сам банк очень хороший.


    1. DKey Автор
      13.07.2015 16:22
      -1

      не могу протестировать ваше API на примерах (платформа требует денег, регистрации, потом опять регистрации, потом опять денег).


      денег совсем платить не нужно, чтобы потестировать. Нужно зарегистрироваться, выбрать BASIC план, указать кредитку (таковы требования mashape для Fremium API) и начать тестирование.

      участвовали ли вы в конкурсе сентимент-анализаторов на «Диалоге» в этом году?

      нет, в этом году, к сожалению не удалось, т.к. мы участвовали в другой дорожке и по другой теме.

      а) Был недавно в ВТБ. Он расположен в ветхом здании на улице 1 мая. Но сам банк очень хороший.


      Сейчас система выдаёт нейтральный класс, потому что этот случай можно в некотором смысле считать пограничным: вроде бы и позитив («банк хороший»), но вроде бы и негатив («в ветхом здании»). В этом случае анафора никак не поможет разрешить данный конфликт. Что можно сделать в таком случае — это усилить вес последнего предложения текста. Есть такой подход при вычислении тональности, когда первому (первым) и последнему (последним) предложениям текста придаётся бОльший вес, т.к. как делается предположение, что основная информация содержится именно в них.


      1. fainalex
        13.07.2015 16:30

        у вас в системе возможны только два ответа: позитивный и негативный?
        при анализе примера ниже оба объекта окажутся на одном уровне?
        а) Пепси-кола очень вкусная, а кока-кола — самый лучший напиток на свете.
        будет ли между ними какая-то разница?

        если при анализе примера из моего прошлого комментария оценка у ВТБ оказывается нейтральная, это значит, что анализотор работает ошибочно. Есть ли у вас синтаксис? понимает ли парсер, что ветхое здание — это одна именная группа, не имеющая общего антецедента с ВТБ?


        1. DKey Автор
          14.07.2015 16:43

          мой ответ в ветке выше — нажал не на ту ссылку.


  1. DKey Автор
    13.07.2015 17:08

    у вас в системе возможны только два ответа: позитивный и негативный?


    три: позитивный, негативный, нейтральный

    при анализе примера ниже оба объекта окажутся на одном уровне?
    а) Пепси-кола очень вкусная, а кока-кола — самый лучший напиток на свете.
    будет ли между ними какая-то разница?


    для обоих объектов выдаётся позитивная тональность. А какая ожидается разница?

    Если пример переделать в: Пепси-кола очень вкусная, а кока-кола самый ужасный напиток на свете.

    то для пепси-кола получаем позитивную, а для кока-кола негативную тональности.

    если при анализе примера из моего прошлого комментария оценка у ВТБ оказывается нейтральная, это значит, что анализотор работает ошибочно. Есть ли у вас синтаксис? понимает ли парсер, что ветхое здание — это одна именная группа, не имеющая общего антецедента с ВТБ?


    ошибочная для кого? Читайте комментарий выше: это пограничный случай, можно и так и эдак. Для одного клиента банка его ветхое здание не имеет роли, а для другого имеет. Поэтому здесь лучше даже выдавать MIXED (смешанную) метку тональности.

    Синтаксис есть. Антецеденты у «ветхого здания» и «ВТБ» разные, но это ведь не меняет ситуативной связи между ними: банк находится в ветхом здании, что в свою очередь влияет на тональность.


    1. fainalex
      14.07.2015 16:49
      +1

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


      1. DKey Автор
        15.07.2015 00:09
        +1

        Т.е. Вы, вероятно, имеете ввиду градацию меток тональности больше, чем на три класса: 5 или 7 и так далее. Силу тональности мы ещё не подключали, но принципиально в системе эта информация присутствует. Если Вам интересно потестировать такой алгоритм, будем рады обсудить в личном порядке.