R语言自然语言处理(NLP):情感分析新闻文本数据

本文对R中的文本内容进行情感分析。此实现利用了各种现有的字典,此外,还可以创建自定义词典。自定义词典使用LASSO正则化作为一种​​统计方法来选择相关词语。最后,评估比较所有方法。

由Kaizong Ye,Coin Ge撰写

情感分析是自然语言处理(NLP),计算语言学和文本挖掘的核心研究分支。


它是指从文本文档中提取主观信息的方法。换句话说,它提取表达意见的积极负面极性。人们也可能将情感分析称为 观点挖掘 (Pang and Lee 2008)。

研究中的应用

最近,情感分析受到了广泛的关注(K. Ravi和Ravi 2015; Pang和Lee 2008),我们将在下面进行探讨。当前在金融和社会科学领域的研究利用情感分析来理解人类根据文本材料做出的决策。这立即揭示了对从业者以及金融研究和社会科学领域的从业者的多种含义:研究人员可以使用R提取与读者相关的文本成分,并在此基础上检验其假设。同样,从业人员可以衡量哪种措辞对他们的读者而言实际上很重要,并相应地提高他们的写作水平(Pröllochs,Feuerriegel和Neumann 2015)。在下面的两个案例研究中,我们从金融和社会科学中论证了增加的收益。

应用

几个应用程序演示了情感分析在组织和企业中的用途:

×

情感分类

情感分类又称情感倾向性分析,是指对给定的文本,识别其中主观性文本的倾向是肯定还是否定的,或者说是正面还是负面的,是情感分析领域研究最多的。通常网络文本存在大量的主观性文本和客观性文本。客观性文本是对事物的客观性描述,不带有感情色彩和情感倾向,主观性文本则是作者对各种事物的看法或想法,带有作者的喜好厌恶等情感倾向。情感分类的对象是带有情感倾向的主观性文本,因此情感分类首先要进行文本的主客观分类。文本的主客观分类主要以情感词识别为主,利用不同的文本特征表示方法和分类器进行识别分类,对网络文本事先进行主客观分类,能够提高情感分类的速度和准确度[3]。纵观目前主观性文本情感倾向性分析的研究工作,主要研究思路分为基于语义的情感词典方法和基于机器学习的方法。

基于语义的情感词典方法

(1) 构建词典

情感词典的构建是情感分类的前提和基础,目前在实际使用中,可将其归为 4 类:通用情感词、程度副词、否定词
、领域词。目前国内外,情感词典的构建方法主要是利用已有电子词典扩展生成情感词典。英文方面主要是基于对英文词典 的Word  Net 的扩充,Hu 和 Liu[4]在已手工建立种子形容词词汇表的基础上,利用 World Net 中词间的同义和近义关系判断情感词的情感倾向,并以此来判断观点的情感极性。中文方面则主要是对知网 How net 的扩充,朱嫣岚[5]利用语义相似度计算方法计算词语与基准情感词集的语义相似度,以此推断该词语的情感倾向。此外,还可以建立专门的领域词典,以提高情感分类的准确性。

(2)构建倾向性计算算法

基于语义的情感词典的倾向性计算不同于所需大量训练数据集的机器学习算法,主要是利用情感词典及句式词库分析文本语句的特殊结构及情感倾向词,采用权值算法代替传统人工判别或仅利用简单统计的方法进行情感分类。给情感强度不同的情感词赋予不同权值,然后进行加权求和。文献[6]利用加权平均算法式(1)计算,可有效提高通用领域情感分类的效率和准确率

其中,\large N_p,N_n分别代表表达正面情感和负面情感的词汇数目;\large wp_i,wp_j分别代表正面情感词汇和负面情感词汇的权值。

(3)确定阈值来判断文本倾向性

一般情况下,加权计算结果为正是正面倾向,结果为负是负面倾向 ,得分为零无倾向。所得结果评价一般采用自然语言中
经常使用的正确率、召回率和 F 值来评判算法效果。
基于情感词典的方法和基于机器学习的分类算法相比,虽属于粗粒度的倾向性分类方法,但由于不依赖标注好的训练集,实现相对简单,对于普遍通用领域的网络文本可有效快速地进行情感分类。

基于机器学习的情感分类方法

