情感分析基于词典的分析方法.docx
- 文档编号:9295207
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:15
- 大小:143.67KB
情感分析基于词典的分析方法.docx
《情感分析基于词典的分析方法.docx》由会员分享,可在线阅读,更多相关《情感分析基于词典的分析方法.docx(15页珍藏版)》请在冰豆网上搜索。
情感分析基于词典的分析方法
情感分析:
基于词典的分析方法
情感分析:
基于词典的分析方法
好主意值得扩散,激发我们创造的动力所有的数据挖掘方法和思路基本上很久之前都已经形成了,只是现代计算机的普及让这些创新的想法拥有了看似可行的技术支撑,给了他们起死回生的机会,从历史的故纸堆里摇身一变,成了高大上的现代挖掘感念。
情感分析的历史也可以追溯到1950年,没错你真的没有看错,那时的情感分析用于研究论文评述的态度。
如今,广阔的社交媒体为情感分析提供了用武之地,文本数据源源不断地从微博、博客、微信、社交平台、新闻评论、XX知道等等交互平台抓取下来,而情感分析被广泛的应用于挖掘互联网上的主观信息。
从基础上讲,情感分析能够帮助企业掌握文本所表达的情感倾向:
正向、负向、还是中性,给予企业分析特定人群特别是消费者对某一固定话题、产品、方法持有的态度。
企业可以使用挖掘出来的情感信息寻找新的营销机会,改善营销方式,针对人群采取精准营销等等,美国总统奥观海团队就使用情感分析方法监控大众对其政策的态度和反应。
1.情感分析及其应用:
这里是老生常谈在企业内,所有的数据挖掘工作归根结底要解决业务问题,这一点认识的越深刻越能脚踏实地的解决问题,而不是制造虚假问题然后解决或者是答非所问,结果不能对问题实现有效的干预。
1.1.情感分析的用途情感分析也一样要
人士构建情感分析的词典:
正向情感词典和负向情感词典,即将某语言中用于表达情感的词汇分为两个类别,然后比对文本中正负情感词的个数之类的方法,评估文本的情感倾向,这种方法非常容易理解。
情感词也分轻重缓急,比如喜欢和爱虽然都是正向,但其程度上不一样,因此根据语言专家的分析,给予情感词不同的情感级别或权重算是对上述分析方法的改进,毫无疑问种方法包含一定的语法分析的成分,大家不要忘了谷歌翻译的早期版本就是基于语法的方式,其效果可见一斑。
1.2.2.基于监督算法的情感分析方法基于监督算法的情感分析过程首先制作一个规模庞大的训练集,由人工识别文本的正负向,然后通过机器学习或算法(SVM、随机森林、朴素贝叶斯等等)等方式训练模型,得出模型后再用来识别新文本的情感倾向,比较像垃圾邮件的分类方法,首先精挑一些垃圾邮件和正常邮件,让模型学习,然后再将模型用于垃圾邮件的分选。
1.2.3.一种准确率几达87%的新方法本书介绍一种新方法,准确率高于常见的分析方式,而且仍有提升空间。
1.2.4.情感分析一些积累知识和方向首先我们应感感谢一些前辈的积累工作,就词典方面中国知网的研究者整理出了知网情感hownet词典,更新地址:
除了情感词典以外,情感分析语料库方面也有不错的工作积累,比如清华大学李军标注的情感分析语料库等等,以及Tang先生等人另辟蹊径根据表情符号标注微博情感语料库类别的方法。
以上都是非常优秀的工作,本书将大量采用前人的研究成果,但站在巨人的肩上能不能看得更远就另是一说啦。
基于多年从事文本挖掘和自然语言分析工作的经验,在情感分析方案设计和评价时我觉得应该考虑一下几点:
1.是否需要词典
2.是否具有跨行业分析的功能
3.使用什么算法,是分类任务还是分值预测,这关系到情感分析的细腻细腻度问题
4.是否需要使用规则及其与程序速度的平衡关系
5.是否关注情感归属问题,即主体词和情感的归属关系,是整体层次还是单个文本的个体层次
6.准确率和速度以上算是情感分析的几个基本问题,本章尽量从这些方面探索实现。
2.文本分析的基本武器:
工欲善其事工欲善其事,必先利其器,R和python都是数据挖掘的利器,虽然我们选择了使用R做情感分析,但我个人认为python更具后发优势,如果你搜索自然语言处理的话,会发现很多内容和python有关,至于其他方面的比较,个人认为没有必要,只看这一点就ok了。
2.1.Rjava包配置既然选择了R语言,就需要将R语言打造一番,首先RJava包需要安装,它是R语言和Java的通信接口,允许在R中直接调用Java的对象和方法,恰恰能满足很多包的需要,比如Rwordseg。
Linux环境下只要R与Java的版本对应即可使用常规方法安装RJava,而windows环境下就比较麻烦,首先要安装java,去oracle官网下载JDK版安装包,注意,这里是jdk不是jre,是64位还是32位要和R版本相同。
然后需要安装Rtools,下载地址
完成以上工作以后需要配置环境,win7右键我的电脑——高级系统设置——环境变量,在环境变量中分别新建或添加相应的环境路径。
第一个classpath,新建classpath添加下面代码classpath.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;C:
\ProgramFiles\R\R-3.2.1\library\rJava\jri这里最后一个值有时需要指定到jri的版本是x64还是i386,如果是64,那么需要C:
\ProgramFiles\R\R-3.2.1\library\rJava\jri\x64,有时又不需要这么指定,真是一件神奇的事情。
第二个JAVA_HOME,新建,然后把下面的内容添加进去JAVA_HOMEC:
\ProgramFiles\Java\jdk1.8.0_51第三个Path,新建path,注意一下所有的软件都要区分i386或x64PathC:
\Rtools\bin;C:
\Rtools\gcc-4.6.3\bin;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;C:
\ProgramFiles\R\R-3.2.1\bin\i386;C:
\ProgramFiles\R\R-3.2.1\bin\x64;C:
\ProgramFiles\Java\jdk1.8.0_51\jre\bin\server第四个R_HOME,添加R_HOMEC:
\ProgramFiles\R\R-3.2.1以上所有路径均是你的软件安装路径,其他不需要修改。
安装rJava包if(!
suppressWarnings(require("rJava"))){
install.packages("rJava")
require("rJava")
}
.jinit()
s<-.jnew("java/lang/String","HelloWorld!
")
s
#[1]"Java-Object{HelloWorld!
}"如果s正常返回"Java-Object{HelloWorld!
}"则RJava已经成功了。
只有RJava配置成功了,Rwordseg安装才可能成功,前者是后者的依赖包。
2.2.Rwordseg包安装如果返回不正常说明你的RJava还没安装好,需要重新安装,Rwordseg是我接触最早的中文分词包,所以情有独钟,并不是因为它多么优秀,而是觉得分词是文本分析的基础工作,就其准确性而言,各种方法之间实在没有实质性的差别,因此也就没有养成换来换去的坏毛病。
其实,有一点很奇怪,大家口口声声玩大数据,但往往在某些细节问题上止步不前,比如为了分词准确性提高一个千分点,花费大量的时间、财力和精力,我请问,这些改变对数亿级的文本分析结果能有多大的影响呢。
另外,数据量巨大的分析保证我们在群体上的精确性,这也是统计的本质,而有些人在评价结果时可能纠结于极个别的个体,这本就是一种本末倒置的思维。
如果我们的自变量是由个体组成的,必然需要从群体上评价准确性,而不是纠结于黑天鹅事件。
至于防止黑天鹅事件,自然可以设计一套风险管理措施,比如可以分化赌注,多玩几次。
扯远了,继续安装Rwordseg。
安装Rwordseginstall.packages("Rwordseg",repos="http:
//R-Forge.R-project.org")#这一步要完成需要安装Rtools
library(rJava)
library(Rwordseg)
segmentCN("在此对原作者孙健表示强烈的敬意!
")如果在线安装不成功,可以下载本地安装。
下载https:
//r-forge.r-project.org/R/?
group_id=1054本地安装很简单,如果你使用Rstudio编辑器,点击tools,选install.packages就可以安装。
如果segmentCN函数分词成功就ok了,报错就自求多福吧!
2.3.jieba分词包安装虽然我比较执着于Rwordseg,并不代表各位看管执着于我的执着,推荐结巴分词包,小巧玲珑,没有那么多幺蛾子,而且R版本和python版本都有,除了词性标注等分词包必备功能以外,jiebaR还加入了一些基础的文本分析算法,比如提取关键字(TFIDF)、分析文本相似性等等,真是老少咸宜。
安装jiebaRlibrary(devtools)
if(!
suppressWarnings(require("Rcpp"))){
install.packages("Rcpp")
require("Rcpp")
}
install_github("qinwf/jiebaR")
library(jiebaR)
seg<-worker()
seg<="江州市长江大桥,参加了长江大桥的通车仪式。
"
seg<="H:
/zimeiti/窥视数据背后的逻辑:
基于R与python/bookwriting/第十二章舆情分析/rawdata/dataset_602123/ChnSentiCorp_htl_ba_2000/neg/neg.0.txt"
fenci如果使用install_github函数安装github上的包,需要调取devtools包,而该包需要Rtools,这也是提前安装Rtools的原因;另外jiebaR使用Rcpp开发,因此需要安装调取Rcpp包。
jiebaR其实是一个刀架,里面的每一把刀是一个分词引擎(是的,好几种),通过worker函数初始化引擎,建议不要更改默认设置(个人认为很多函数的默认设置必有其合理性),指定分词引擎后,只需要将文本通过符号赋值给分词引擎即可,有两种方式:
其一直接赋值一句话;其二指定文本路径,分词结果存放在相应的路径内;当然也可以像使用Rwordseg包的segmentCN函数一样使用segment函数分词,只不过后者需要指定分词引擎。
之所以多说了两句,是为了努力说服大家尽量使用jiebaR,但是下面的内容我们主要使用Rwordseg包分词,是不是很变态?
其实就分词这段不一样而已。
3.基于词典的情感分析的效率高过瞎猜么?
上面已经简单介绍了基于词典的情感分析的过程,一般经过以下几个过程:
数据整理、词典整理、情感词匹配、计算情感得分和方法评估等过程。
这种分析方法因其思路简单而遭人诟病,更有甚者说分析效果赶不上猴子瞎猜,咱不看广告,看疗效。
3.1.数据整理及词典构建这一节我们完成文本语料库和词典的整理,使用谭松波和清华大学李军等人标注的语料库进行分析,词典方面使用已经公开的词典资源,包括台湾大学、中国知网等网站公布的情感词典。
3.1.1.数据整理语料库共包含两个数据集:
清华大学李军标注的近24000个酒店评论文本和谭松波整理的12000个来自京东、携程、当当网的跨行业评论文本。
李军的语料库(review_sentiment)包括两个数据集(训练集和测试集)和两个标注表(训练标注表和测试标注表),标注表注明了文本的情感倾向,正向为1,负向为-1。
由于文本为分散的单个文本,所以需要批量读入文本文件。
获取文本路径reviewpath<-"H:
/zimeiti/窥视数据背后的逻辑:
基于R与python/bookwriting/第十二章舆情分析/rawdata/review_sentiment/train2"
#reviewpath<-"H:
/zimeiti/窥视数据背后的逻辑:
基于R与python/bookwriting/第十二章舆情分析/rawdata/review_sentiment/test2"
completepath上面第一句设定了文件存放的路径,list.files函数获取该路径下所有文件的文件名,如果full.names参数为真,则返回完整的路径,反之返回文件名称,pattern设置符合正则表达式的规则,仅提取符合要求的文件,防止读入系统文件,这里仅匹配以.txt结尾的文件。
批量读入文本read.txt<-function(x){
des<-readLines(x)
return(paste(des,collapse=""))
}
review<-lapply(completepath,read.txt)
#Therewere50ormorewarnings(usewarnings()toseethefirst50)上面刚开始构造了一个函数read.txt,目的是将一个完整路径的txt文件加载进来,并将每个段落粘贴在一起,函数是一个非常中规中矩的R函数模式:
第一句,打开文件并分行读取,然后将每一行粘贴在一起,最后返回完整的文本内容。
在R的自编函数末尾return声明返回的内容,如果不声明仅返回函数中形成的最后一个对象。
paste函数有两个指定间隔符号的参数:
sep和collapse,前者将两个对象或两个对象的元素对应粘在一起时使用,后者是融合的意思,将向量或者list的元素粘在一起时使用。
第二句使用了lapply函数,避免了每一个文本循环读取,保持了代码的整洁,提高了运行速度。
到这里,review这个list就记录了文件下的所有文本内容,它的每一个元素是一个文本的内容。
如果你忍不住想用循环处理,说明你还处于低级阶段,不到万不得已绝对不能轻易使用R语言循环。
另外,如果程序警告,这里可能是部分文件最后一行没有换行导致,不用担心。
list转数据框docname<-list.files(reviewpath,pattern="*.txt$")
reviewdf<-as.data.frame(cbind(docname,unlist(review)),
stringsAsFactors=F)
colnames(reviewdf)<-c("id","msg")
reviewdf$msg<-gsub(pattern="",replacement="",reviewdf$msg)
reviewdf$msg<-gsub("\t","",reviewdf$msg)#有时需要使用\\\t
reviewdf$msg<-gsub(",",",",reviewdf$msg)
reviewdf$msg<-gsub("~|'","",reviewdf$msg)
reviewdf$msg<-gsub("\\\"","",reviewdf$msg)
#Warningmessage:
#Inscan(file,what,nmax,sep,dec,quote,skip,nlines,na.strings,:
#EOFwithinquotedstring1行读取文件名称;2行名称和文本内容按列(cbind)捆绑在一起成为一个新的数据框;3行修改列名;4行移除文本中的所有空格,第一个参数指定正则表达式模式,第二个参数指定替换为的内容;5、6行替换所有的\t和英文逗号,因为csv各式的文档以英文逗号为分隔符,文中有英文逗号会报错,除了英文逗号可能引起read.csv函数读取csv文件报错以外,还有英文单引号(’)、英文双引号(”)、波浪号(~),都会引起读取时发生警告,带来csv文件或txt文件读取不完整的后果,如果一旦发生“EOFwithinquotedstring”就要想办法找出这类符号将其替换掉;因此,7行依次替换了波浪号(~)和英文单引号(’),它们之间用“|”符号隔开,表示或的关系;8行替换所有的英文双引号(”),因为双引号在R中有特殊含义,所以要使用三个斜杠(\\)转义。
数据算是基本处理了一下,下一步要给文本匹配上情感标注。
关联标注reviewclass<-read.table("H:
/zimeiti/窥视数据背后的逻辑:
基于R与python/bookwriting/第十二章舆情分析/rawdata/review_sentiment/train2.rlabelclass",
stringsAsFactor=F)
#reviewclass<-read.table("H:
/zimeiti/窥视数据背后的逻辑:
基于R与python/bookwriting/第十二章舆情分析/rawdata/review_sentiment/test2.rlabelclass",stringsAsFactor=F)
colnames(reviewclass)<-c("id","label")
library(plyr)
reviewdf<-join(reviewdf,reviewclass)
reviewdf<-reviewdf[!
is.na(reviewdf$label),]
train<-reviewdf
#testread.table读取训练集文本标注数据,该函数是R中读取数据的根函数,很多函数都是继承的read.table,所以看到格式陌生的文件,可以尝试使用这个函数读取,2行更改标注文档的列名称,id列和reviewdf中的id列相同,plyr包里的join函数会根据名称相同的列进行匹配关联,join默认设置下执行左连接;然后将整理好预料赋值给train备用。
这样李军标注的训练数据集就整理完成了,整理测试数据集使用相同的代码,将注释掉的代码恢复,同时将上一句注释掉即可。
dataset_602124数据集分为当当、京东、携程三个子文件夹,下面又分别有pos和neg文件夹,顾名思义,pos文件夹下全是情感正向的文本;neg下则为负向的文件,为了操作简便,分别把文本统一整理到pos和neg文件夹内,然后在进行数据处理。
获取文本路径reviewpath<-"H:
/zimeiti/窥视数据背后的逻辑:
基于R与python/bookwriting/第十二章舆情分析/rawdata/dataset_602124/pos"
#reviewpath<-"H:
/zimeiti/窥视数据背后的逻辑:
基于R与python/bookwriting/第十二章舆情分析/rawdata/dataset_602124/neg"
completepath读取dataset_602124数据集,设定文嘉路径。
批量读入文本review<-lapply(completepath,read.txt)#自编函数read.txt
docname<-list.files(reviewpath,pattern="*.txt$")
label<-rep(1,length(docname))
#label<-rep(-1,length(docname))
reviewdf<-as.data.frame(cbind(docname,unlist(review),label),
stringsAsFactors=F)
colnames(reviewdf)<-c("id","msg","label")
reviewdf$msg<-gsub(pattern="",replacement="",reviewdf$msg)
reviewdf$msg<-gsub("\t","",reviewdf$msg)#有时需要使用\\\t
reviewdf$msg<-gsub(",",",",reviewdf$msg)
reviewdf$msg<-gsub("~|'","",reviewdf$msg)
reviewdf$msg<-gsub("\\\"","",reviewdf$msg)
pos6<-reviewdf
#neg6<-reviewdf
temp<-rbind(pos6,neg6)
train<-rbind(train,temp)
write.csv(train,'H:
/zimeiti/窥视数据背后的逻辑:
基于R与python/bookwriting/第十二章舆情分析/data/train.csv',row.names=FALSE)
#write.csv(test,'H:
/zimeiti/窥视数据背后的逻辑:
基于R与python/bookwriting/第十二章舆情分析/rawdata/review_sentiment/test.csv',row.names=FALSE)1、2行不多说;3行为读入的数据添加情感倾向标签,正向数据全部标注为1,负向数据全部标注为-1(暂时注释掉了),rep函数复制产生一个和向量docname等长的向量;4、5行捆绑3列生成数据框,并重新命名3列,列顺序、名称和train数据框保持一致;6、7、8、9、10行不多说了;11、12、13行将已有的数据按行粘(rbind)在一起,生成用于训练的语料库train,测试的语料库仅仅使用李军的测试集test即可(注释代码);只需将train和test输出到专用的数据存储文件夹data,write.csv输出语料文档,输出格式为csv,参数row.names设置为非,表示不输出行编号。
这样测试集和训练集语料库都已经准备好了,并存储在data文件夹里备用。
3.1.2.词典构建尽管我们搜集了很多部情感词典(参看电子文档),经过挑选,暂时整合中国知网、台大、清华和一部未标注来源的词典等四部词典,再次感谢这些词典的作者。
首先我们需要将这些词典整合为正向情感词集pos和负向情感词集neg。
我已经将各个词典的正负文本整理到两个文件夹内:
词典整理dictpath<-"H:
/zimeiti/窥视数据背后的逻辑:
基于R与python/bookwriting/第十二章舆情分析/rawdict/posdic"
#dictpath<-"H:
/zimeiti/窥视数据背后的逻辑:
基于R与python/bookwriting/第十二章舆情分析/rawdict/negdic"
completepath<-list.files(dictpath,pattern="*.txt$",full.names=TRUE)
dict<-lapply(completepath,readLines)
dict<-unique(unlist(dict))
pos<-dict
#neg<-dict
write.csv(pos,'H:
/zimeiti/窥视数据背后的逻辑:
基于R与python/bookwriting/第十二章舆情分析/dict/pos.csv',row.names=FALSE)
#write.csv(neg,'H:
/zimeiti/窥视数据背后的逻辑:
基于R与python/bookwriting/第十二章舆情分析/dict/neg.csv',row.names=FALSE)1、2行不多说,3行lapply函数直接使用了readLines函数,将每个文件按行读取;4行将list解散(unlist)成为
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 情感 分析 基于 词典 方法