解决方案:需要调整,需要sep = "\"",来划分开。除了英文逗号可能引起`read.csv`函数读取csv文件报错以外, #还有英文单引号(')、英文双引号(")、波浪号(~),都会引起读取时发生警告,带来csv文件或txt文件读取不完整的后果
二、正向、逆向情感词典
1、词典导入与处理
市面上关于情感词典,有多家研究机构进行了分析,并且公布了结果,比如大连理工、汉语情感词极值表、台湾大学情感NTUSD、知网Hownet情感词、中文褒贬义词典v1.0(清华大学李军)等,有些词典分为正向、逆向单词两个部分;有些放在一起,然后有单独的标签,可以cbind合并在一起。本文引用的是谭松波老师的正向、逆向情感词典。
#1、情感正向词,词组+打“+1”-label??
pos?<-?read.csv("./pos.csv",?sep?=?",",?stringsAsFactors?=?F)??
weight?<-?rep(1,?length(pos[,1]))??
pos?<-?cbind(pos,?weight)??
??
#2、情感负向词,词组+打“-1”-label??
neg?<-?read.csv("./neg.csv",?stringsAsFactors?=?F)??
weight?<-?rep(-1,?length(neg[,1]))??
neg?<-?cbind(neg,?weight)??
代码解读:weight是标签,主动贴在正向、逆向词典上。然后进行正向、逆向词典的合并。
#3、正、负向词组合并??
posneg?<-?rbind(pos,?neg)??#正负词典合并??
names(posneg)?<-?c("term",?"weight")??
posneg?<-?posneg[!duplicated(posneg$term),?]#`duplicated`函数的作用和`unique`函数比较相似,它返回重复项的位置编号??
各个词典对情感词的倾向定义可能矛盾,出现同一个词具有情感正向和负向两种倾向的情况,尽管这种情况更加符合现实,但是违背了基于词典的情感分析的原假设,所以要将这些词去重,我们的方法是一个词如果同时属于正向和负向,仅保留正向分类。用duplicated语句,保留重复的第一个词语,详细可见博客:?R语言︱数据去重。
图1?
2、词典读入词库
另外既然整合了大量的词典,就要尽量保证分词器能够把这些情感词汇分出来,所以需要将情感词典添加到分词器的词典中去,虽然这种方法在特殊情况下并不一定凑效。
已知了词典,需要把情感词放到词库里面,以备后续的匹配、分词。在这分词选用Rwordseg包来进行分词。
dict?<-?posneg[,?"term"]??
#library(Rwordseg)??
#listDict()??#查看已有词库??
#uninstallDict()?#删除安装的词典????
insertWords(dict)??
关于Rwordseg包,如果已经存放了词库,应该先删除原有的词库。
listDict函数是查看词库,uninstallDict函数是删除词库,insertWords是把单词加入词库。加入的词库,应该是单词,所以需要posneg[,"term"]项。
三、数据清洗+分词
1、一、二级清洗
文本挖掘中,对文本的清洗工作尤为重要,会出现比如:英文逗号、波浪线、英文单引号、英文双引号、分隔符等。一级清洗去掉一些特殊符号,二级清洗去掉一些内容较少、空缺值。
sentence?<-?as.vector(train.test$msg)?#文本内容转化为向量sentence??
sentence?<-?gsub("[[:digit:]]*",?"",?sentence)?#清除数字[a-zA-Z]??
sentence?<-?gsub("[a-zA-Z]",?sentence)???#清除英文字符??
sentence?<-?gsub("\\.",?sentence)??????#清除全英文的dot符号??
train.test?<-?train.test[!is.na(sentence),?]??????????#清除一些空值文本(文本名)??
sentence?<-?sentence[!is.na(sentence)]???#清除对应sentence里面的空值(文本内容),要先执行文本名??
train.test?<-?train.test[!nchar(sentence)?<?2,?]??#筛选字符数小于2的文本??
sentence?<-?sentence[!nchar(sentence)?<?2]?#`nchar`函数对字符计数,英文叹号为R语言里的“非”函数??
2、分词
每次可能耗费时间较长的过程,都要使用少量数据预估一下时间,这是一个优秀的习惯
system.time(x?<-?segmentCN(strwords?=?sentence))???
分词之后需要分出来的词语,把ID、label加上,如图2所示。参考?R语言︱词典型情感分析文本操作技巧汇总(打标签、词典与数据匹配等)第四节
temp?<-?lapply(x,?length)???????????????????????#每一个元素的长度,即文本分出多少个词??
temp?<-?unlist(temp)????????????????????????????#lapply返回的是一个list,所以3行unlist??
??
id?<-?rep(train.test[,?"id"],?temp)?????????????#将每一个对应的id复制相应的次数,就可以和词汇对应了??
??
label?<-?rep(train.test[,?"label"],?temp)???????#id对应的情感倾向标签复制相同的次数??
term?<-?unlist(x)???????????????????????????????#6行将list解散为向量??
??
testterm?<-?as.data.frame(cbind(id,?term,?label),?stringsAsFactors?=?F)?#生成一个单词-文档-数据框??
3、三级清洗——去停用词
虽然算法已经足够简单,没有必要去除停用词,但是为了显示诚意,文本分析里每一个环节都不能少,这里还是认真的去除停用词,真的不是走过场哦。
stopword?<-?read.csv("./stopword.csv",?stringsAsFactors?=?F)??
stopword?<-?stopword[!stopword$term?%in%?posneg$term,]#函数`%in%`在posneg$term中查找stopword的元素,如果查到了就返回真值,没查到就返回假??
testterm?<-?testterm[!testterm$term?%in%?stopword,]#去除停用词??
最后生成了图2中的前三列,weght是下面关联情感权重的结果。
图2
四、情感得分
1、关联情感权重
已经获得了训练集的分词,而且也有了情感词典+情感词权重,那么如何把情感词典中的情感权重,加入到训练集的数据集中呢?
这时候需要进行词库之间的匹配,用plyr包中的join函数就可以匹配、并合并。
library(plyr)??
testterm?<-?join(testterm,?posneg)??
testterm?<-?testterm[!is.na(testterm$weight),?]??
head(testterm)??
2、计算情感得分
关联了情感权重,那么每个文档的得分自然而然可以求得,以weight为例,进行分组汇总即可,用aggregate函数。
#2、计算情感指数??
dictresult?<-?aggregate(weight?~?id,?data?=?testterm,?sum)??
dictlabel?<-?rep(-1,?length(dictresult[,?1]))??
dictlabel[dictresult$weight?>?0]?<-?1??????????#很有技巧地把情感词语正负赋值到情感得分表中??
dictresult?<-?as.data.frame(cbind(dictresult,?dictlabel),?stringsAsFactors?=?F)??
图3
【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。
|