文本情感倾向性分析与传统的基于主题的文本分类相似但有所不同,基于主题的文本分类是把文本分类到各个预定义的主题上,如军事,互联网,政治,体育等,而情感分类不是基于内容本身的,而是按照文本持有的情感、态度进行判断。现有任何机器学习的分类方法都可以用到情感分类中来。基于机器学习的情感分类,其大致流程如下:首先人工标注文本倾向性作为训练集,提取文本情感特征,通过机器学习的方法构造情感分类器,待分类的文本通过分类器进行倾向性分类。常用的情感分类特征包括情感词,词性,句法结构,否定表达模板,连接,语义话题等[7],研究者通过挖掘各种不同的特征以期望提高情感分类的能。常用的特征提取方法有信息增益( Information Gain,IG),CHI 统计量( Chi - square,CHI) 和文档频率( Document Frequency,DF) 等。常用的分类方法有中心向量分类方法、K - 近邻(K - Nearest - Neighbor,KNN) 分类方法、贝叶斯分类器、支持向量机、条件随机场、最大熵分类器等。
最早从事情感分析研究的 Pang 等人[8]使用词袋(Bag - of - Feature) 框架选定文本的 N 元语法( N -Gram) 和词性( POS) 等作为情感 uo 特征,使用有监督的机器学习的方法将电影评论分为正向和负向两类,分别使用朴素贝叶斯,最大熵模型和支持向量机作为有监督学习算法的分类器。结果显示支持向量机在几种分类方法中效果最好,分类准确率达到 80% 。文本情感分类的准确率难以达到普通文本分类的水平,主要是情感文本中复杂的情感表达和大量的情感歧义造成的。在基于机器学习的情感分类算法中,每篇文章被转换成一个对应的特征向量来表示。特征选择的好坏将直接影响情感分析任务的性能。在 Pang 等人的研究基础上,后续研究主要是把情感分类作为一个特征优化任务[9- 11]。随着语义特征信息的加入和训练语料库的发展,基于机器学习的分类将会有广阔的发展前景。

情感检索

情感检索是从海量文本中查询到观点信息,根据主题相关度和观点倾向性对结果排序。情感检索返回的结果要同时满足主题相关和带有情感倾向或指定的情感倾向,是比情感分类更为复杂的任务。主题相关度和观点倾向性对结果排序,随着人们网络检索需求的增高,在传统搜索中加入情感倾向成了搜索技术中一个新的研究热点。和传统的互联网搜索相似,情感检索有两个主要任务:(1) 检索和查询相关的文档或句子。(2)对检索的相关文档或句子进行排序。与传统搜索不同的是互联网搜索的任务只要求找到和查询相关的文档和句子,而情感检索还要确定文档和句子是否表达了观点,以及观点是正面的或是负面的。目前情感检索主要实现方法有两种:一是按传统信息检索模型进行主题相关的文档检索,对检索结果进行情感分类;另一种是同时计算主题相关值和情感倾向值进行检索。第一种方法一般使用传统的检索模型以及较为成熟的查询扩展技术,然后用情感分类方法进行倾向性计
算。文献[12 ~ 13]给出的情感检索系统是国际文本检索会议 TREC(Text Retrieval Evaluation Conference)博客观点搜索任务的优胜者,该系统分为两部分检索部分和观点分类部分。检索部分完成传统的信息检索任务,同时在处理用户查询时将用户查询中的概念进行识别和消歧义,对于每个搜索查询进行同义词扩展,使用概念和关键字针对扩展后的查询对每个文档计算一个相似度,查询的关键字和文档的相关度是这两种相似度的综合。观点分类部分使用监督学习的方法使用两个分类器将文档分为两个类别带观点和不带观点的,带观点的文档再分为正面,负面或者混合的观点。第一个分类器训练数据是从评价网站包括 rateilt-
all. com 和 epinion. com 收集大量带观点的数据和从维基百科等客观性网站收集不带观点的训练数据。第二个分类器训练数据来自评论网站包含打分的评论,低的打分表明负面观点,高的打分表明正面观点。这里两种监督学习的分类器都采用支持向量机。在 TREC博客检索数据集研究的基础上,研究者采用不同的情感分类方法开展了后续研究[14 - 16]。

