今天学习如何使用斯坦福CoreNLP Java API来进行情感分析(sentiment analysis)。前几天,我还写了一篇关于如何使用TextBlob API在Python里做情感分析,我已经开发了一个应用程序,会筛选出给定关键词的推文(tweets)的情感,现在看看它能做什么。

应用

该演示应用程序在OpenShift http://sentiments-t20.rhcloud.com/ 运行,它有两个功能:

  1. 第一个功能是,如果你给定Twitter搜索条件的列表会,它会显示最近20推关于给定的搜索词的情绪。必须要勾选下图所示的复选框来启用此功能,(情感)积极的推文将显示绿色,而消极的推文是红色的。

  2. 第二个功能是做一些文字上的情感分析,如下图

什么是斯坦福CoreNLP?

斯坦福CoreNLP是一个Java自然语言分析库,它集成了所有的自然语言处理工具,包括词性的终端(POS)标注器,命名实体识别(NER),分析器,对指代消解系统,以及情感分析工具,并提供英语分析的模型文件。

准备

  1. 基本的Java知识是必需的,安装最新的Java开发工具包(JDK ),可以是OpenJDK 7或Oracle JDK 7。
  2. 从官方网站下载斯坦福CoreNLP包。
  3. 注册一个OpenShift帐户,它是完全免费的,可以分配给每个用户1.5 GB的内存和3 GB的磁盘空间。
  4. 安装RHC客户端工具,需要有ruby 1.8.7或更新的版本,如果已经有ruby gem,输入 sudo gem install rhc ,确保它是最新版本。要更新RHC的话,执行命令sudo gem update rhc,如需其他协助安装RHC命令行工具,请参阅该页面: https://www.openshift.com/developers/rhc-client-tools-install
  5. 通过 rhc setup 命令设置您的OpenShift帐户,此命令将帮助你创建一个命名空间,并上传你的SSH keys到OpenShift服务器。

Github仓库

今天的演示应用程序的代码可以在GitHub找到:day20-stanford-sentiment-analysis-demo


在两分钟内启动并运行SentimentsApp

开始创建应用程序,名称为sentimentsapp

$ rhc create-app sentimentsapp jbosseap --from-code=https://github.com/shekhargulati/day20-stanford-sentiment-analysis-demo.git

还可以使用如下指令:

$ rhc create-app sentimentsapp jbosseap -g medium --from-code=https://github.com/shekhargulati/day20-stanford-sentiment-analysis-demo.git

这将为应用程序创建一个容器,设置所有需要的SELinux政策和cgroup的配置,OpenShift也将创建一个私人git仓库并克隆到本地。然后,它会复制版本库到本地系统。最后,OpenShift会给外界提供一个DNS,该应用程序将在http://newsapp-{domain-name}.rhcloud.com/ 下可以访问(将 domain-name 更换为自己的域名)。

该应用程序还需要对应Twitter应用程序的4个环境变量,通过去https://dev.twitter.com/apps/new 创建一个新的Twitter应用程序,然后创建如下所示的4个环境变量。

$ rhc env set TWITTER_OAUTH_ACCESS_TOKEN=<please enter value> -a sentimentsapp$ rhc env set TWITTER_OAUTH_ACCESS_TOKEN_SECRET=<please enter value> -a sentimentsapp$rhc env set TWITTER_OAUTH_CONSUMER_KEY=<please enter value> -a sentimentsapp$rhc env set TWITTER_OAUTH_CONSUMER_SECRET=<please enter value> -a sentimentsapp

重新启动应用程序,以确保服务器可以读取环境变量。

$ rhc restart-app --app sentimentsapp

开始在pom.xml中为stanford-corenlptwitter4j增加Maven的依赖关系,使用3.3.0版本斯坦福corenlp作为情感分析的API。

<dependency><groupId>edu.stanford.nlp</groupId><artifactId>stanford-corenlp</artifactId><version>3.3.0</version>
</dependency><dependency><groupId>org.twitter4j</groupId><artifactId>twitter4j-core</artifactId><version>[3.0,)</version>
</dependency>

该twitter4j依赖关系需要Twitter搜索。

通过更新 pom.xml 文件里的几个特性将Maven项目更新到Java 7:

<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>

现在就可以更新Maven项目了(右键单击>Maven>更新项目)。

启用CDI

使用CDI来进行依赖注入。CDI、上下文和依赖注入是一个Java EE 6规范,能够使依赖注入在Java EE 6的项目中。

src/main/webapp/WEB-INF 文件夹下建一个名为beans.xml中一个新的XML文件,启动CDI

<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"></beans>

搜索Twitter的关键字

创建了一个新的类TwitterSearch,它使用Twitter4J API来搜索Twitter关键字。该API需要的Twitter应用程序配置参数,使用的环境变量得到这个值,而不是硬编码。

