Статьи

Twitter4j и Esper: отслеживание настроений пользователей в Twitter

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

Управление большими данными и извлечение из них полезной информации сейчас является самой горячей темой для обсуждения в области технологий. Взрыв роста полуструктурированных данных, поступающих из социальных сетей, таких как Twitter, Facebook и Linkedin, делает такие технологии, как Hadoop, Cassandra, частью каждого технологического разговора. Чтобы не отставать от конкурентов, все организации, ориентированные на клиента, активно участвуют в создании социальных стратегий.
Что компания может получить из каналов данных из социальных сетей? Подумайте о сервисах на основе местоположения, целевой рекламе и алгоритме торговли акциями для начинающих В IDC Insights есть несколько информативных блогов о взаимосвязи между большими данными и бизнес-аналитикой. Большие данные сами по себе будут бессмысленными, если не будут найдены правильные аналитические инструменты, объясняет Барб Дарроу в своем блоге на gigaom.com

Компании часто слушают в социальных сетях, чтобы узнать интерес клиентов или восприятие продуктов. Они также пытаются определить «влиятельных людей» — тех, у кого больше всего связей в социальном графе — чтобы они могли лучше предлагать таким людям и получать максимальную отдачу от их маркетинга. Компании, участвующие в торговле акциями, хотят знать, какие публичные торговые компании обсуждаются в Твиттере и каковы настроения пользователей по отношению к ним.

От крупных компаний, таких как IBM, до небольших стартапов — все стремятся использовать большинство возможностей управления большими данными и аналитики. Большая часть документации о больших данных, таких как эта электронная книга от IBM ‘ Big Data Platform’ , свободно доступна в Интернете. Однако многое из этого охватывает только теорию. Jouko Ahvenainen, отвечая на пост Барба Дарроу выше, подчеркивает, что «многие люди, которые говорят о возможности больших данных, имеют слишком общий уровень, говорят о лучшем понимании клиентов, лучших продажах и т. Д. В действительности вы должны быть очень конкретны, что вы используете и как ».

Звучит разумно, не правда ли? Поэтому я решил исследовать это немного дальше, прототипируя идею, единственный хороший вариант, который я знаю. Если бы я мог сделать это, любой мог бы сделать это. Код удивительно прост. Но в том-то и дело. Написание фреймворка CEP самостоятельно довольно сложно, но его использование — нет. Точно так же, Twitter упрощает доступ к информации через REST API.

Большие данные — http://www.bigdatabytes.com/managing-big-data-starts-here/
Комплексная обработка событий (CEP), о которой я писал ранее ( нажмите здесь, чтобы прочитать), является критически важным компонентом инфраструктуры больших данных. Наряду с CEP, платформы с Hadoop используются для компиляции, анализа и анализа потока данных из социальных сетей 24 × 7. Сегодня потоковое API и CEP в Твиттере можно использовать вместе для определения уровня счастья пользователей Twitter. Код, который я представляю ниже, прослушивает живые твиты, чтобы генерировать «счастливое» событие каждый раз, когда «лол» встречается в тексте твита. CEP используется для захвата счастливых событий, и оповещение генерируется каждый раз, когда число счастливых событий превышает заранее определенное число в течение заранее определенного периода времени. Предположение о том, что пользователь счастлив каждый раз, когда он или она использует «лол», очень упрощенно, но оно помогает понять суть. На практике оценить настроение пользователей не так просто, потому что он включает анализ естественного языка. Ниже рассмотрим пример, который подчеркивает сложности анализа естественного языка.

Iphone никогда не был хорошим.

Iphone никогда не был так хорош.

Как видите, добавление всего лишь одного слова в предложение полностью изменило смысл. По этой причине обработка естественного языка считается одной из самых сложных проблем в информатике. Вы можете изучать «обработку естественного языка», используя бесплатные онлайн-лекции, предлагаемые Стэнфордским университетом. Эта ссылка ведет вас прямо к первой лекции Кристофера Мэннинга по анализу естественного языка. Но, по моему мнению, повсеместное использование сокращений в социальных сетях и в современном жаргоне в целом облегчает задачу. Сокращения, такие как «LOL» и «AFAIK» точно проецируют значение. Использование проектов «LOL» «Funny» и «AFAIK» может указывать на то, что пользователь «неуверен» в себе.

Код, представленный ниже, использует API Twitter4j для прослушивания живого твиттера и Esper CEP для прослушивания событий и оповещения нас о достижении порога. Вы можете скачать двоичные файлы twitter4j или исходные тексты с http://twitter4j.org/en/index.html и Esper с http://esper.codehaus.org /. Прежде чем выполнять код, обязательно создайте учетную запись Twitter, если у вас его нет, а также ознакомьтесь с рекомендациями и концепциями Twitter по его потоковому API здесь . В настоящее время Twitter разрешает аутентификацию с использованием только комбинации имени пользователя и пароля, но в ближайшем будущем она будет прекращена в пользу аутентификации oAuth. Кроме того, обратите пристальное внимание на их раздел «Ограничение доступа и скорости».

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

Диаграмма. Графики и БД еще не реализованы в коде
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
package com.sybase.simple;
 
public class HappyMessage {
 public String user;
 private final int ctr=1;
 public String getUser() {
  return user;
 }
 public void setUser(String user) {
  this.user = user;
 }
 public int getCtr() {
  return ctr;
 }
}

