设为首页 - 加入收藏 PHP编程网 - PHP站长网 (http://www.52php.cn)- 电商,百科,编程,业界,移动互联,5G,云计算,站长网!
热搜: 专业 applewat 娱乐 服务
当前位置: 首页 > 大数据 > 正文

文本挖掘:情感分析详细步骤(基础+源码)(2)

发布时间:2021-01-24 03:33 所属栏目:[大数据] 来源:网络整理
导读:解决方案:需要调整,需要sep = "\"",来划分开。除了英文逗号可能引起`read.csv`函数读取csv文件报错以外, #还有英文单引号(')、英文双引号(")、波浪号(~),都会引起读取时发生警告,带来csv文件或txt文件

解决方案:需要调整,需要sep = "\"",来划分开。除了英文逗号可能引起`read.csv`函数读取csv文件报错以外,
#还有英文单引号(')、英文双引号(")、波浪号(~),都会引起读取时发生警告,带来csv文件或txt文件读取不完整的后果


二、正向、逆向情感词典


1、词典导入与处理


市面上关于情感词典,有多家研究机构进行了分析,并且公布了结果,比如大连理工、汉语情感词极值表、台湾大学情感NTUSD、知网Hownet情感词、中文褒贬义词典v1.0(清华大学李军)等,有些词典分为正向、逆向单词两个部分;有些放在一起,然后有单独的标签,可以cbind合并在一起。本文引用的是谭松波老师的正向、逆向情感词典。


  1. #1、情感正向词,词组+打“+1”-label??

  2. pos?<-?read.csv("./pos.csv",?sep?=?",",?stringsAsFactors?=?F)??

  3. weight?<-?rep(1,?length(pos[,1]))??

  4. pos?<-?cbind(pos,?weight)??

  5. ??

  6. #2、情感负向词,词组+打“-1”-label??

  7. neg?<-?read.csv("./neg.csv",?stringsAsFactors?=?F)??

  8. weight?<-?rep(-1,?length(neg[,1]))??

  9. neg?<-?cbind(neg,?weight)??

代码解读:weight是标签,主动贴在正向、逆向词典上。然后进行正向、逆向词典的合并。


  1. #3、正、负向词组合并??

  2. posneg?<-?rbind(pos,?neg)??#正负词典合并??

  3. names(posneg)?<-?c("term",?"weight")??

  4. posneg?<-?posneg[!duplicated(posneg$term),?]#`duplicated`函数的作用和`unique`函数比较相似,它返回重复项的位置编号??


各个词典对情感词的倾向定义可能矛盾,出现同一个词具有情感正向和负向两种倾向的情况,尽管这种情况更加符合现实,但是违背了基于词典的情感分析的原假设,所以要将这些词去重,我们的方法是一个词如果同时属于正向和负向,仅保留正向分类。用duplicated语句,保留重复的第一个词语,详细可见博客:?R语言︱数据去重。


文本挖掘:情感分析详细步骤(基础+源码)

图1?


2、词典读入词库


另外既然整合了大量的词典,就要尽量保证分词器能够把这些情感词汇分出来,所以需要将情感词典添加到分词器的词典中去,虽然这种方法在特殊情况下并不一定凑效。

已知了词典,需要把情感词放到词库里面,以备后续的匹配、分词。在这分词选用Rwordseg包来进行分词。


  1. dict?<-?posneg[,?"term"]??

  2. #library(Rwordseg)??

  3. #listDict()??#查看已有词库??

  4. #uninstallDict()?#删除安装的词典????

  5. insertWords(dict)??


关于Rwordseg包,如果已经存放了词库,应该先删除原有的词库。


listDict函数是查看词库,uninstallDict函数是删除词库,insertWords是把单词加入词库。加入的词库,应该是单词,所以需要posneg[,"term"]项。


三、数据清洗+分词


1、一、二级清洗


文本挖掘中,对文本的清洗工作尤为重要,会出现比如:英文逗号、波浪线、英文单引号、英文双引号、分隔符等。一级清洗去掉一些特殊符号,二级清洗去掉一些内容较少、空缺值。


  1. sentence?<-?as.vector(train.test$msg)?#文本内容转化为向量sentence??

  2. sentence?<-?gsub("[[:digit:]]*",?"",?sentence)?#清除数字[a-zA-Z]??

  3. sentence?<-?gsub("[a-zA-Z]",?sentence)???#清除英文字符??

  4. sentence?<-?gsub("\\.",?sentence)??????#清除全英文的dot符号??

  5. train.test?<-?train.test[!is.na(sentence),?]??????????#清除一些空值文本(文本名)??

  6. sentence?<-?sentence[!is.na(sentence)]???#清除对应sentence里面的空值(文本内容),要先执行文本名??

  7. train.test?<-?train.test[!nchar(sentence)?<?2,?]??#筛选字符数小于2的文本??

  8. sentence?<-?sentence[!nchar(sentence)?<?2]?#`nchar`函数对字符计数,英文叹号为R语言里的“非”函数??



2、分词


每次可能耗费时间较长的过程,都要使用少量数据预估一下时间,这是一个优秀的习惯



  1. system.time(x?<-?segmentCN(strwords?=?sentence))???



分词之后需要分出来的词语,把ID、label加上,如图2所示。参考?R语言︱词典型情感分析文本操作技巧汇总(打标签、词典与数据匹配等)第四节



  1. temp?<-?lapply(x,?length)???????????????????????#每一个元素的长度,即文本分出多少个词??

  2. temp?<-?unlist(temp)????????????????????????????#lapply返回的是一个list,所以3行unlist??

  3. ??

  4. id?<-?rep(train.test[,?"id"],?temp)?????????????#将每一个对应的id复制相应的次数,就可以和词汇对应了??

  5. ??

  6. label?<-?rep(train.test[,?"label"],?temp)???????#id对应的情感倾向标签复制相同的次数??

  7. term?<-?unlist(x)???????????????????????????????#6行将list解散为向量??

  8. ??

  9. testterm?<-?as.data.frame(cbind(id,?term,?label),?stringsAsFactors?=?F)?#生成一个单词-文档-数据框??


3、三级清洗——去停用词


虽然算法已经足够简单,没有必要去除停用词,但是为了显示诚意,文本分析里每一个环节都不能少,这里还是认真的去除停用词,真的不是走过场哦。


  1. stopword?<-?read.csv("./stopword.csv",?stringsAsFactors?=?F)??

  2. stopword?<-?stopword[!stopword$term?%in%?posneg$term,]#函数`%in%`在posneg$term中查找stopword的元素,如果查到了就返回真值,没查到就返回假??

  3. testterm?<-?testterm[!testterm$term?%in%?stopword,]#去除停用词??


最后生成了图2中的前三列,weght是下面关联情感权重的结果。


文本挖掘:情感分析详细步骤(基础+源码)

图2


四、情感得分


1、关联情感权重

已经获得了训练集的分词,而且也有了情感词典+情感词权重,那么如何把情感词典中的情感权重,加入到训练集的数据集中呢?

这时候需要进行词库之间的匹配,用plyr包中的join函数就可以匹配、并合并。


  1. library(plyr)??

  2. testterm?<-?join(testterm,?posneg)??

  3. testterm?<-?testterm[!is.na(testterm$weight),?]??

  4. head(testterm)??



2、计算情感得分

关联了情感权重,那么每个文档的得分自然而然可以求得,以weight为例,进行分组汇总即可,用aggregate函数。


  1. #2、计算情感指数??

  2. dictresult?<-?aggregate(weight?~?id,?data?=?testterm,?sum)??

  3. dictlabel?<-?rep(-1,?length(dictresult[,?1]))??

  4. dictlabel[dictresult$weight?>?0]?<-?1??????????#很有技巧地把情感词语正负赋值到情感得分表中??

  5. dictresult?<-?as.data.frame(cbind(dictresult,?dictlabel),?stringsAsFactors?=?F)??


文本挖掘:情感分析详细步骤(基础+源码)

图3

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

推荐文章
热点阅读