import java.util.Collections;
import java.util.List;import twitter4j.Query;
import twitter4j.QueryResult;
import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.conf.ConfigurationBuilder;public class TwitterSearch {public List<Status> search(String keyword) {ConfigurationBuilder cb = new ConfigurationBuilder();cb.setDebugEnabled(true).setOAuthConsumerKey(System.getenv("TWITTER_OAUTH_CONSUMER_KEY")).setOAuthConsumerSecret(System.getenv("TWITTER_OAUTH_CONSUMER_SECRET")).setOAuthAccessToken(System.getenv("TWITTER_OAUTH_ACCESS_TOKEN")).setOAuthAccessTokenSecret(System.getenv("TWITTER_OAUTH_ACCESS_TOKEN_SECRET"));TwitterFactory tf = new TwitterFactory(cb.build());Twitter twitter = tf.getInstance();Query query = new Query(keyword + " -filter:retweets -filter:links -filter:replies -filter:images");query.setCount(20);query.setLocale("en");query.setLang("en");;try {QueryResult queryResult = twitter.search(query);return queryResult.getTweets();} catch (TwitterException e) {// ignoree.printStackTrace();}return Collections.emptyList();}}

在上面的代码中,筛选了Twitter的搜索结果,以确保没有转推(retweet)、或带链接的推文、或有图片的推文,这样做的原因是为了确保我们得到的是有文字的推。

情感分析器(SentimentAnalyzer)

创建了一个叫SentimentAnalyzer的类,这个类就是对某一条推文进行情感分析的。

public class SentimentAnalyzer {public TweetWithSentiment findSentiment(String line) {Properties props = new Properties();props.setProperty("annotators", "tokenize, ssplit, parse, sentiment");StanfordCoreNLP pipeline = new StanfordCoreNLP(props);int mainSentiment = 0;if (line != null && line.length() > 0) {int longest = 0;Annotation annotation = pipeline.process(line);for (CoreMap sentence : annotation.get(CoreAnnotations.SentencesAnnotation.class)) {Tree tree = sentence.get(SentimentCoreAnnotations.AnnotatedTree.class);int sentiment = RNNCoreAnnotations.getPredictedClass(tree);String partText = sentence.toString();if (partText.length() > longest) {mainSentiment = sentiment;longest = partText.length();}}}if (mainSentiment == 2 || mainSentiment > 4 || mainSentiment < 0) {return null;}TweetWithSentiment tweetWithSentiment = new TweetWithSentiment(line, toCss(mainSentiment));return tweetWithSentiment;}
}

复制 englishPCFG.ser.gzsentiment.ser.gz 模型到src/main/resources/edu/stanford/nlp/models/lexparsersrc/main/resources/edu/stanford/nlp/models/sentiment 文件夹下。

创建SentimentsResource

最后,创建了JAX-RS资源类。

public class SentimentsResource {@Injectprivate SentimentAnalyzer sentimentAnalyzer;@Injectprivate TwitterSearch twitterSearch;@GET@Produces(value = MediaType.APPLICATION_JSON)public List<Result> sentiments(@QueryParam("searchKeywords") String searchKeywords) {List<Result> results = new ArrayList<>();if (searchKeywords == null || searchKeywords.length() == 0) {return results;}Set<String> keywords = new HashSet<>();for (String keyword : searchKeywords.split(",")) {keywords.add(keyword.trim().toLowerCase());}if (keywords.size() > 3) {keywords = new HashSet<>(new ArrayList<>(keywords).subList(0, 3));}for (String keyword : keywords) {List<Status> statuses = twitterSearch.search(keyword);System.out.println("Found statuses ... " + statuses.size());List<TweetWithSentiment> sentiments = new ArrayList<>();for (Status status : statuses) {TweetWithSentiment tweetWithSentiment = sentimentAnalyzer.findSentiment(status.getText());if (tweetWithSentiment != null) {sentiments.add(tweetWithSentiment);}}Result result = new Result(keyword, sentiments);results.add(result);}return results;}
}

上述代码执行以下操作:

  1. 检查搜索关键字(searchkeywords)是否“不是无效且不为空”,然后将其拆分到一个数组里,只考虑三个搜索条件。
  2. 然后对每一个搜索条件找到对应的推文,并做情感分析。
  3. 最后将返回结果列表给用户。

今天就是这些,欢迎反馈。


原文 Day 20: Stanford CoreNLP--Performing Sentiment Analysis of Twitter using Java
翻译整理 SegmentFault

Day 20: 斯坦福CoreNLP —— 用Java给Twitter进行情感分析相关推荐

  1. 使用深度学习模型在 Java 中执行文本情感分析

    积极的? 消极的? 中性的? 使用斯坦福 CoreNLP 组件以及几行代码便可对句子进行分析. 本文介绍如何使用集成到斯坦福 CoreNLP(一个用于自然语言处理的开源库)中的情感工具在 Java 中 ...

  2. 【API进阶之路】帮公司省下20万调研费!如何巧用情感分析API实现用户偏好调研

    上次借着高考热点整出一个刷屏的互动游戏之后,我连续被各业务部门请了一周的午饭了,今天运营部,明天品牌部,后天市场部-心里暗搓搓地想,这业务部门的团建经费咋就这么多呢? (详情请查看上集:<高考要 ...

  3. 矩池云 | Tony老师解读Kaggle Twitter情感分析案例

    今天Tony老师给大家带来的案例是Kaggle上的Twitter的情感分析竞赛.在这个案例中,将使用预训练的模型BERT来完成对整个竞赛的数据分析. 导入需要的库 import numpy as np ...

  4. Streamlit实战Twitter微博情感分类【Flair】

    Streamlit是一个出色的机器学习工具开发库,这个教程将学习如何使用streamlit和flair开发一个twitter微博情感分析的应用. 相关链接:Streamlit开发手册 1.stream ...

  5. 斯坦福ner python_斯坦福大学Corenlp和Java入门(Python程序员)

    斯坦福ner python Hello there! I'm back and I want this to be the first of a series of post on Stanford' ...

  6. 使用java进行婚礼庆祝_#102030:在30天内运行20 10K,庆祝Java 20年

    使用java进行婚礼庆祝 1995年5月23日是技术史上的重要时刻. 业界似乎并未意识到当天发布的语言会在未来几年内完全改变技术的格局. Java将在今年的同一天庆祝20岁生日. Java 20年,哇 ...

  7. scala rest_使用路标的Scala和Java的Twitter REST API

    scala rest 如果您已经阅读了此博客上的其他文章,您可能会知道我喜欢创建各种数据集的可视化. 我刚刚开始一个小项目,在这里我想可视化来自Twitter的一些数据. 为此,我想直接从Twitte ...

  8. #102030:在30天内运行20 10K来庆祝Java的20年

    1995年5月23日是技术史上的重要时刻. 业界似乎并没有意识到当天发布的语言会在未来几年内完全改变技术的格局. Java将在今年的同一天庆祝20岁生日. Java 20年,哇! 回顾20年前的存储器 ...

  9. #102030:在30天内运行20 10K,庆祝Java 20年

    1995年5月23日是技术史上的重要时刻. 业界似乎并没有意识到当天发布的语言会在未来几年内完全改变技术的格局. Java将在今年的同一天庆祝20岁生日. Java 20年,哇! 回顾20年前的存储器 ...

最新文章

  1. vmware虚拟机redhat7.2下docker容器安装hadoop
  2. torch转onnx错误 exit code -1073741819
  3. Java多线程编程那些事:volatile解惑--转
  4. Cisco无线AP上联口为trunk时无法注册故障处理
  5. 集成源码深度剖析:Fescar x Spring Cloud
  6. 【VMware vSAN 6.6】2.5.硬件部署选项:我们有软硬件项目解决方案
  7. UVA10882 Koerner's Pub【数学】
  8. Spring2.5整合ActiveMQ 5.2(P2P文本消息)
  9. JVM虚拟机详解(一)JVM与JAVA体系统结构
  10. 数独基本规则_数独游戏规则?
  11. stata图像绘制专题【计量经济系列(二)】
  12. 解决 EIGEN_STACK_ALLOCATION_LIMIT, OBJECT_ALLOCATED_ON_STACK_IS_TOO_BIG 报错
  13. android操作蓝牙打印机(上)
  14. 达人评测 酷睿i5 12450h和锐龙r7 5700u选哪个好 i512450h和r75700u对比
  15. python_练习2:输入a,b,c,d 4个整数,计算a+b-c*d的结果
  16. 神经元网络算法的思想,神经网络算法应用案例
  17. SSH学习(个人笔记)
  18. 外形很犀利 Win7旗舰版全新体验
  19. lc用U盘更新固件_普通U盘和固态U盘相差多少?用下aigo固态U盘就知道了
  20. 坚守在技术无人区,一群无名英雄的低调与浪漫

热门文章

  1. 为什么硅谷公司对Android不感冒?
  2. linux 删除20日前数据,Linux 维护常用命令
  3. Visual Studio 2013开发 mini-filter driver step by step (2) - 编译,部署,运行
  4. 每日一博 - 延时任务的多种实现方式解读
  5. MySQL-count(*) 和 not in 的查询优化
  6. Linux 系统目录结构
  7. 关于source /etc/profile命令
  8. 传递list对象作为参数_24.scala的隐式参数
  9. debian安装python3_debian上安装python3.6
  10. 2021-04-15 深入理解SLAM技术 【2】 SLAM的框架