情感分析:从文本中提前作者情感意识的过程。

情感分析的难点:

  1. 受文化和人口统计学因素的影响;
  2. 情绪难以量化;
  3. 分析师或建模的偏见会破坏情感分析;
  4. 指定特征的情感分析更难。(如:对餐馆的评论——价格nice,但是食物一般。)

Plutchik 创建的情感分类系统,认为存在以下8种主要的情绪:

  • anger 愤怒
  • fear 恐惧
  • sadness 悲伤
  • disgust 厌恶
  • surprise 惊讶
  • anticipation 期待
  • trust 信任
  • joy 快乐

由于惊讶 ∑( 口 ||,可能是正面的“我中了五百万”,也可能是负面的“乔丹坠机去世了”。因而分析文本的极性polarity 比分析文本的情绪sentiment更容易。

4.2 情绪评分

假设您想在波士顿有一间公寓,希望通过http://Airbnb.com服务进行出租。您希望通过租用公寓赚一些额外的钱,但是要确保公寓具有良好的出租质量。

1)定义问题和特定目标。在正面或负面评论中列出了哪些公寓质量?

2)确定需要收集的文本。 入住之后,Airbnb的房客可以发表有关该公寓的评论。 这些评论是公开的,可以辅助新租户作决定。

3)整理文字。 语料库包含1000个随机选择的波士顿Airbnb列表。 您将清理并整理评论频率矩阵。

4)提取特征。 一旦组织好TDM,您将需要计算各种情绪和极性得分。

5)分析。 情感和极性得分将用于评论分类

4.2.1 主观性词典

qdap软件包使用的主观性词典来自芝加哥伊利诺伊大学的刘冰进行的研究。该词典稍小,包含大约6800个带标签的单词,但它是基于经过严格审查的学术研究得出的。

例:

Sentiment analysis in R is good yet challenging.

Sentiment analysis in python is not good.

Sentiment analysis in R is very good.

❓为什么6800词的主观性词典有效?

Zip定律认为,文档中任何词出现的频率与其排名次序成反比。

最小努力原则,尽管存在数以万计的单词,但日常交流常用的只有几千个不同的词语。

4.2.2 qdap's正负面词的评分

1)polarity 函数可在主观性词典中扫描正面词汇和负面词汇。

2)一旦找到了极性词,该函数就会创建一组词汇,包括前四个词和后两个词。

3)在单词簇中,中性词被计为0。 构成聚类基础的正词和负词分别计为1和-1。 因此,其余的非中性和非极性词被视为程度副词。 这些程度副词被赋予权重,以放大或缩小原始的极性词。 默认值为0.8。 因此,正面词汇+0.8,而负面词汇-0.8。

4)将单词簇中的所有值相加,生成极性总和。

5)然后将总和除以段落中所有单词的平方根,以衡量关键字的密度。

1.8/sqrt(7)≈0.68

#Airbnb关于波士顿公寓或房子的评论
options(stringsAsFactors = FALSE)
Sys.setlocale(category = "LC_ALL", locale = "C")
library(tm)
library(qdap)
library(wordcloud)
library(ggplot2)
library(ggthemes)setwd("E:/Rdata/text_mining-master/")
bos.airbnb<-read.csv('bos_airbnb_1k.csv')
bos.pol<-polarity(as.character(bos.airbnb$comments))ggplot(bos.pol$all,aes(x=polarity,y=..density..))+theme_gdocs()+geom_histogram(binwidth=0.25,fill="darkred",colour="grey60",size=0.2)+geom_density(size=0.75)

以0.9为中心而非0,说明评论至少有一个积极的词

反应偏差会导致“分数膨胀”。

TF-IDF

TFIDF是词频(TF)和逆文档频率(IDF)的乘积。从常识的角度来看,如果一个词汇经常出现,则认为它很重要。但是,如果它出现在所有文档中,那么它可能就没有那么重要的信息了。

词频(TF)计算文档中某个词汇出现的次数。因为文档很长,所以单词出现的频率更高,所以我们可以通过除以文档长度来对频率进行标准化。