上面的方法是将检索和情感分类独立计算的,实际中主题相关和情感匹配是有关联的,需要同时计算主题相关和情感匹配,这是因为不同的情感词在文档中对不同的查询词下可能有相反的情感倾向。第二种方法则是同时考虑主题相关和情感文档排序,选择排序策略时需要同时兼顾。很多学者[17 - 18]对排序策略进行了研究,一般是分别计算情感倾向值和查询相关度值,然后加权求和进行排序。Zhang 等人[19]提出一种融合文档情感得分和文档查询相关度得分的概率生成模型排序方法,取得了理想的效果。
情感信息检索是传统信息检索技术和情感分析技术的融合,如何更好的融合二者得到理想的情感检索结果是未来要重点关注的。

情感抽取

情感抽取是指抽取情感文本中有价值的情感信息,其要判断一个单词或词组在情感表达中扮演的角色,包括情感表达者识别,评价对象识别,情感观点词识别等任务。情感表达者识别又称观点持有者抽取,其是观点、评论的隶属者。在社交媒体和产品评论中,观点持有者通常是文本的作者或者评论员,其的登录账号是可见的,观点持有者抽取比较简单。而对于新闻文章和其他一些表达观点的任务或者组织显式的出现在文档时,观点持有者一般则是由机构名或人名组成,所以可采用命名实体识别方法进行抽取。Kim[20]等人借助语义角色标注来完成观点持有者的抽取。然而这些处理方法会导致较低的语言覆盖现象和较差的领域适应性,可以通过基于模式识别的信息抽取 ( Information Extraction) 和 机 器 学 习 ( Machine Learning )技 术 来解决[21]。评价对象和情感词抽取在情感分析中具有重要作用。利用评价对象和情感词的抽取,可以构建领域相关的主题词表和情感词表,情感词表的构建在情感分类部分已做阐述。评价对象是指某段评论中的主题,是评论文本中评价词语修饰的对象,现有的研究大多
将评价对象限定在名词或名词短语的范畴内,一般使用基于模板和规则的方法抽取评价对象。规则的制定通常基于一系列的语言分析和预处理过程,命名实体识别,词性标注和句法分析等方法[22 - 25]都被用来进行评价对象抽取。文献[26]便是使用 3 条限制等级逐渐渐进的词性规则从评价对象集中抽取评价对象,取得了较好的结果。
情感抽取是情感分析的基础任务,通过对大量的情感文本分析,有价值的情感信息抽取对于情感分析的上层任务情感检索和情感分类有直接帮助,如何准确抽取情感信息一直都是研究者关注的重点。

文本情感分析评测

近年来,情感分析得到了越来越多研究机构和学者的关注,在 SIGIR、ACL、WWW、CIKM、WSDM 等著名国际会议上,针对这一问题的研究成果层出不穷[27],国内外研究机构组织了众多相关评测来推动情感分析技术的发展。

由国际文本检索会议 TREC 针对英文文本观点检索任务的博客检索任务(Blog Track),篇章情感分类任务,以及其他一些有趣的情感分析任务;由日本国立信息学研究所主办的搜索引擎评价国际会议 NTCIR(NIITest Collection for IR Systems) 针对日、韩、英、中文文本的情感分类以及观点持有者抽取任务。由中文信息学会信息检索委员会主办的每年一次的中文倾向性分析评测 C
OAE(Chinese Opinion Analysis Evaluation) 已举办了 5 届,在关注情感词语和观点句子的抽取以及倾向性识别的基础上重点对于否定句、比较句以及微博观点句进行评测[28]。众多研究机构的评测推动了情感分析研究的发展,出现了很多有代表性的情感分析语料库资源,文献[29 ~ 30]对语料库构建进行了详细阐述,如康奈尔影评数据集(Cornell Movie - Review Datasets),多视角问答( Multiple - Perspective Question Answering,MPQA)语料库,TREC 测试集,NTCIR 多语言语料库(
 NTCIRmultilingual corpus),中文 COAE 语料库等。

参考文献

[1] PANG B,LEE L. Opinion mining and sentiment analysis[J].Foundations and Trends in InformationRetrieval,2008,2 (1 -2) :130 - 135.
[2] 赵妍妍,秦兵,刘挺,等. 文本倾向性分析[J]. 软件学报,2010,21(8) :1834 - 1848.
[3] 厉小军,戴霖,施寒潇,等. 文本倾向性分析综述[J]. 浙江大学学报,2011,45(7):1167 - 1175.
[4] HU M,LIU B. Mining and summarizing customer reviews[C]. NY,USA:Proceedings of Knowledge Discoveryand Da-ta Mining,2004:168 - 177.
[5] 朱嫣岚,闵锦,周雅倩,等. 基于 How Net 的词汇语义倾向计算[J]. 中文信息学报,2006,20(1):14 - 20.
[6] 张昊旻,石博莹,刘栩宏. 基于权值算法的中文情感分析系统研究与实现[J]. 计算机应用研究,201229 (12):4571 - 4573.

