Twitter4j和Esper:在Twitter上跟踪用户情绪

对于复杂事件处理和Twitter API的新手,我希望这是一个简短的教程,可以帮助他们Swift起步。

管理大数据并从中挖掘有用的信息是当前技术中最热门的讨论主题。 来自Twitter,Facebook和Linkedin等社交网络的半结构化数据的爆炸式增长使Hadoop,Cassandra等技术成为每个技术对话的一部分。 为了不落后于竞争,所有以客户为中心的组织都在积极参与制定社会战略。
公司可以从社交网络中获取什么数据? 为初学者考虑基于位置的服务,定向广告和算法股权交易。 IDC Insights拥有一些有关大数据与业务分析之间关系的信息博客 。 Barb Darrow在gigaom.com上的博客文章中解释说,大数据本身将是毫无意义的,除非可以使用合适的分析工具进行筛选。

公司通常会听取社交信息,以了解客户对产品的兴趣或看法。 他们还试图确定“影响者”(在社交图中联系最多的人),以便他们可以向此类人员提供更好的报价,并从他们的营销中获得更大的收益。 从事股票交易的公司想知道在Twitter上讨论了哪些公开贸易公司,以及用户对此的看法。

从像IBM这样的大公司到规模较小的新兴企业,每个人都在竞相利用大数据管理和分析的大部分机会。 可以从Web上免费获得许多有关大数据的文档,例如IBM'Big Data Platform'的电子书。 但是,其中很多仅涉及理论。 Jouko Ahvenainen在回应Barb Darrow的上述帖子时指出,“许多谈论大数据机会的人过于笼统,谈论的是更好的客户理解,更好的销售等。实际上,您必须非常具体,您利用什么以及如何使用”。

听起来合理,不是吗? 因此,我开始通过制作一个想法原型来进一步研究这一点,这是我知道的唯一好的选择。 如果我能做到,那么任何人都可以做到。 该代码非常简单。 但是,这就是重点。 自己编写CEP框架非常复杂,但使用起来却不是。 同样,Twitter使通过REST API获取信息变得非常容易。

大数据– http://www.bigdatabytes.com/managing-big-data-starts-here/
我之前在博客中写道,复杂事件处理(CEP)是大数据框架的关键组成部分。 与CEP一起,具有Hadoop的框架用于从社交网络的24×7数据流中进行编译,解析和理解。 今天,Twitter的流式API和CEP可以一起使用,以捕获Twitter用户的幸福感。 每当我在推文的文本中发现“大声笑”时,我在下面提供的代码都会侦听实时推文,以生成一个“幸福”事件。 CEP用于捕获快乐事件,并且每当在预定时间段内快乐事件的计数超过预定数量时,都会发出警报。 假设用户每次使用“大声笑”都会感到高兴,这是非常简单的,但这有助于理解要点。 在实践中,衡量用户的情感并不容易,因为它涉及自然语言分析。 考虑下面的示例,该示例突出了分析自然语言的复杂性。

Iphone从来没有变好。

Iphone从未 如此出色。

如您所见,在句子中仅添加一个单词就完全改变了含义。 因此,自然语言处理被认为是计算机科学中最棘手的问题之一。 您可以使用斯坦福大学提供的免费在线讲座来学习“自然语言处理”。 该链接直接带您进入克里斯托弗·曼宁(Christopher Manning)关于自然语言分析的第一堂课。 但是,以我的观点,在社交媒体和现代通用术语中普遍使用缩写词使这项工作变得容易一些。 诸如“ lol”和“ AFAIK”之类的缩写准确地表达了含义。 使用“大声笑”项目“有趣”和“ AFAIK”可能表示用户“不确定”他或她自己。

下面提供的代码使用Twitter4j api收听实时Twitter提要,使用Esper CEP收听事件并在达到阈值时提醒我们。 您可以从http://twitter4j.org/en/index.html下载twitter4j二进制文件或源文件,也可以从http://esper.codehaus.org/下载Esper。 在执行代码之前,请确保创建一个Twitter帐户(如果您没有的话),并在此处阅读Twitter的指南和概念及其流API。 Twitter目前仅允许通过用户名和密码组合进行身份验证,但是不久之后将逐步淘汰该方法,以支持oAuth身份验证。 另外,请密切注意其“访问和速率限制”部分。

以下代码在一个线程中使用流式API。 请不要同时使用其他线程,以免达到速率限制。 持续达到命中率限制可能会导致Twitter将您的Twitter ID列入黑名单。 同样重要的是要注意,流式API并不是以我们的方式发送每条推文。 Twitter通常会通过每10条发一条信息发送1条样本来对数据进行采样。 但是,对于我们来说这不是问题,只要我们对数据中的模式感兴趣,而不对任何特定的推文感兴趣。 Twitter为需要无速率限制的流数据的企业提供付费服务。 下图显示了数据的组成和处理。