TF =(term occurrences in a document)/(total unique terms in the document)

逆文档频率(IDF)

IDF =log(total document in corpus/number of documents with term t in it)

TF-IDF=TF*IDF

极性词云

bos.airbnb$polarity<-scale(bos.pol$all$polarity)
pos.comments<-subset(bos.airbnb$comments,bos.airbnb$polarity>0)
neg.comments<-subset(bos.airbnb$comments,bos.airbnb$polarity<0)
pos.terms<-paste(pos.comments,collapse = " ")
neg.terms<-paste(neg.comments,collapse = " ")
all.corpus<-VCorpus(VectorSource(c(pos.terms,neg.terms)))all.tdm<-TermDocumentMatrix(all.corpus,control=list(weighting=weightTfIdf,removePunctuation=TRUE,stopwords=stopwords(kind="en")))all.tdm.m<-as.matrix(all.tdm)
colnames(all.tdm.m)<-c("positive","negative")
comparison.cloud(all.tdm.m,max.words = 300,colors = c("darkgreen","darkred"))

在Airbnb的好评中,有很多人的名字,比如Alex, Becky和Erik等等。可以推测,要想拥有一个积极的Airbnb体验,主人和客人之间必须有直接的互动。相比之下,自动化的帖子和肮脏的房间会导致负面的评论。

4.3 表情符号

4.3.1 基于R的表情符号

print('\U2764')
print('\U263B')patterns<-c('\U2764','\U263B')
replacements<-c('love','happy')
mgsub(patterns,replacements,'I \U2764 you')

4.3.2 基于标点的表情符号

data("emoticon")
emoticon.df<-emoticon
#添加自定义表情
meaning<-c('troubled face','crying')
emoticon<-c('(>_<)','Q_Q')
new.emotes<-data.frame(meaning,emoticon)
emoticon.df<-rbind(emoticon.df,new.emotes)
tail(emoticon.df)text<-'Text mining is so much fun :-D. Other tm books make me Q_Q because
they have academic examples!'mgsub(emoticon.df[,2],emoticon.df[,1],text)

虽然替换后的句子的语法并不准确,但标点符号的情感意义用词语代替了,避免有价值的信息丢失。因此,在删除标点符号之前执行这种替换非常重要。

4.3.4 Emoji

tweet='Manually dealing with emoji is hard, makes me  . Plus doing it one by one makes me  . Luckily qdap’s mgsub can help  '
print(tweet)#手动创建emoji语义表
emoji.replacements<-c('Speak no evil monkey','Tears of joy face','Unamused face','Smiley with heart eyes','Smiley with smiling eyes','OK hand','Face blowing a kiss','Thumbs down','Loudly crying face','Grinning Face with Smiling Eyes','Flushed Face','Thumbs up','Clapping hands or person raising both hands in celebration','Person with folded hands or praying','Pile of "Poo"','Face with stuck out tongue and winking eye','Smiling face with open mouth and smiling eyes','Sleeping face','Hushed face','Neutral Face')
emoji.patterns<-c('\U1F64A','\U1F602','\U1F612','\U1F60D','\U1F60A','\U1F44C','\U1F618','\U1F44E','\U1F62D','\U1F601','\U1F633','\U1F44D','\U1F64C','\U1F64F','\U1F4A9','\U1F61C','\U1F604','\U1F634','\U162F','\U1F610')recode.tweet<-mgsub(emoji.patterns,emoji.replacements,tweet)recode.tweetrecode.airbnb<-mgsub(emoji.patterns,emoji.replacements,bos.airbnb$comments)

4.4 Rstem和sentiment 包进行情感分析

Index of /src/contrib/Archive/Rstem

https://cran.r-project.org/src/contrib/Archive/sentiment/

R4.0.0对应的Rtools安装及环境变量配置!

https://zhuanlan.zhihu.com/p/44914286?utm_source=wechat_session

sentiment包中的emotions数据集最后6行