[7] 李方涛. 基于产品评论的情感分析研究[D]. 北京:清华大学,2011.

[8] PANG B,LEE L,VAITHYANATHAN S. Thumbs up:senti-ment classification using machine learning techniques [
C].PA,USA:Proceedings of the ACL - 02 Conference on Empir-ical methods in natural language processing - Volume 10,Stroudsburg,Association for Computational Linguistics,2002:79 - 86.
[9] MELVILLE P,GRYC W,LAWRENCE. Sentiment analysis ofblogs by combining lexical knowledge with text classification[C]. New York:Proceedings of SIGKDD,ACM,2009.
[10] LI S,HUANG C,ZHOU G. Employing personal impersonal viewsin supervised and semisupervised sentiment classification [C].New York:Proceedings of ACL,ACM,2010:414 - 423.
[11] KUMAR A,SEBASTIAN T M. Sentiment analysis on twitter[J]. International Journal of Computer ScienceIssues,2012,9(4) :628 - 633.
[12] ZHANG W,YU C,MENG W. Opinion retrieval from blogs[C]. Proceedings of the Sixteenth ACM Conferenceon Con-ference on Information and Knowledge Management,ACM,2007:831 - 840.
[13] ZHANG W,JIA L,YU C,et al. Improve the effectiveness ofthe opinion retrieval and opinion polarity classification [C].MA USA:Proceedings of the 17th ACM Conference on Infor-mation and Knowledge Management,ACM,2008:1415 - 1416.


  • 金融: 金融市场的投资者在行使股票所有权之前,会以金融新闻披露的形式参考文本信息。有趣的是,它们不仅依赖数据,而且还依赖信息,例如语气和情感(Henry 2008; Loughran和McDonald 2011; Tetlock 2007),从而极大地影响了股价。通过利用情感分析,自动化交易者可以分析财务披露中传达的情感,以便进行投资决策。
  • 市场营销: 市场营销部门通常对跟踪品牌形象感兴趣。为此,他们从社交媒体上收集了大量用户意见,并评估个人对品牌,产品和服务的感受。
  • 评级和评论平台: 评级和评论平台通过收集用户对某些产品和服务的评级或偏好来实现有价值的功能。在这里,人们可以自动处理大量用户生成的内容(UGC)并利用由此获得的知识。例如,人们可以确定哪些提示传达了积极或者负面的意见,甚至可以自动验证其可信度。

情感分析方法

随着情感分析被应用于广泛的领域和文本来源,研究已经设计出各种测量情感的方法。最近的文献综述(Pang and Lee 2008)提供了一个全面的,与领域无关的调查。

一方面,当机器学习方法追求高预测性能时,它是首选。但是,机器学习通常充当黑匣子,从而使解释变得困难。另一方面,基于字典的方法会生成肯定和否定单词的列表。然后,将这些单词的相应出现组合为单个情感评分。因此,基本的决定变得可追溯,研究人员可以理解导致特定情感的因素。

另外, SentimentAnalysis 允许生成定制的字典。它们针对特定领域进行了定制,与纯字典相比,提高了预测性能,并具有完全的可解释性。可以在(Pröllochs,Feuerriegel和Neumann 2018)中找到此方法的详细信息。


视频

文本挖掘:主题模型(LDA)及R语言实现分析游记数据

探索见解

去bilibili观看

探索更多视频

在执行情感分析的过程中,必须将正在运行的文本转换为一种机器可读的格式。这是通过执行一系列预处理操作来实现的。首先,将文本标记为单个单词,然后执行常见的预处理步骤:停用词的删除,词干,标点符号的删除以及小写的转换。这些操作也默认在中进行 SentimentAnalysis,但可以根据个人需要进行调整。

简短示范

# 分析单个字符极性(正/负) 
anaSen("是的,这对德国队来说是一场很棒的足球比赛!")

## [1] positive
## Levels: negative positive

# 创建字符串向量
 
 
documents <- c("哇,我真的很喜欢新的轻型军刀!",
 
"那本书很棒。",
 
"R是一种很棒的语言。",
 
"这家餐厅的服务很糟糕。"
 
"这既不是正面也不是负面。",
 
"服务员忘了我的甜点-多么糟糕的服务!")
 
