Новая фича в RSA API: числовое представление тональности

Сегодня мы запустили новую фичу в продашкн: теперь в RSA API доступно числовое представление тональности.

Santorini

Santorini

Разберём на примере:

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

Здесь перечислен ряд проблем: с объектами “связь” и “заявка”, но есть и позитив: с объектом “номер”. Посмотрим, что выдаёт система по каждому из этих объектов.

{
"text": "Проблемы со связью так и не решены. Сегодня тестировали систему, вводили телефон билайн 89096593136, после чего поступал звонок, сообщали что это входящий звонок и далее абонент недоступен или находится вне зоны действия сети, хотя это не так. Тут же перезванивали на этот номер, просто с телефона и он был доступен. Проверяли ни один раз и все одно и тоже: через заявку на сайте он недоступен, если звонить просто с этой же трубки, то все ОК.",
"object_keywords": "связь",
"output_format": "json",
"include_strength": 1
}

Ответ системы:

{
"sentiment": "NEGATIVE",
"strength": "-2.0",
"synonyms": "[связь]"
}

Для “заявки” система выдаёт:


{
"sentiment": "NEGATIVE",
"strength": "-1.0",
"synonyms": "[заявка]"
}

И, наконец, по объекту “номер” получаем:


{
"sentiment": "POSITIVE",
"strength": "1.0",
"synonyms": "[номер]"
}

Что данная фича позволит делать вам, как клиентам RSA API?

  1. Моделировать собственную сетку меток тональности, например от hate / dislike до like / love.
  2. Анализировать разброс значений тональности и лучше понимать свои данные, возможно отсечь ненужные вам сообщения.
  3. Строить собственные модели машинного обучения, где числовая метка тональности будет одним из сигналов о тексте.

Надеемся, что это будет полезной фичей. Чтобы её задействовать, выставьте в true дополнительный булевский флаг в JSON: include_strength: “true”. Выходное число в поле strength никак не ограничено, но подчиняется простому правилу: чем ближе число к нулю, тем более нейтрально сообщение по отношению к данному объекту либо в целом, если объект не найден или не обнаружен.

Успехов в работе с RSA API!

Mashape

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.

InsiderUI

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: загружайте посты из соц. медиа, получайте тренды и удивляйте пользователей: https://market.mashape.com/dmitrykey/insiderapi

InsiderAPI

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

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

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

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

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

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

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

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

[
  {
    "labels": [
      "Оскар"
    ],
    "score": 1.510325122396045,
    "docs": [
      "2134657",
      "2134656",
      "2134655",
      "2134654"
    ]
  },
  {
    "labels": [
      "Политика"
    ],
    "score": 1.2447816860782057,
    "docs": [
      "2134653",
      "2134652",
      "2134651",
      "2134650",
      "2134649",
      "2134648"
    ]
  }
]

Значение 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 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

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

StreetDetectorLogo_1024x512

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

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

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

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

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