加入收藏 | 设为首页 | 会员中心 | 我要投稿 武汉站长网 (https://www.027zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2021-02-18 13:36:39 所属栏目:大数据 来源:网络整理
导读:副标题#e# 词典型情感分析大致有以下几个步骤: 训练数据集、neg/pos情感词典、分词+数据清洗清洗(一、二、三级清洗步骤)、计算情感得分、模型评价 (1)在分析过程中,难免会产生很多中间变量,它们会占用大量内存。书中提到通常会将所有的临时中间变量

各个词典对情感词的倾向定义可能矛盾,出现同一个词具有情感正向和负向两种倾向的情况,尽管这种情况更加符合现实,但是违背了基于词典的情感分析的原假设,所以要将这些词去重,我们的方法是一个词如果同时属于正向和负向,仅保留正向分类。用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)??

(编辑:武汉站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读