library(Rstem)
library(sentiment)
setwd("E:/Rdata/text_mining-master/")
emotions<-read.csv("emotions.csv")
tail(emotions)
#贝叶斯进行情感分类
emotions.df<-classify_emotion(bos.airbnb$comments[-c(127,181,287,309,541,568,610,652,765,876)])emotions.df<-as.data.frame(emotions.df)
head(emotions.df)
emotions.df<-as.data.frame(emotions.df)
head(emotions.df)ggplot(emotions.df,aes(x=BEST_FIT))+geom_bar(aes(y=..count..,fill=BEST_FIT))+theme_gdocs()+theme(legend.position = "none")+labs(x="emotion categories",y="Bos Airbnb Reviews")

4.5 tidytext进行情感分析

#Bing词典 仅用于区分正负面词汇 6788

#AFINN词典 情感评分 2476

#NRC词典 细分情感 13901

library(tidytext)
library(textdata)
afinn<-get_sentiments(lexicon = "afinn")
nrc<-get_sentiments(lexicon = "nrc")
bing<-get_sentiments(lexicon = "bing")

AFINN Bing nrc字典的对比

library(dplyr)
library(tm)
library(tidyr)
library(ggplot2)
library(ggthemes)
#绿野仙踪文本语料
setwd("E:/Rdata/text_mining-master/")
oz<-readLines("Wizard_Of_Oz.txt")
oz.corp<-VCorpus(VectorSource(oz))
oz.corp<-clean.corpus(oz.corp)
oz.dtm<-DocumentTermMatrix(oz.corp)
oz.tidy<-tidy(oz.dtm)
oz.tidy[6810:6815,]
colnames(oz.tidy)<-c("line_number","word","count")
oz.tidy$line_number<-as.numeric(oz.tidy$line_number)#将绿野仙踪词表连接nrc的joy词表
joy.words<-inner_join(oz.tidy,nrc[nrc$sentiment=='joy',1])
joy.words<-count(joy.words,word)
head(joy.words)

oz.sentiment<-inner_join(oz.tidy,bing)
oz.sentiment<-count(oz.sentiment,sentiment,index=line_number)
#转化为宽表
oz.sentiment<-spread(oz.sentiment,sentiment,n,fill=0)
oz.sentimentoz.sentiment$polarity<-oz.sentiment$positive-oz.sentiment$negative
oz.sentiment$pos<-ifelse(oz.sentiment$polarity>=0,"pos","neg")ggplot(oz.sentiment,aes(x=index,y=polarity,fill=pos))+geom_bar(stat="identity",position = "identity",width=1)+theme_gdocs()

ggplot(oz.sentiment,aes(x=index,y=polarity))+stat_smooth()+theme_gdocs()

可以看出绿野仙踪的行文基调

绿野仙踪:主人公桃乐茜(Dorothy)卷入了一场风暴,被带到了一个充满女巫和生物的奇幻国度。为了回家,她开始了一段旅程,沿途结识了一些朋友,并向一位强大的巫师寻求帮助。平滑的极性线说明了她的旅程。

作者用相当中性的语言吸引读者到这个故事中。大约在2700行,语言变得很消极,然后不断上升到积极的故事结尾。没有读过这本书,也可以推断出这个故事有一个happy ending。

