在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
R语言︱情感分析—基于监督算法R语言实现笔记。 可以与博客 R语言︱词典型情感分析文本操作技巧汇总(打标签、词典与数据匹配等)对着看。
词典型情感分析大致有以下几个步骤: 训练数据集、neg/pos情感词典、分词+数据清洗清洗(一、二、三级清洗步骤)、计算情感得分、模型评价
————————————————————————————————————————————
《数据挖掘之道》书中几点赠言:
(1)在分析过程中,难免会产生很多中间变量,它们会占用大量内存。书中提到通常会将所有的临时中间变量命名为temp,只需要保证下一个temp出现之前,临时变量不会再延用就可以了。
(2)毫无疑问,如果不追求高大上的算法的话,词典法不失为一种好方法,其实有时候我们使用了很多方法,结果发现并没有什么质变,也浪费了大量时间;
比如在优化词典的时候,我希望使用高大上的算法解决问题,自动分辨出情感词,结果浪费了大量的时间,尝试了卡方统计量、各种分类器等等,结果可想而知,最后还是使用人工的方法将词典优化了一遍,是的,是用肉眼。
————————————————————————————————————————————————
文本作为非结构化数据,在构造训练集的时候,很少会发给你完整的数据集,可能需要批量读取txt字符,读取方式见:R语言︱词典型情感分析文本操作技巧汇总(打标签、词典与数据匹配等),第一节。
`read.csv`函数读取文件时,可能报警:“EOF
within quoted string”,一般为数据中不正常的符号所致,常见的方法是将`quote =
""`设置为空,这样做虽然避免了警告,但是仍然解决不了问题,有时数据会对不上号,所以最好从符号上着手将一些特殊符号去除,还有一些文本的正则表达式的问题,可见博客: R语言︱文本(字符串)处理与正则表达式。
本文中导入的数据集是清华大学李军标注的近24000个酒店评论文本和谭松波整理的12000个来自京东、携程、当当网的跨行业评论文本。并给出了每个文本数据的评分。李军老师的数据是众多的txt文件的评论文本+用rlabelclass文件来存放文本标签,可以用read.table来调用。 其他的一些市面上的免费语料库可见博客:情感分析︱网络公开的免费文本语料训练数据集汇总
会出现的问题: (1)EOF within quoted string 解决方法:quote="";
(2)CSV格式被读入R内存中时,所有字符、变量内容都被加了双引号? 解决方案:需要调整,需要sep = "\"",来划分开。除了英文逗号可能引起`read.csv`函数读取csv文件报错以外,
————————————————————————————————————————————————————————————————————
二、正向、逆向情感词典
1、词典导入与处理
市面上关于情感词典,有多家研究机构进行了分析,并且公布了结果,比如大连理工、汉语情感词极值表、 台@@湾 大学情感NTUSD、知网Hownet情感词、中文褒贬义词典v1.0(清华大学李军)等,有些词典分为正向、逆向单词两个部分;有些放在一起,然后有单独的标签,可以cbind合并在一起。本文引用的是谭松波老师的正向、逆向情感词典。
代码解读:weight是标签,主动贴在正向、逆向词典上。然后进行正向、逆向词典的合并。
各个词典对情感词的倾向定义可能矛盾,出现同一个词具有情感正向和负向两种倾向的情况,尽管这种情况更加符合现实,但是违背了基于词典的情感分析的原假设,所以要将这些词去重,我们的方法是一个词如果同时属于正向和负向,仅保留正向分类。用duplicated语句,保留重复的第一个词语,详细可见博客: R语言︱数据去重。 图1
2、词典读入词库
另外既然整合了大量的词典,就要尽量保证分词器能够把这些情感词汇分出来,所以需要将情感词典添加到分词器的词典中去,虽然这种方法在特殊情况下并不一定凑效。 已知了词典,需要把情感词放到词库里面,以备后续的匹配、分词。在这分词选用Rwordseg包来进行分词。关于这个包如何下载,是个非常头疼的问题,参考博客:R语言·文本挖掘︱Rwordseg/rJava两包的安装(安到吐血)
关于Rwordseg包,如果已经存放了词库,应该先删除原有的词库。 listDict函数是查看词库,uninstallDict函数是删除词库,insertWords是把单词加入词库。加入的词库,应该是单词,所以需要posneg[,"term"]项。 ————————————————————————————————————————————————————————————————————
三、数据清洗+分词
1、一、二级清洗
文本挖掘中,对文本的清洗工作尤为重要,会出现比如:英文逗号、波浪线、英文单引号、英文双引号、分隔符等。一级清洗去掉一些特殊符号,二级清洗去掉一些内容较少、空缺值。详情见:R语言︱词典型情感分析文本操作技巧汇总(打标签、词典与数据匹配等),第二节。
2、分词
每次可能耗费时间较长的过程,都要使用少量数据预估一下时间,这是一个优秀的习惯
分词之后需要分出来的词语,把ID、label加上,如图2所示。参考 R语言︱词典型情感分析文本操作技巧汇总(打标签、词典与数据匹配等)第四节
3、三级清洗——去停用词
虽然算法已经足够简单,没有必要去除停用词,但是为了显示诚意,文本分析里每一个环节都不能少,这里还是认真的去除停用词,真的不是走过场哦。
最后生成了图2中的前三列,weght是下面关联情感权重的结果。
图2
————————————————————————————————————————————————————————————————————
四、情感得分
1、关联情感权重
已经获得了训练集的分词,而且也有了情感词典+情感词权重,那么如何把情感词典中的情感权重,加入到训练集的数据集中呢? 这时候需要进行词库之间的匹配,可见博客R语言︱词典型情感分析文本操作技巧汇总(打标签、词典与数据匹配等)第五节。 用plyr包中的join函数就可以匹配、并合并。
2、计算情感得分
关联了情感权重,那么每个文档的得分自然而然可以求得,以weight为例,进行分组汇总即可,用aggregate函数。
图3
得到了如图3中weight的数列,为了与原来的文本分类进行比较,需要简单知道每个文本的情感偏向,得分>0则偏向为1,得分<0,偏向为-1,这时候引入了一个辅助列,dictlabel来进行这样的操作。
3、模型评价
最后可以和原先的分类进行混淆矩阵评价。从结果查看,并不是很精确。 |
请发表评论