Category Archives: Sentiment analysis

Finding sentiment in Ruby

Dialogue is the largest conference on computational linguistics in Russia. Historically, it has been supported by Abbyy, Yandex, Moscow State University as well as the Higher School of Economics and the Moscow Institute of Physics and Technology. This year, as part of the conference the sentiment analysis track is held. In this post we will show the training / test formats of tweets and illustrate how they can be analyzed with our RSA API in ruby.

The code in this post is using mashape key token that can be obtained by registering a user account on http://market.mashape.com/. After registering, signup for the freemium plan of the RSA API. Then you will have a token that is uniquely identifying your access to this exact API under this exact subscription plan.

 

The training and test data provided by the sentiment track organizers is the following, illustrating with a single tweet text: “Отказ от повышения налогов сохранит и даже ускорит рост ВВП РФ – Sberbank CIB.”

  
      <table name="bank_train_2016">
            <column name="id">70</column>
            <column name="twitid">492546512652500000</column>
            <column name="date">1406267214</column>
            <column name="text">Отказ от повышения налогов сохранит и даже ускорит рост ВВП РФ - Sberbank CIB</column>
            <column name="sberbank">1</column>
            <column name="vtb">NULL</column>
            <column name="gazprom">NULL</column>
            <column name="alfabank">NULL</column>
            <column name="bankmoskvy">NULL</column>
            <column name="raiffeisen">NULL</column>
            <column name="uralsib">NULL</column>
            <column name="rshb">NULL</column>
        </table>

The task is to analyze for sentiment entries in xml tags with name “text” and update target bank name entity with -1 (NEGATIVE), 0 (NEUTRAL) or 1 (POSITIVE) flag.

The following is the code that reads an xml file from the first command line parameter, type of entities from the second parameter (banks or telecom) and updates the input file with automatically calculated sentiment values using the RSA API.

    
require 'rubygems' 
require 'nokogiri'
require 'unirest'

if ARGV.length < 2
    puts "Need xml file as input and type of entities: banks or telecom"
    exit
end


supported_entities = ['banks', 'telecom']
supported_entities_telecom = ['beeline', 'mts', 'megafon', 'tele2', 'rostelecom', 'komstar', 'skylink']
supported_entities_banks   = ['sberbank', 'vtb', 'gazprom', 'alfabank', 'bankmoskvy', 'raiffeisen', 'uralsib', 'rshb']

entities_type = ARGV[1]
if not supported_entities.include?(entities_type)
  puts "Unsupported entities type requested. Supported once are: " + supported_entities.to_s
  exit
end

if entities_type == 'banks'
  target_entities = supported_entities_banks
elsif entities_type == 'telecom'
  target_entities = supported_entities_telecom
else
  puts "FATAL ERROR: request unsupported entities type: " + entities_type
  exit
end


def get_sentiment(text)
  # These code snippets use an open-source library.
  response = Unirest.post "https://russiansentimentanalyzer.p.mashape.com/rsa/sentiment/polarity/json/",
    headers:{
    "X-Mashape-Key" => "[INSERT_TOKEN_HERE]",
    "Content-Type" => "application/json",
    "Accept" => "text/plain"
    },
    parameters: { :text => text, :object_keywords => "", :output_format => "" }.to_json

  puts "get_sentiment, text=" + text + " SENTIMENT=" + response.body["sentiment"]

  if response.body['sentiment'] == "POSITIVE"
    return 1
  elsif response.body['sentiment'] == "NEGATIVE"
    return -1
  else
    return 0
  end
end


file_name = ARGV[0]
@doc = Nokogiri::XML(File.open(file_name))
columns = @doc.xpath("//database/table/column")
sentiment_tag = -2
columns.each { |column| 
     if column['name'] == 'text'
         sentiment_tag = get_sentiment(column.content)
     end
     
     if target_entities.include?(column['name'])
         if sentiment_tag > -2 and column.content != 'NULL'
           puts "updating " +  column['name'] + " with " + sentiment_tag.to_s
           column.content = sentiment_tag
           sentiment_tag = -2
         end
     end
}

File.open(file_name, 'w') {|f| f.write(@doc) }

How can NLP technology help marketing