# 分析情感
 
 
anaSen(documents)
 
# 根据QDAP词典提取基于词典的情感
 
 
sentiment$SentimentQDAP

## [1]  0.3333333  0.5000000  0.5000000 -0.3333333  0.0000000 -0.4000000

#查看情感方向(即正面,中性和负面)
 
 
ToDirection(sentiment$SentimentQDAP)

## [1] positive positive positive negative neutral  negative

## Levels: negative neutral positive
response <- c(+1, +1, +1, -1, 0, -1)
 

comToRne(sentiment, response)
##                              WordCount  SentimentGI  NegativityGI
## cor                        -0.18569534  0.990011498 -9.974890e-01
## cor.t.statistic            -0.37796447 14.044046450 -2.816913e+01
## cor.p.value                 0.72465864  0.000149157  9.449687e-06
## lm.t.value                 -0.37796447 14.044046450 -2.816913e+01
## r.squared                   0.03448276  0.980122766  9.949843e-01
## RMSE                        3.82970843  0.450102869  1.186654e+00
## MAE                         3.33333333  0.400000000  1.100000e+00
## Accuracy                    0.66666667  1.000000000  6.666667e-01
## Precision                          NaN  1.000000000           NaN
## Sensitivity                 0.00000000  1.000000000  0.000000e+00
## Specificity                 1.00000000  1.000000000  1.000000e+00
## F1                          0.00000000  0.500000000  0.000000e+00
## BalancedAccuracy            0.50000000  1.000000000  5.000000e-01
## avg.sentiment.pos.response  3.25000000  0.333333333  8.333333e-02
## avg.sentiment.neg.response  4.00000000 -0.633333333  6.333333e-01

从文本挖掘中执行了一组预处理操作。将标记每个文档,最后将输入转换为文档项矩阵。

 

输入

提供了具有其他几种输入格式的接口,其中包括

  • 字符串向量。
  • tm 软件包中实现的DocumentTermMatrix和 TermDocumentMatrix(Feinerer,Hornik和Meyer 2008)。
  • tm 软件包实现的语料库对象 (Feinerer,Hornik和Meyer 2008)。

我们在下面提供示例。


情感分析疫情下的新闻数据

阅读文章


向量的字符串

documents <- c("这很好", "这不好", "这介于两者之间")
convertToDirection(analyzeSentiment(documents)$SentimentQDAP)
## [1] positive negative neutral 
## Levels: negative neutral positive

文档词语矩阵

corpus <- VCorpus(VectorSource(documents))
convertToDirection(analyzeSentiment(corpus)$SentimentQDAP)
## [1] positive negative neutral 
## Levels: negative neutral positive

语料库对象

## [1] positive negative neutral ## Levels: negative neutral positive

可以直接与文档术语矩阵一起使用,因此一开始就可以使用自定义的预处理操作。之后,可以计算情感分数。例如,可以使用其他列表中的停用词替换停用词。

字典

可区分三种不同类型的词典。它们所存储的数据各不相同,这些数据最终还控制着可以应用哪种情感分析方法。字典如下:

  • SentimentDictionaryWordlist 包含属于一个类别的单词列表。
  • SentimentDictionaryBinary 存储两个单词列表,一个用于肯定条目,一个用于否定条目。
  • SentimentDictionaryWeighted 允许单词的情感评分。

情感词典词表

# 替代
 
d <- Dictionary(c(“不确定”,“可能”,“有可能”))
summary(d)
## Dictionary type:  word list (single set)
## Total entries:    3

情感词典

d <- DictionaryBin(c(“增加”,“上升”,“更多”),
                               c(“下降”))
summary(d)
## Dictionary type:  binary (positive / negative)
## Total entries:    5
## Positive entries: 3 (60%)
## Negative entries: 2 (40%)

情感词典加权

d <- SentimentDictionaryWeighted(c(“增加”,“减少”,“退出”),
                                 c(+1, -1, -10),
                                 rep(NA, 3))
summary(d)
## Dictionary type:  weighted (words with individual scores)
## Total entries:    3
## Positive entries: 1 (33.33%)
## Negative entries: 2 (66.67%)
## Neutral entries:  0 (0%)
## 
## Details
## Average score:      -3.333333
## Median:             -1
## Min:                -10
## Max:                1
## Standard deviation: 5.859465
## Skewness:           -0.6155602
d <- SentimentDictionary(c(“增加”,“减少”,“退出”),
                         c(+1, -1, -10),
                         rep(NA, 3))