图。 代码中尚未实现的图表和数据库
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 bean。

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侦听器。

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 listenercom.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 documentationcb.setUser("your Twitter user name here");cb.setPassword("Your Twitter password here");// creating the twitter listenerConfiguration 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侦听器开始侦听。 每个Twitter帖子都被解析为“大声笑”。 每次找到“哈哈”,都会生成一个快乐事件。 每当最近10秒内“ lol”的总数超过2时,CEP侦听器都会发出警报。
该代码建立了一个长期运行的线程来获取Twitter提要。 每次达到阈值时,您都会在控制台上看到输出。 请记住要终止程序,它不会自行终止。

现在,您已经可以使用此基本功能,可以通过多种方式扩展此原型。 您可以处理其他数据提要(来自Twitter以外的其他来源),并使用Esper对来自两个数据提要的数据进行核对。 为了使输出具有视觉吸引力,您可以将输出提供给某些图表库。 例如,每次Esper识别事件时,数据点都将用于在折线图上渲染一个点。 如果以这种方式跟踪“快乐事件”,那么该图将本质上显示Twitter用户在一段时间内不断变化的快乐水平。

请在评论部分中提供您的反馈,并通过+1与他人分享,如果您希望看到更多有关此主题的信息,请告诉我。

参考:通过我们的JCG合作伙伴 使用Twitter4j和Esper跟踪Twitter上的用户情绪   Mahesh Gadgil在“ 简单而实用”博客上。


翻译自: https://www.javacodegeeks.com/2012/03/twitter4j-and-esper-tracking-user.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

webase crud查看所有表_Laravel-Gii 可视化代码生成工具 CRUD +GUI

Laravel-Gii 可视化代码生成工具 CRUD GUI适用于快速B端后台开发,根据MySQL的表结构生成对应的Model、Observer、Controller、View、Route等相关项目文件[TOC]注意因为是解析MySQL的表结构,并且根据字段生成模板,所以目前生成的Model类时只支…

20145231第二周Java学习笔记

20145231 《Java程序设计》第2周学习总结 教材学习内容总结 本周的学习采用的依然是先看课本,再看视频,然后实践敲代码,最后根据学习笔记总结完成博客。 第三章:基础语法 知识点比较多比较零碎,整理的都是实际操作中可…

JavaFX 2.0和Scala,像牛奶和饼干