Rohini Srihari has written a great post on how NLP technology could be used for marketing. It is indeed clear, that sentiment analysis by itself cannot be a source of signal and be the base for a decision making. And this is not only because understanding sentiment is algorithmically hard, it is also because there can be irony involved. Or the sentiment is about author’s life circumstances, except that expressed in social media while sitting in coffee shop #name.

What NLP technology can offer (and our products for English, Russian and Chinese do) is:

  1. Sift sentences / mentions of the target product / person / brand / business branch.
  2. Detect sentiment orientated towards these targets.
  3. Report back in aggregate and / or detailed form.

Having other key information bits at hand, such are age, location, popularity (number of followers, engagement level with author’s posts) companies could leverage this to understand where is the most negative folks and why, and what audience is the happiest to the moment. This helps marketing do direct interaction, lead positive momentum, solve particular tricky cases and satisfy their customers.

While NLP technology cannot offer human level interpretation of written free form texts, it can really quickly pass through the vast avalanche of data pieces and give you a sense of general sentiment about your brand plus give you all the access to particular data portions of interest. Especially, when you think of getting in direct contact and use social media as *the* channel for the customer relationship management.

It is time, when using NLP as a service opens up so many opportunities to integrate into your existing software systems and get much socially closer to the market you sell for.

IMG_20150826_075854

Insider API поиск трендов и быстрая навигация в текстах

Как часто, имея большой массив текстов (любой тематики) мы хотим увидеть тематическую выжимку? Какие темы обсуждаются? Какие наиболее популярные? Как было бы здорово ввести поисковые слова и получить тренды вокруг них!

Insider API призван решить как раз все эти задачи.

InsiderAPI

Система умеет:

  1. Получать массив данных и сохранять их под Вашим пользователем.
  2. Строить список тем с группировкой документов по темам.
  3. Делать realtime поиск по документам и строить темы по найденной выборке.

Все перечисленные функции доступны через API, которым легко воспользоваться, подключившись к одному из тарифных планов (есть бесплатный триал на месяц!).

Мы проиндексировали соц. медиа (твиттер, facebook, вконтакте) в начале осени 2015 года и сделали скриншоты системы для визуальной оценки.

Консьюмерский сегмент: Магнит.

Magnit

Yota:

Yota

Политика: выступление Путина в ООН.

UNO

Так выглядит тема изнутри:

UNO_expanded

На предыдущем скриншоте представлено содержимое темы “ООН 2015”, включающее 7 новостей.

Как видно из скриншотов, система представляет из себя полноценную поисковую систему (с поддержкой русской морфологии) и является отличным инструментом для быстрой навигации по огромным массивам информации. У нас нет ограничений по поддерживаемым тематикам и типу данных — соц. медиа, новостные ленты либо Ваши корпоративные документы. Все описанные функции доступны как в виде SAAS продукта с пользовательским интерфейсом, так и в составе Insider API, который можно встроить в Ваши существующие системы и мобильные приложения.

RSA API 3.0

About a month ago we have released 3.0 version of RSA API (RussianSentimentAnalyzer API) to production. This, in many ways, is a major release of our sentiment analysis SAAS solution compared to more incremental releases in the past.

  1. The algorithms of entity level sentiment analysis have been substantially improved in quality and thematic coverage (we have added support for politics related social media buzz) .
  2. We started supporting target objects of any complexity: it could be even half a sentence!
  3. From now on, specifying object_keywords, that describe the target object of SMM monitoring is crucial to the output quality of the API.

Here is one example with moderately complex input target object (entity in the text) and system output:

Input:
{
  "text": "Я понимаю всю неловкость момента. Ведь уже накануне в Сети была целая серия рассказов очевидцев предыдущей репетиции Парада, которым показалось, что на танке были странные вмятины, что броня колыхалась на ветру, а из танка торчали какие-то нитки. И возникли серьезные подозрения, что перед нами катается не вполне танк, а некая картонно-фанерная демо-версия, концепт-кар, что это устройство может только ехать, но вряд ли сможет воевать.",
  "object_keywords": "очевидцев предыдущей репетиции Парада",
  "output_format": "json"
}
Output:
{

"sentiment": "NEGATIVE",

"synonyms": "[очевидцев предыдущей репетиции Парада]"

}

On top of this, we have added new feature to the API: numeric sentiment value. The number is a signed integer, where plus in front of it refers to  POSITIVE tonality and minus refers to NEGATIVE tonality. The closer the number to zero, the more netural or mixed sentiment is in the input text with equal opposite tonality forces. You may choose to build your own sentiment models based on this new numeric feature.