summary(d)                                        
## Dictionary type:  weighted (words with individual scores)
## Total entries:    3
## Positive entries: 1 (33.33%)
## Negative entries: 2 (66.67%)
## Neutral entries:  0 (0%)
## 
## Details
## Average score:      -3.333333
## Median:             -1
## Min:                -10
## Max:                1
## Standard deviation: 5.859465
## Skewness:           -0.6155602

字典生成

用向量的形式表示因变量。此外,变量给出了单词在文档中出现的次数。然后,该方法估计具有截距和系数的线性模型。估计基于LASSO正则化,它执行变量选择。这样,它将某些系数设置为正好为零。然后可以根据剩余单词的系数按极性对它们进行排序。

# 创建字符串向量
 
 
documents <- c(“这是一件好事!”,
 
“这是一件非常好的事!”,
 
“没关系。”
 
“这是一件坏事。”,
 
“这是一件非常不好的事情。”
 
)
response <- c(1, 0.5, 0, -0.5, -1)
 
# 使用LASSO正则化生成字典
 
 
dict
## Type: weighted (words with individual scores)
## Intercept: 5.55333e-05
## -0.51 bad
##  0.51 good
summary(dict)
## Dictionary type:  weighted (words with individual scores)
## Total entries:    2
## Positive entries: 1 (50%)
## Negative entries: 1 (50%)
## Neutral entries:  0 (0%)
## 
## Details
## Average score:      -5.251165e-05
## Median:             -5.251165e-05
## Min:                -0.5119851
## Max:                0.5118801
## Standard deviation: 0.7239821
## Skewness:           0

有几种微调选项。只需更改参数,就可以用弹性网络模型替换LASSO  。

最后,可以使用read() 和 保存和重新加载字典 write()

评估

最终,例程允许人们进一步挖掘生成的字典。一方面,可以通过summary() 例程显示简单的概述 。另一方面,核密度估计也可以可视化正词和负词的分布。

## Comparing: wordlist vs weighted
## 
## Total unique words: 4213
## Matching entries: 2 (0.0004747211%)
## Entries with same classification: 0 (0%)
## Entries with different classification: 2 (0.0004747211%)
## Correlation between scores of matching entries: 1
## $totalUniqueWords
## [1] 4213
## 
## $totalSameWords
## [1] 2
## 
## $ratioSameWords
## [1] 0.0004747211
## 
## $numWordsEqualClass
## [1] 0
## 
## $numWordsDifferentClass
## [1] 2
## 
## $ratioWordsEqualClass
## [1] 0
## 
## $ratioWordsDifferentClass
## [1] 0.0004747211
## 
## $correlation
## [1] 1
##                             Dictionary
## cor                         0.94868330
## cor.t.statistic             5.19615237
## cor.p.value                 0.01384683
## lm.t.value                  5.19615237
## r.squared                   0.90000000
## RMSE                        0.23301039
## MAE                         0.20001111
## Accuracy                    1.00000000
## Precision                   1.00000000
## Sensitivity                 1.00000000
## Specificity                 1.00000000
## F1                          0.57142857
## BalancedAccuracy            1.00000000
## avg.sentiment.pos.response  0.45116801
## avg.sentiment.neg.response -0.67675202

下面的示例演示如何将计算出的字典用于预测样本外数据的情感。然后通过将其与内置词典进行比较来评估预测性能。

test_documents <- c(“这既不是好事也不是坏事”,
 
“真是好主意!”,
 
“不错”
)
 
pred <- predict(dict, test_documents)
 