Листинг 1. Стандартный Java-бин, представляющий счастливое событие.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.sybase.simple;
 
package com.sybase.simple;
 
import com.espertech.esper.client.EventBean;
import com.espertech.esper.client.UpdateListener;
 
public class HappyEventListener implements UpdateListener{
 public void update(EventBean[] newEvents, EventBean[] oldEvents) {
  try {
   if (newEvents == null) {
 
    return;
   }
   EventBean event = newEvents[0];
   System.out.println("exceeded the count, actual " + event.get("sum(ctr)"));
  } catch (Exception e) {
   e.printStackTrace();
  }
 
 }
}

Листинг 2. Определен слушатель Esper.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package com.sybase.simple;
 
package com.sybase.simple;
 
import java.io.IOException;
 
import twitter4j.Status;
import twitter4j.StatusDeletionNotice;
import twitter4j.StatusListener;
import twitter4j.TwitterException;
import twitter4j.TwitterStream;
import twitter4j.TwitterStreamFactory;
import twitter4j.conf.Configuration;
import twitter4j.conf.ConfigurationBuilder;
 
import com.espertech.esper.client.EPServiceProvider;
import com.espertech.esper.client.EPServiceProviderManager;
import com.espertech.esper.client.EPStatement;
 
public class TwitterTest {
 static EPServiceProvider epService;
 
 public static void main(String[] args) throws TwitterException, IOException {
 
  // Creating and registering the CEP listener
 
  com.espertech.esper.client.Configuration config1 = new com.espertech.esper.client.Configuration();
  config1.addEventType("HappyMessage", HappyMessage.class.getName());
  epService = EPServiceProviderManager.getDefaultProvider(config1);
  String expression = "select user, sum(ctr) from com.sybase.simple.HappyMessage.win:time(10 seconds) having sum(ctr) > 2";
 
  EPStatement statement = epService.getEPAdministrator().createEPL(
    expression);
  HappyEventListener happyListener = new HappyEventListener();
  statement.addListener(happyListener);
 
  ConfigurationBuilder cb = new ConfigurationBuilder();
  cb.setDebugEnabled(true);
  //simple http form based authentication, you can use oAuth if you have one, check Twitter4j documentation
  cb.setUser("your Twitter user name here");
  cb.setPassword("Your Twitter password here");
 
  // creating the twitter listener
 
  Configuration cfg = cb.build();
  TwitterStream twitterStream = new TwitterStreamFactory(cfg)
    .getInstance();
  StatusListener listener = new StatusListener() {
   public void onStatus(Status status) {
 
    if (status.getText().indexOf("lol") > 0) {
     System.out.println("********* lol found *************");
     raiseEvent(epService, status.getUser().getScreenName(),
       status);
    }
   }
 
   public void onDeletionNotice(
     StatusDeletionNotice statusDeletionNotice) {
    System.out.println("Got a status deletion notice id:"
      + statusDeletionNotice.getStatusId());
   }
 
   public void onTrackLimitationNotice(int numberOfLimitedStatuses) {
    System.out.println("Got track limitation notice:"
      + numberOfLimitedStatuses);
   }
 
   public void onScrubGeo(long userId, long upToStatusId) {
    System.out.println("Got scrub_geo event userId:" + userId
      + " upToStatusId:" + upToStatusId);
   }
 
   public void onException(Exception ex) {
    ex.printStackTrace();
   }
  };
  twitterStream.addListener(listener);
 
  //
  twitterStream.sample();
 
 }
 
 private static void raiseEvent(EPServiceProvider epService, String name,
   Status status) {
  HappyMessage msg = new HappyMessage();
  msg.setUser(status.getUser().getScreenName());
  epService.getEPRuntime().sendEvent(msg);
 }
 
}
}

Листинг 3

Слушатель Twitter4j создан. Этот слушатель и слушатель CEP начинают слушать. Каждое твиттерное сообщение анализируется на предмет «lol». Каждый раз, когда ‘LOL’ найден, генерируется счастливое событие. Слушатель CEP выдает предупреждение каждый раз, когда общее количество «lol» превышает 2 за последние 10 секунд.
Код устанавливает длительный поток для получения твиттер-фидов. Вы будете видеть вывод на консоли каждый раз, когда порог будет достигнут. Пожалуйста, не забудьте прекратить программу, она не завершается сама по себе.

Теперь, когда у вас есть эта базовая функциональность, вы можете расширить этот прототип несколькими способами. Вы можете обрабатывать дополнительные потоки данных (из источника, отличного от Twitter) и использовать Esper для сопоставления данных из двух потоков данных. Для визуально привлекательного вывода вы можете передать вывод в некоторую библиотеку диаграмм. Например, каждый раз, когда Esper идентифицирует событие, точка данных используется для отображения точки на линейном графике. Если вы отслеживаете «счастливое событие» таким образом, то график, по сути, покажет постоянно меняющийся уровень счастья пользователей Twitter за определенный период времени.

Пожалуйста, используйте раздел комментариев для вашей обратной связи, +1, чтобы поделиться, и дайте мне знать, если вы хотели бы видеть больше сообщений на эту тему.

Ссылка: отслеживание настроений пользователей в Twitter с помощью Twitter4j и Esper от нашего партнера по JCG   Махеш Гэдгил в Простом, но Практическом блоге.