JavaFX 2.0和Scala都是很好的技术,但是一起使用时效果会更好。 JavaFX 2.0是一种功能强大的富客户端技术,具有先进的图形,动画和媒体功能。 Scala是一种简单但功能强大的语言,具有用于编写特定于域的语言(DSL&#xff…

ASP.NET WebAPi之断点续传下载(上)

前言 之前一直感觉断点续传比较神秘,于是想去一探究竟,不知从何入手,以为就写写逻辑就行,结果搜索一番,还得了解相关http协议知识,又花了许久功夫去看http协议中有关断点续传知识,有时候发觉东西…

贪吃蛇(C++实现,VC6.0编译,使用了EasyX图形库)

程序效果&#xff1a; 代码&#xff1a; //main.cpp 1 #include <iostream>2 #include<fstream>3 #include <graphics.h>4 #include <conio.h>5 #include<ctime>6 #include<windows.h>7 #include<mmsystem.h>8 #pragma comment(lib…

3.0 C++远征:is a

4-4is_a 0.派生类Soldier继承自基类Person //Person.h class Person { public:Person(string name "Jim");~Person();void play(); protected:string m_strName; };//Soldier.h class Soldier : public Person { public:Soldier(string name "James", in…

python中sorted的用法append_python sorted()排序详解

排序&#xff0c;在编程中经常遇到的算法&#xff0c;我也在几篇文章中介绍了一些关于排序的算法。有的高级语言内置了一些排序函数。本文讲述Python在这方面的工作。供使用内置函数sorted()/list.sort()的使用简单应用python对list有一个内置函数&#xff1a;>>> a[5…

云上的播放框架变得简单:Openshift模块

仅仅几年前&#xff0c;找到一个负担得起的Java Web应用程序托管解决方案是一项艰巨的任务&#xff0c;而寻找免费的托管解决方案是一项不可能的任务。 更不用说甚至考虑自动缩放&#xff0c;单命令部署&#xff0c;持续集成等事情&#xff0c;这都是科幻小说。 去年见证了云计…

C#中的yield return与Unity中的Coroutine(协程)(下)

Unity中的Coroutine&#xff08;协程&#xff09; 估计熟悉Unity的人看过或者用过StartCoroutine() 假设我们在场景中有一个UGUI组件&#xff0c; Image&#xff1a; 将以下代码绑定到Image 1 using UnityEngine;2 using System.Collections;3 using System.Threading;4 using …

字节流转化为文件流_C#文件转换为字节流及字节流转换为文件

本文讲解了C#实现文件转换为字节流的方法。文件转换为字节流的步骤如下1、通过文件流打开指定文件(FileStream fs)&#xff1b;2、定义字节流(byte[] fileBytenew byte[fs.Length])&#xff1b;3、把文件读取到字节流(fs.Read(fileByte,0,fileByte.Length))&#xff1b;4、关闭…

Spring和JSF集成:导航

我希望这是有关我在Spring和JavaServer Faces之间提供深度集成的努力的一系列博客中的第一篇。 这里提到的所有内容都是“正在进行中的工作”&#xff0c;因此&#xff0c;如果您签出代码&#xff0c;请注意它是一个不断变化的目标。 期待一些粗糙的边缘&#xff0c;如果有时会…

【CSS3动画】transform对文字及图片的旋转、缩放、倾斜和移动

前言&#xff1a;之前我有写过CSS3的transform这一这特性&#xff0c;对于它的用法&#xff0c;还不是很透彻&#xff0c;今天补充补充&#xff0c;呵呵 你懂的&#xff0c;小司机准备开车了。 a)再提一提transform的四个属性 ①旋转--->rotate(参数a)&#xff0c;单位deg&a…

宏的用法与简介

预处理指令&#xff1a;例如&#xff1a;#include<stdio.h> #include<stdlib.h> #define MAX 20 ............. 因为他们由预处理器解释的&#xff0c;所以称作预处理指令。预处理器读取源代码&#xff0c;然后对其修改&#xff0c;并把修改过的…

django 日志写入mysql_如何将django orm模型 写入数据库

1、指定连接pymysql(python3.x)先配置_init_.pyimport pymysqlpymysql.install_as_MySQLdb()2、配置连接mysql文件信息settings.pyDATABASES {default: {ENGINE: django.db.backends.mysql,NAME: django_orm, #你的数据库名称USER: root, #你的数据库用户名PASSWORD: , #你的数…

ORM的问题第2部分–查询

在我以前关于对象关系映射工具&#xff08;ORM&#xff09;的帖子中&#xff0c;我讨论了在处理当今常见的ORM&#xff08;包括Hibernate&#xff09;时遇到的各种问题。 其中包括与从POJO生成架构有关的问题&#xff0c;实际性能和不断出现的维护问题。 本质上&#xff0c;结论…

【转】如何减少接口响应时间

Premature optimization is the root of all evil. — Donald Knuth 对于程序优化&#xff0c;我一直采取保守的态度&#xff0c;除非万不得已。但是随着业务的不断发展&#xff0c;程序越来越复杂&#xff0c;代码越写越多&#xff0c;优化似乎是终有一天会到来的事情。 那么对…

数据库行转列在现实需求中的用法

select t.客户姓名,sum(case when t.收款类型首款 then t.金额 else 0 end as 首款),sum(case when t.收款类型尾款 then t.金额 else 0 end as 尾款) from table t group by t.客户姓名 这段sql的意思 是 查询出所有客户收款信息 然后按客户分组 分组后 然后将这个客户的所…

mysql生产环境加索引_【生产篇】_MySQL环境下如何查看基于表的索引定义

【引言】今天中午项目组来一需求&#xff0c;欲在MySQL环境的某张表下创建几个BTREE索引。要创建索引&#xff0c;首先需要了解基表的表结构&#xff0c;以及已经包含的索引。Oracle的表结构大家都很熟悉&#xff0c;但MySQL表结构和已创建索引的查看怎么操作&#xff0c;本文将…

Hadoop模式介绍-独立,伪分布式,分布式

了解了什么是Hadoop之后&#xff0c;让我们在单机上启动Hadoop&#xff1a; 这篇文章包含在ubuntu上安装Hadoop的说明。 这是Hadoop安装的快速分步教程。 在这里&#xff0c;您将获得以独立模式 &#xff08;单节点集群&#xff09;安装Hadoop所需的所有命令及其说明&#xff0…

apk反编译方式

一、Apk反编译得到Java源代码 下载上述反编译工具包&#xff0c;打开apk2java目录下的dex2jar-0.0.9.9文件夹&#xff0c;内含apk反编译成java源码工具&#xff0c;以及源码查看工具。 apk反编译工具dex2jar&#xff0c;是将apk中的classes.dex转化成jar文件 源码查看工具jdgui…