##                              Dictionary
## cor                        5.922189e-05
## cor.t.statistic            5.922189e-05
## cor.p.value                9.999623e-01
## lm.t.value                 5.922189e-05
## r.squared                  3.507232e-09
## RMSE                       8.523018e-01
## MAE                        6.666521e-01
## Accuracy                   3.333333e-01
## Precision                  0.000000e+00
## Sensitivity                         NaN
## Specificity                3.333333e-01
## F1                         0.000000e+00
## BalancedAccuracy                    NaN
## avg.sentiment.pos.response 1.457684e-05
## avg.sentiment.neg.response          NaN
##                             WordCount SentimentGI NegativityGI
## cor                        -0.8660254 -0.18898224   0.18898224
## cor.t.statistic            -1.7320508 -0.19245009   0.19245009
## cor.p.value                 0.3333333  0.87896228   0.87896228
## lm.t.value                 -1.7320508 -0.19245009   0.19245009
## r.squared                   0.7500000  0.03571429   0.03571429
## RMSE                        1.8257419  1.19023807   0.60858062
## MAE                         1.3333333  0.83333333   0.44444444
## Accuracy                    1.0000000  0.66666667   1.00000000
## Precision                         NaN  0.00000000          NaN
## Sensitivity                       NaN         NaN          NaN
## Specificity                 1.0000000  0.66666667   1.00000000
## F1                          0.0000000  0.00000000   0.00000000
## BalancedAccuracy                  NaN         NaN          NaN
## avg.sentiment.pos.response  2.0000000 -0.16666667   0.44444444
## avg.sentiment.neg.response        NaN         NaN          NaN
##                            PositivityGI SentimentHE NegativityHE
## cor                         -0.18898224 -0.18898224           NA
## cor.t.statistic             -0.19245009 -0.19245009           NA
## cor.p.value                  0.87896228  0.87896228           NA
## lm.t.value                  -0.19245009 -0.19245009           NA
## r.squared                    0.03571429  0.03571429           NA
## RMSE                         0.67357531  0.67357531    0.8164966
## MAE                          0.61111111  0.61111111    0.6666667
## Accuracy                     1.00000000  1.00000000    1.0000000
## Precision                           NaN         NaN          NaN
## Sensitivity                         NaN         NaN          NaN
## Specificity                  1.00000000  1.00000000    1.0000000
## F1                           0.00000000  0.00000000    0.0000000
## BalancedAccuracy                    NaN         NaN          NaN
## avg.sentiment.pos.response   0.27777778  0.27777778    0.0000000
## avg.sentiment.neg.response          NaN         NaN          NaN
##                            PositivityHE SentimentLM NegativityLM
## cor                         -0.18898224 -0.18898224   0.18898224
## cor.t.statistic             -0.19245009 -0.19245009   0.19245009
## cor.p.value                  0.87896228  0.87896228   0.87896228
## lm.t.value                  -0.19245009 -0.19245009   0.19245009
## r.squared                    0.03571429  0.03571429   0.03571429
## RMSE                         0.67357531  1.19023807   0.60858062
## MAE                          0.61111111  0.83333333   0.44444444
## Accuracy                     1.00000000  0.66666667   1.00000000
## Precision                           NaN  0.00000000          NaN
## Sensitivity                         NaN         NaN          NaN
## Specificity                  1.00000000  0.66666667   1.00000000
## F1                           0.00000000  0.00000000   0.00000000
## BalancedAccuracy                    NaN         NaN          NaN
## avg.sentiment.pos.response   0.27777778 -0.16666667   0.44444444
## avg.sentiment.neg.response          NaN         NaN          NaN
##                            PositivityLM RatioUncertaintyLM SentimentQDAP
## cor                         -0.18898224                 NA   -0.18898224
## cor.t.statistic             -0.19245009                 NA   -0.19245009
## cor.p.value                  0.87896228                 NA    0.87896228
## lm.t.value                  -0.19245009                 NA   -0.19245009
## r.squared                    0.03571429                 NA    0.03571429
## RMSE                         0.67357531          0.8164966    1.19023807
## MAE                          0.61111111          0.6666667    0.83333333
## Accuracy                     1.00000000          1.0000000    0.66666667
## Precision                           NaN                NaN    0.00000000
## Sensitivity                         NaN                NaN           NaN
## Specificity                  1.00000000          1.0000000    0.66666667
## F1                           0.00000000          0.0000000    0.00000000
## BalancedAccuracy                    NaN                NaN           NaN
## avg.sentiment.pos.response   0.27777778          0.0000000   -0.16666667
## avg.sentiment.neg.response          NaN                NaN           NaN
##                            NegativityQDAP PositivityQDAP
## cor                            0.18898224    -0.18898224
## cor.t.statistic                0.19245009    -0.19245009
## cor.p.value                    0.87896228     0.87896228
## lm.t.value                     0.19245009    -0.19245009
## r.squared                      0.03571429     0.03571429
## RMSE                           0.60858062     0.67357531
## MAE                            0.44444444     0.61111111
## Accuracy                       1.00000000     1.00000000
## Precision                             NaN            NaN
## Sensitivity                           NaN            NaN
## Specificity                    1.00000000     1.00000000
## F1                             0.00000000     0.00000000
## BalancedAccuracy                      NaN            NaN
## avg.sentiment.pos.response     0.44444444     0.27777778
## avg.sentiment.neg.response            NaN            NaN

