Research project on traditional and social media

Last month Insider has contributed to common research project with two other companies: ContextMedia (with 20+ years of traditional media analytics) and YouControl (with access to government data). Target of the research was to build a bio and semantic portrait of the Ukrainian politician Dmytro Svyatash in light of the law on car import in Ukraine. The interactive research results can be found here (in Russian).

Insider has used two own tools for unstructured text analytics: Insider API for realtime semantic topic creation (screenshots and description of the system are here) and RSA API for entity level sentiment analysis.

The resulting system, that was prototyped in under a week, allowed for:

  1. Navigating through years of data from 2002 to current moment using keyword searches.
  2. Understanding the sentiment distribution in the found corpora and for given search.
  3. Researching quantitative search trends using visual trend chart.
  4. Sifting through the produced semantic topics, grouping various news items together in search results.
  5. Getting the heart beat of twitter.


In the process we relied on best open source tools, including Apache Tika, using which allowed us to swiftly convert HTML news articles into JSON format, preserving all important attributes of a news item: title, contents. We crafted and applied additionally own NER for extracting date of a publication to properly place it on the time scale.

Want to do a similar research on your own data? Get in touch: [email protected].

Insider API: тренды в realtime потоке данных

Представляем Вашему вниманию Insider API: загружайте посты из соц. медиа, получайте тренды и удивляйте пользователей:


Принцип применения API:

1. Загрузить данные (посты, статьи) в систему.

End-point: /articles/uploadJson
Тип запроса: POST
   "id": 2134657,
   "title": "Оскар",
   "description": "Наши дети уже не поймут всех этих приколов про Лео и Оскар. Ушла эпоха. Мы - особое поколение.",
   "link": ""

В одном запросе можно переслать до 50 текстов. В ответ API отвечает кодом 200, если всё прошло успешно.

Обратите внимание на параметр id: по значению этого параметра мы получим привязку данного поста к определенной теме / тренду на следующем шаге.

2. Получить тренды: либо по документам в целом, либо в привязке к ключевым словам.

End-point: /articles/cluster
Тип запроса: POST
  "query": ""

В ответ API генерирует тренды.

    "labels": [
    "score": 1.510325122396045,
    "docs": [
    "labels": [
    "score": 1.2447816860782057,
    "docs": [

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

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

В статье по этой ссылке можно найти скриншоты, иллюстрирующие работу API в составе UI Insider.

Fuxi API 1.2 for Chinese sentiment analysis is here

Analyzing Sina Weibo (Chinese Twitter) and Renren (Chinese Facebook) for sentiment are quite tricky. In general social media analysis, for instance for Russian is tricky. There are few reasons:

  1. Grammar: in short messages there is not much space to spell out correct grammar. So in most cases it is “broken” from the stand point of classic parsers.
  2. Words: they change frequently, following social media development of a particular news / reaction or may be even a flash mob.
  3. Sarcasm: the author does not mean the sentiment you deduce by reading it for the first time. It sometimes takes a research and find a visual item, that helps understand the sentiment:     

Fuxi API is catching up with what’s cooking in Chinese social media by analyzing a vast array of messages in Simplified and Traditional Chinese. We have just released its 1.2 version with a number of changes to better tune for the sentiment signal in the avalanche of tweets, blog posts and news articles, all in Chinese. Check it out.

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 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>

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"

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

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

def get_sentiment(text)
  # These code snippets use an open-source library.
  response = "",
    "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
    return 0

file_name = ARGV[0]
@doc = Nokogiri::XML(
columns = @doc.xpath("//database/table/column")
sentiment_tag = -2
columns.each { |column| 
     if column['name'] == 'text'
         sentiment_tag = get_sentiment(column.content)
     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
}, '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.


Распознавание адресов в текстах на русском языке


Мы рады сообщить о запуске нового API для обработки текста — StreetDetector API. Система позволяет извлекать улицы и номера домов из разнородных текстов на русском языке.

Основные возможности:

  1. Поддержка русской морфологии.
  2. Распознавание адресов в различных вариациях: Ленинский 22; ул. Льва Толстого, 16
  3. Извлечение всех адресов в данном тексте:

У Басманного тупика пробка. На проезде Апакова д.5 ремонт дороги.

    "buildingNumber": "",
    "streetName": "Басманный тупик"
    "buildingNumber": "5",
    "streetName": "Апакова, проезд"
Мы надеемся, что StreetDetector API будет полезен разработчикам самых различных систем, имеющих дело с текстами (отзывами пользователей, официальными документами и т.д.), а бесплатного теста в 300 сообщений будет достаточно, чтобы оценить качество API.

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

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

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


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

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

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

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

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




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


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


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

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