|
各个词典对情感词的倾向定义可能矛盾,出现同一个词具有情感正向和负向两种倾向的情况,尽管这种情况更加符合现实,但是违背了基于词典的情感分析的原假设,所以要将这些词去重,我们的方法是一个词如果同时属于正向和负向,仅保留正向分类。用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)??
(编辑:武汉站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|