预处理

如果需要,可以实施适合特定需求的预处理阶段。如函数 ngram_tokenize() ,用于从语料库中提取n-gram。

tdm <- TermDocumentMatrix(corpus, 
                          control=list(wordLengths=c(1,Inf), 
                                       tokenize=function(x) ngram_tokenize(x, char=FALSE, 
                                                                           ngmin=1, ngmax=2)))
## Dictionary type:  weighted (words with individual scores)
## Total entries:    7
## Positive entries: 4 (57.14%)
## Negative entries: 3 (42.86%)
## Neutral entries:  0 (0%)
## 
## Details
## Average score:      5.814314e-06
## Median:             1.602469e-16
## Min:                -0.4372794
## Max:                0.4381048
## Standard deviation: 0.301723
## Skewness:           0.00276835
dict
## Type: weighted (words with individual scores)
## Intercept: -5.102483e-05
## -0.44 不好
## -0.29 非常糟糕
## 0.29  好
 
 

性能优化

##   SentimentLM
## 1         0.5
## 2         0.5
## 3         0.0
## 4        -0.5
## 5        -0.5

语言支持和可扩展性

 可以适应其他语言使用。为此,需要在两点上进行更改:

  • 预处理:使用参数 language="" 来执行所有预处理操作。
  • 字典: 可以使用附带的字典生成方法 。然后,这可以自动生成可应用于给定语言的正负词词典。

下面的示例使用德语示例。最后,我们进行情感分析。

documents <- c("Das ist ein gutes Resultat",
               "Das Ergebnis war schlecht")
 
sentiment <- ana(documents,
                              language="german",
sentiment
##   GermanSentiment
## 1             0.0
## 2            -0.5
## [1] positive negative
## Levels: negative positive

同样,可以使用自定义情感分数来实现字典。

woorden <- c("goed","slecht")
scores <- c(0.8,-0.5)
##   DutchSentiment
## 1           -0.5

实例

我们利用了tm 包中的路透社石油新闻 。

 # 分析情感 
sentiment <- ana(crude) # 计算正面和负面新闻发布数量  
table(coToB(sentiment$SentimentLM))
## 
## negative positive 
##       16        4
# 情感最高和最低的新闻 
## [1] "HOUSTON OIL <HO> RESERVES STUDY COMPLETED"
crude[[which.min(sentiment$SentimentLM)]]$meta$heading
## [1] "DIAMOND SHAMROCK (DIA) CUTS CRUDE PRICES"
# 查看情感变量的摘要统计
  summary(sentiment$SentimentLM)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -0.08772 -0.04366 -0.02341 -0.02953 -0.01375  0.00000
# 可视化标准化情感变量的分布  
hist(scale(sentiment$SentimentLM))
# 计算相关
##               SentimentLM SentimentHE SentimentQDAP
## SentimentLM     1.0000000   0.2769878     0.4769730
## SentimentHE     0.2769878   1.0000000     0.6141075
## SentimentQDAP   0.4769730   0.6141075     1.0000000
#  1987-02-26  1987-03-02之间的原油新闻  
plot(senti$Sentime)
plot(SenLM, x=date, cumsum=TRUE)

单词计算

对单词进行计数 。

##   WordCount
## 1         3
# 计算所有单词(包括停用词)
##   WordCount
## 1         4

参考文献

Feinerer,Ingo,Kurt Hornik和David Meyer。2008年。“ R中的文本挖掘基础结构”。 统计软件杂志 25(5):1–54。

Tetlock,Paul C.,2007年。“将内容传递给投资者的情感:媒体在股票市场中的作用。” 金融杂志 62(3):1139–68。


可下载资源

关于作者

Kaizong Ye拓端研究室(TRL)的研究员。

本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。

​非常感谢您阅读本文,如需帮助请联系我们!

 
QQ在线咨询
售前咨询热线
15121130882
售后咨询热线
0571-63341498

关注有关新文章的微信公众号


永远不要错过任何见解。当新文章发表时,我们会通过微信公众号向您推送。

技术干货

最新洞察

This will close in 0 seconds