文本情感分析实例(R语言)相关推荐

  1. python的中文文本挖掘库snownlp进行购物评论文本情感分析实例

    昨晚上发现了snownlp这个库,很开心.先说说我开心的原因.我本科毕业设计做的是文本挖掘,用R语言做的,发现R语言对文本处理特别不友好,没有很多强大的库,特别是针对中文文本的,加上那时候还没有学机器 ...

  2. 基于SnowNLP的购物评论文本情感分析及准确率验证

    因论文涉及到SnowNLP情感分析的内容,于是对该内容进行了学习,但发现网上的资源发布更新不及时,大多数文章均发布于18年及以前.由于python版本的迭代,使得以往的资源代码有所出入,因此我对于Sn ...

  3. R语言对推特twitter数据进行文本情感分析

    原文链接:http://tecdat.cn/?p=4012 我们以R语言抓取的推特数据为例,对数据进行文本挖掘,进一步进行情感分析,从而得到很多有趣的信息(点击文末"阅读原文"获取 ...

  4. 结合语言知识和深度学习的中文文本情感分析方法

    结合语言知识和深度学习的中文文本情感分析方法 徐康庭, 宋威 北方工业大学信息学院 摘要:在目前的中文文本情感分析研究中,基于语义规则和情感词典的方法通常需要人工设置情感阈值:而基于深度学习的方法由于 ...

  5. 合工大Python语言与系统设计大作业:微博评论文本情感分析

    大作业:爬取微博评论文本并且分析文本的情感极性:pos or neg 外挂图片失败,请自行发挥想象!!! 文章目录 大作业:爬取微博评论文本并且分析文本的情感极性:pos or neg 设计背景 系统 ...

  6. python英文文本情感分析_sentimentpy模块进行中文文本情感分类

    sentimentpy是我根据R语言的一个文本情感分析包sentiment进行开发的, 开发的初衷有: R的sentiment已经被弃坑, 没人维护 Python比R更擅长文本处理 sentiment ...

  7. 基于LSTM三分类的文本情感分析,采用LSTM模型,训练一个能够识别文本postive, neutral, negative三种

    基于LSTM三分类的文本情感分析,采用LSTM模型,训练一个能够识别文本postive, neutral, negative三种 ,含数据集可直接运行 完整代码下载地址:基于LSTM三分类的文本情感分 ...

  8. 基于Transformer的文本情感分析编程实践(Encoder编码器-Decoder解码器框架 + Attention注意力机制 + Positional Encoding位置编码)

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) Encoder编码器-Decoder解码器框架 + Atten ...

  9. 基于SnowNLP的商品评论文本情感分析

           摘要:情感文本电商情感标注分析研究是当前电商数据情感挖掘学术研究的重要热点,具有极高的国际应用价值.对当前电商手机在线商品评论词典进行情感文本电商情感标注分析与词典数据情感挖掘研究具有很 ...

最新文章

  1. 解决在SQL Server 2000的存储过程不能调试
  2. InnoDB和MyISAM有哪些不同
  3. mysql存储word文档_使用MySQL存储和检索word文档
  4. 《鸿蒙理论知识04》HarmonyOS概述之系统定义
  5. java 多线程的同步问题_java多线程解决同步问题的几种方式,原理和代码
  6. 最全面超大规模数据集下载链接汇总(转)
  7. Markdown编辑器常用功能以及快捷键介绍
  8. linux screen vim 颜色不一样,tmux中的Vim显示错误的颜色
  9. 158.用 Read4 读取 N 个字符read characters from file multiple calls
  10. 减小编译bin文件大小_两个奇技淫巧,将 Docker 镜像体积减小 99%
  11. 《Python核心编程》第二版第八章练习题答案 第三部分
  12. Web/前端性能优化
  13. 深入linux网络编程(四):使用asio搭建商用服务器
  14. BZOJ 3654: [湖南集训]图样图森破 SA
  15. dell服务器重装iso系统,戴尔R620安装windows2012R2过程和方法
  16. 百度网盘大文件浏览器直接下载-Motrix
  17. 计算机分区容量计算公式,100g等于多少mb?电脑分区100g是多少mb?电脑100g内存等于多少mb?...
  18. Adobe reader xi打开几秒后闪退问题
  19. 基于AdaBoost算法的情感分析研究
  20. C# WPF时钟表盘 及设置闹钟

热门文章

  1. 使用druid-spring-boot-starter时设置监控界面登录信息的方法
  2. 2020煤矿安全监测监控考试题及煤矿安全监测监控复审模拟考试
  3. 复数——概念和代数运算
  4. bootstrap的引入和使用
  5. 【ZJOJ 5454】【NOIP2017提高A组冲刺11.5】仔细的检查
  6. 单片机学习笔记——微机基础知识
  7. 求求你们,这次不要放过东北
  8. PS图层混合模式MATLAB实现
  9. Mybatis-Plus和Mybatis的区别
  10. 浙江大学软件学院2020年保研上机模拟练习