Stay tuned to new features of the RSA API that are in our backlog.

IMG_20150824_085743

Релиз RSA API 3.0

В production запущена новая версия RSA API (RussianSentimentAnalyzer API) версии 3.0. Это значительный релиз по сравнению с предыдущими релизами, носившими более инкрементальный характер.

 

  1. Существенно улучшены алгоритмы определения объектной тональности. Теперь контекст целевого объекта в заданном тексте вычисляется ещё точнее. Поэтому передавать объекты в поле object_keywords стало как никогда важно (см. пред. пост).
  2. Добавлена возможность искать объекты произвольной сложности.
  3. Существенно переработаны полярные лингвистические единицы — с помощью них система реагирует на эмоциональную окрашенность в текстах.

 

Приведём пример текста и сложного объекта к нему, а также результат обработки на тональность:

Input:
{
  "text": "Я понимаю всю неловкость момента. Ведь уже накануне в Сети была целая серия рассказов очевидцев предыдущей репетиции Парада, которым показалось, что на танке были странные вмятины, что броня колыхалась на ветру, а из танка торчали какие-то нитки. И возникли серьезные подозрения, что перед нами катается не вполне танк, а некая картонно-фанерная демо-версия, концепт-кар, что это устройство может только ехать, но вряд ли сможет воевать.",
  "object_keywords": "очевидцев предыдущей репетиции Парада",
  "output_format": "json"
}
Output:
{

"sentiment": "NEGATIVE",

"synonyms": "[очевидцев предыдущей репетиции Парада]"

}

Помимо этого появилась новая фича, которая ещё не выведена в API: численная метка тональности. Это то число со знаком плюс или минус, на основе которого система решает какую метку тональности вернуть: POSITIVE или NEGATIVE, соответственно. Чем ближе к нулю данное число с двух сторон оси x, тем более нейтральная (либо смешанная, но равных сил) тональность в тексте. На основе данного числа и других численных параметров в ваших системах вы можете строить собственные модели тональности.

Как качественно анализировать объектную тональность при помощи RussianSentimentAnalyzer API

Привет!

В этой короткой заметке мы хотели бы уделить особое внимание тому, как RussianSentimentAnalyzer API анализирует тональность по отношению к конкретному объекту. Передача объекта в поле object_keywords значительно повышает качество получаемой разметки на тональность.

Рассмотрим текст, присланный одним из пользователей:

Проблемы со связью так и не решены. Сегодня тестировали систему, вводили телефон билайн номеризменён, после чего поступал звонок, сообщали что это входящий звонок и далее абонент недоступен или находится вне зоны действия сети, хотя это не так. Тут же перезванивали на этот номер, просто с телефона и он был доступен. Проверяли ни один раз и все одно и тоже: через заявку на сайте он недоступен, если звонить просто с этой же трубки, то все ОК.

В случае, если мы не передаём ни одного объекта, мы получаем NEGATIVE в качестве метки тональности всего текста. Однако в тексте видно, что присутствует и позитивная тональность.
Если передать объект “связь”, то получаем NEGATIVE метку тональности.
Для объекта “номер” мы получаем POSITIVE метку тональности.

Надеемся, что эта информация и пример окажутся вам полезны при работе с RussianSentimentAnalyzer API.

Команда SemanticAnalyzer

Партнёрство с SEUSLAB

Мы рады сообщить о нашем партнёрстве с компанией SEUSLAB (город Пермь).

logo

В настоящее время компания SEUSLAB работает в следующих направлениях:

– Разработка продукта, интернет сервиса SEUS, предназначенного для поиска, мониторинга и анализа больших данных (Big Data) из пространства социальной сети “ВКонтакте”.

  Продажа доступа к интернет сервису SEUS для поиска, мониторинга и анализа больших данных (Big Data) из пространства социальной сети “ВКонтакте”.

– Проведение исследовательских проектов в сфере Social Network Analysis с использованием больших данных (Big Data) из пространства социальной сети “ВКонтакте” в области социологии, маркетинга, политологии и иных сферах рынка.

Интернет сервис SEUS, разработанный компанией SEUSLAB активно используется в различных сферах рынка: недвижимости, образовании, маркетинге, а также в государственных органах власти.

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