龙空技术网

R语言文本挖掘:情感极性分析+LDA主题建模 「一」

Codewar 363

前言:

此刻小伙伴们对“win10codewar”大体比较关注,看官们都需要分析一些“win10codewar”的相关知识。那么小编在网上收集了一些关于“win10codewar””的相关知识,希望看官们能喜欢,咱们一起来学习一下吧!

这一篇文章,我们接着讲情感分析,当然,情感分析不仅有积极和消极之分(详见之前文章,还有强弱之分(本文即将介绍的)。

本文涉及的是基于情感词典的情感分析,即通过情感得分正负来判断语句的情感倾向,而分数值的绝对值大小则通常用来表示情感的强弱。研究语句所表达情感的强弱就不得不谈及程度副词,程度副词本身并不具备情感值,相反,当程度副词与动词或形容词搭配时,在语句中能对形容词或是动词起修饰或限制作用,从而增强或者减弱语句所表达的预期强弱。

举个简单的例子:

例如句1中"产品不错 ,我喜欢"其中的“不错”、“喜欢”两词作为正面评价词,均以一分计算,故此语句得2分;再如句2“产品很不错,我非常喜欢”,“不错”记为一分,但因其前面有程度词“很”修饰,故而语句2的第一小片段得分为1.5分,而“喜欢”一词其前面也有程度词“非常”修饰,故而语句2的情感得分可计算为“很”1.5分*“不错”1分+“非常”1.8分*“喜欢”1分,即总得分为3.3分,也就是句2所表达的情感强度(语气)是要高于语句1的,或是说产品的喜欢程度是要高于句1的,这便是情感倾向的强弱分析,另外,本文在讨论情感倾向强弱分析的基础上,对情感分类结果运用LDA主题建模,通过主题建模找到正负面评论的潜在主题,进而挖掘用户对于产品的满意点与不满意点,从而为商家及生产商提出可行性措施,改进自身产品及服务的缺点,这也是本文的研究目的。

简要介绍下本文的行文框架:

一、数据采集与清洗

二、情感倾向极性分析

三、可视化展示

四、LDA主题建模

五、结论与建议

一、数据采集与清洗(python网络爬虫)

(一)网页分析

1、打开京东电子商务平台,搜索“热水器”相关产品(本文以美的热水器评论为例);

2、点击你要研究产品所在详情页;

3、打开谷歌浏览器“更多工具”-->“开发者工具”-->点击Network监督组件-->按住“Ctrl+R”刷新页面-->选择JS-->点击商品详情页的“商品评论”模块-->在filter筛选框中输入comments,选中"productPageComments"所在的网址-->接着分析网页接口

图1-1 商品评论接口

找到商品评论数据所在接口,观察变动规律:

具体接口如下:

变动在于page参数:

1.1 参数score:     全部评价:0 好评:3 中评:2 差评:1 追评:5 晒图:4 1.2 参数sortType:排序方式时间排序:6 推荐排序:5 1.3 参数pageSize:每页的评论数量,默认是10个; url = 例如:u1 = ';+str(i)+u2 = '&pageSize=10&isShadowSku=0&rid=0&fold=1'

图1-2 商品评论接口

(二)数据爬取

python代码实现商品评论数据爬取:本文以京东平台的美的热水器评论为研究对象。

受限于京东平台的反爬措施,每一评论模块下(好评、中评、差评)只能抓取100页数据,相当于每一模块1000条用户评论数据。基于此,本文通过网络爬虫,抓取好评1000条,差评1000条。

''----------------------[1]模块导入----------------------'''import requestsimport jsonimport pandas as pdimport time'''----------------------[2]函数封装----------------------'''#一、评论json数据抓取:def getdata(url1,url2,s):    h = {'User-Agent': '鉴于个人信息安全,此部分进行删除处理',            'Cookies':'鉴于个人信息安全,此部分进行删除处理'}    jsondata = []    for i in range(0,s,1):        r = requests.get(url1+str(i)+url2,headers = h)        time.sleep(2)        print("正在爬取第{}页".format(i))        str_json = r.text[20:-2]        js = json.loads(str_json)        con = dict(js).get('comments')        jsondata.append(con)    return jsondata#二、json数据解析与提取:def solve_data(data):    data1=[]    for s in range(0,len(data),1):        for i in data[s]:            uid=i.get('id')            content=i.get('content')            out1 = pd.DataFrame([uid,content]).T            data1.append(out1)            df1 = pd.concat(data1)    return df1'''----------------------[3]网址构造----------------------'''#好评:u1 = '填入所需商品评论的接口网址'u2 = '填入所需商品评论的接口网址'#差评:u3 = '填入所需商品评论的接口网址'u4 = '填入所需商品评论的接口网址''''----------------------数据爬取----------------------'''data1 = getdata(url1=u1,url2 = u2,s = 100)data2 = getdata(url1=u3,url2=u4, s=100)df1 = solve_data(data = data1)df2 = solve_data( data = data2)'''----------------------数据整理----------------------'''df1.columns = ['uid','comment']df2.columns = ['uid','comment']df1['content_type'] = 'pos'df2['content_type'] = 'neg'result1 = pd.concat([df1,df2],ignore_index=True)result1['uid'] = [i for i in range(1,2001,1)]   result1.to_csv("product_comments.csv",index = False,encoding = 'utf-8-sig')

数据爬取结果示例:

二、文本情感倾向极性分析(R语言文本挖掘)

(一)评论文本分词

首先对评论数据进行分词操作,基于R语言的jiebaR、jiebaRD包进行文本分词处理,笔者结合评论内容,增加了相应的停用词词典,用户自定义词典等。

基于分词结果,进行词频统计并用tableau可视化软件进行可视化,结果如下:

图1-3 高频词统计柱状图

通过高频词柱状图可知,安装是消费者经常提及的问题,提及次数高达1500词,其次是加热、师傅等,由此可见用户在购买热水器后较为关心的是热水器的安装问题,而具体用户的满意点是什么呢?我们通过R包tidytext进行分词操作,基于unnest_tokens()函数,设置n-gram分词模式进行简要探索,结果如下:

图1-4 n-gram词网

共现次数为两个词项共同出现的次数,“很+满意”共现次数达97词,“非常+满意”共现次数达84词,由此可见大多数用户对产品是持肯定态度的,而比较满意的有点有产品的安装、性能以及服务三方面。当然也有用户不满意的地方,如“不+满意”共现了17次,具体满意的点以及不满意的点,我们需要根据情感极性分类结果结合LDA主题建模探讨。

(二)数据清洗

数据采集之后进行数据清洗,主要涉及繁体字转换,错别字更改,标点符号添加(标点符号更改主要是情感分析算法实现的需要),评论数据去重等,数据清洗部分代码如下所示。

模块一:环境设置

#-------------------------------[1]环境设置:---------------------------------#rm(list = ls())         #清除当前工作目录所有对象;gc()                    #释放空间;getwd()                 #获取当前工作目录setwd("paper_data_code")   #设定当前工作目录;getwd()                                        #获取设定的工作目录,查看是否正确;

模块二:载入所需R包

#-----------------------------[2]载入所需R包:--------------------------------#library("stringr")library("readxl")library("xlsx")library("jiebaRD")library("jiebaR")library("plyr")library("dplyr")

模块三:文本清洗

文本清洗部分需根据研究商品名称、评论标签、所在平台选择性进行清洗。通过封装函数实现文本数据清洗:

#-----------------------------[3]数据清洗:函数封装--------------------------------## 1-1函数功能:清理文本数据# 1-2参数说明:# 1-3    text:文本向量dataclean<-function(text){  #[1]去除无分析价值的信息:  #此处商品评论分类标签:  text<-gsub(pattern="外形外观:","",text)  text<-gsub(pattern="加热速度:","",text)  text<-gsub(pattern="耗能情况:","",text)   text<-gsub(pattern="洗浴时间:","",text)  text<-gsub(pattern="其他特色:","",text)  #去除平台特定词汇:  text<-gsub(pattern="京东","",text)  text<-gsub(pattern="美的","",text)  text<-gsub(pattern="热水器","",text)     #[2]gsub是字符替换函数,去空格  text <- gsub(pattern = " ", replacement ="", text)     #[3]有时需要使用\\\t       text <- gsub("\n|\\\t", "", text)  text<-gsub(pattern="([0-9]{4}年)?([0-9]*月)?[0-9]{1,}日","",text)  text<-gsub(pattern="([0-9]{4}年)","",text)  text<-gsub(pattern="([0-9]{1,}月)","",text)  text<-gsub(pattern="[0-9]{1,}","",text)    #[4]清除英文字符\特殊字符:  text <- gsub("[a-zA-Z]", "", text)  text <- gsub("[\\*|\\%]", "", text)    #[5]剔除清洗后,文本内容为NA的评论数据:  text <- text[!is.na(text)]    #[6]设定将清洗后字符长度小于2的文本评论去除:  text <- text[!nchar(text) < 2]  return(text)}

(三)情感倾向极性分析

1.1词典构造:

目前的文本情感分析方法主要有两种,一是基于情感词典的情感分类方法,二是基于机器学习的情感分类方法。基于词典的情感分类方法相对简单,通过对语句中正负面情感词的匹配来计算语句得分,总分大于0即为正面评价,反之为负面评论。由于情感分类结果的好坏取决于情感词典的质量(即情感词典的情感词数量以及情感词与研究内容的匹配度)。基于此,本文的大部分时间花在了情感词典的整理与修改上,最终分类准确率达到93%。

1.1.1基础词典构建

由于本文的情感分析基于情感词典进行,故而情感词典的质量直接影响到情感分类效果的好坏,因此,本文结合研究商品特性、研究场景对整合的基础词典(基础词典由清华大学--李军褒贬义词典、台湾大学NTUSD词典、知网词典构成)进行一定量的添加,如:给力、垃圾、辣鸡等正负面情感词汇;

所构建的基础词典包括正负面情感词、正负面评价词两大部分,将三大词典内容进行合并、赋予相应的权重,得到最终的情感词典:

1.1.2否定词典构建

否定词对语句情感得分的影响较大,例如:“产品我不太喜欢”,如果仅仅考虑正负面情感词的话,语句中包含的“喜欢”为正面评价词,因此语句得分为1分,但我们知道这是一句负面评论,因为有“不”修饰着“喜欢”。为了提高情感倾向判别的准确性,需考虑否定词对评论情感得分的影响。具体否定词典如下所示(词典进行了一定删减,以适应分析需求):

1.1.3程度副词词典构建

情感分析不仅有情感倾向的好坏之分,也有情感倾向的强弱之分。而文本情感倾向强弱程度需要通过副词的修饰来体现。副词通常情况下不带有情感倾向性,在语句中对动词或形容词起修饰或限制作用,可以增强或者减弱语气。例如,“安装超给力”、“美的大品牌,非常值得”中的“超”跟“非常”就是副词,副词的存在使得语句的情感强度强于普通语句,如“安装给力”。在副词词典中,需要对表达不同情感程度的副词赋予不同的权重。这里还需注意,在进行情感分析时,需将停用词中包含的程度级别词去除,以免影响情感打分,其次需将正面情感词典中包含的程度副词去除,以免影响情感打分。本案例引入知网程度副词词典,共214个。

本文所用程度副词词典是知网的程度副词词典,文章所用词典以及代码、数据可关注后私信领取,这里仅做示例展示:

2.1算法简介:

在构造了必要的词典之后,下一步便是用R语言设计情感分析算法,首先将评论文本切分为片段,然后针对每个片段判断其情感得分,最后将各段得分汇总,得出评论的情感累积得分:

式中,P(phrase)表示句子片段的情感值,n表示片段中含有n个情感词,P(Pwordi)表示第i个情感词的权重,P(Nwordi)为第i个情感词对应的窗口期内否定词的取值;P(ADwordi)表示第i个情感词的检测窗口内副词的量级程度。

这里简要介绍下窗口期,窗口期就是围绕情感词在评论片段中的位置,通过索引情感词前、后n个位置所对应的词语,判断这一范围内是否存在副词或是否定词,存在,则该副词或是否定词用于修饰该情感词,否则不是(可以简单理解为,一句评论被切分为多个片段,假设某一片段中含有一个情感词和一个否定词,则该否定词仅仅作用于当前这个片段,而不能用于修饰其他片段的情感词)。值得注意的是,在一个片段中,如果某一否定词或是副词离情感词很远,则这个否定词或副词可能不是用于修饰该情感词。例如“不是这样的,我对安装服务还是很满意的。”显然,“不是”这个否定词并非用于修饰“满意”的。根据研究需要,本文将窗口期设置为3,即情感词的上3个和下3个分词作为范围,即在此范围内的否定词或副词才被认定为修饰这个情感词。

不急,举个例子说明下。

1、假设存在评论comment1:

"外观很大气,安装师傅很认真负责,中间因为有事,改了两次安装时间,师傅都很好很有耐心的配合了我们的时间,大热天的非常准时高效的帮我们安装上了,好评!!!"

由comment1可知,评论文本根据特定标点符号进行切割,可得到一个个小文本片段,本文情感分析算法的基本步骤就是:

1、通过特定标点符号对用户评论进行切割,得到每一句评论的若干文本片段;

如comment1被分割为:

| 片段id |               内容                   ||  1-1   | 外观很大气                           ||  1-2   | 安装师傅很认真负责                   ||  1-3   | 中间因为有事                         ||  1-4   | 改了两次安装时间                     ||  1-5   | 师傅都很好很有耐心的配合了我们的时间  ||  1-6   | 大热天的非常准时高效的帮我们安装上了  ||  1-7   | 好评                                 |

2、再对每一小文本片段如1-1,进行分词处理,再对分词结果进行情感词匹配;

对片段进行分词、情感词匹配等处理后,计算每一片段得分,最终汇总所有片段得分,得到语句总得分。

具体代码如下所示:

#------------------ 评论文本情感倾向极性分析 ----------------------## 2-1函数功能:分片段并打上标识# 2-2参数说明:# 2-3    text:文本向量splitsentence<-function(text){  #[1]将评论文本转为数据框,为每条评论打上编号:  commentdata<-data.frame(id=seq(1,length(text),1),term=text)  commentdata$term<-as.character(commentdata$term)    #[2]以标点符号作为分隔符把句子分成片段  subcon<-strsplit(text,",|\\.|!|\\?|;|~|,|。|!|\\?|;|~|…|﹏﹏|。。。。。。|\\.\\.\\.\\.\\.\\.")    #[3]计算每条评论片段数  temp<-unlist(lapply(subcon,length))    #[4]生成每条评论标号,标号数量和片段数相同  id<-rep(commentdata$id,temp)    #[5]把片段结果对象变成向量  term<-unlist(subcon)    #[6]打上分句id  groupid<-function(x){    subid<-seq(1:x)    return(subid)  }    #[7]生成片段标识  subid<-paste(id,"-",unlist(lapply(temp,groupid)),seq="")  subcondata<-data.frame(id=id,term=term,subid=subid)  subcondata$term<-as.character(subcondata$term)  subcondata$subid<-as.character(subcondata$subid)  return(subcondata)}# 3-1 函数功能:分词# 3-2 参数说明:#              useridc:用户自定义词典文件名#              stopword:停用词词典文件名#              subdf:数据框,需要分词的数据,每一行为一条文本片段segword_trn<-function(userdic,stopword,subdf){  #[1]载入分词空间  wk = worker(user=userdic,stop_word=stopword,'tag',bylines=TRUE,lines=5000000)  #本考虑将情感词作为用户词典加入分词引擎进行分词,但效果不好  #new_user_word(wk,posneg_tot$term)    #[2]分词函数  tt<-wk[subdf$term]    #[3]给每个分词标号  temp_fc<-unlist(lapply(tt,length))  id_fc<-rep(subdf[,"subid"],temp_fc)  term_fc<-unlist(tt)  segterm_fc<-data.frame(id=id_fc,term=term_fc,cx=names(unlist(tt)))  segterm_fc$id<-as.character(segterm_fc$id)  segterm_fc$term<-as.character(segterm_fc$term)  segterm_fc$cx<-as.character(segterm_fc$cx)  segterm_fc$id_tot<-as.numeric(unlist(lapply(strsplit(segterm_fc$id,'-'),function(x) x[1])))  return(segterm_fc)}#--------------------------[1-1]情感倾向强弱分析:--------------------------##-------------------[1]基础情感词典构建、程度副词、否定词、用户自定义词典:userdic<-'userdic.txt'        #用户字典stopword<-'lunwen_stop.txt'   #停止词postivedic<-"lunwen_pos_word.txt"      #正向情感词negtivedic<-"lunwen_neg_word.txt"     #负向情感词advworddic<-"lunwen_程度词.xlsx"     #程度副词字典denyworddic<-"否定词.csv"      #否定词字典#-------------------[2]导入情感词并附上权重:postive=readLines(postivedic,encoding='UTF-8')nagtive=readLines(negtivedic,encoding='UTF-8')pos<-data.frame(term=postive,weight=rep(1,length(postive)))neg<-data.frame(term=nagtive,weight=rep(-1,length(nagtive)))#词典去重:#sameword1 <- intersect(postive,nagtive)#pos1 <- data.frame(setdiff(postive,sameword1))#neg1 <- data.frame(setdiff(nagtive,sameword1))#pos1$weight<-rep(1,length(pos1))#colnames(pos1)<-c('term','weight')#neg1$weight<-rep(-1,length(neg1))#colnames(neg1)<-c('term','weight')posneg_tot<-rbind(pos,neg)#-------------------[3]导入程度副词、否定词:advword<-read.xlsx(advworddic,sheetName = "Sheet1",                   encoding = "UTF-8")denyword<-read.csv(denyworddic,header=TRUE,stringsAsFactors=FALSE)#-------------------[4]文本导入与清洗、分词:content <- read.xlsx("D:/meidi.xlsx",sheetName = "meidi",                     encoding = "UTF-8")commenttext<-content$commentcommenttext <- unique(commenttext)#数据清理commenttext<-dataclean(commenttext)#转数据集备用:comments <- as.data.frame(commenttext)comments$id <- seq(1,1993,1)#分句并转换成数据框并且表上subidsubcondata<-splitsentence(commenttext)#分词segworddata<-segword_trn(userdic,stopword,subcondata)   #-------------------[5]关联情感词、程度副词和否定词:tstterm<-join(segworddata,posneg_tot,by = 'term',match = 'first')tstterm<-join(tstterm,advword,by = 'term',match = 'first')names(tstterm)[length(names(tstterm))]<-"adv_score"    tstterm<-join(tstterm,denyword,by='term',match = "first")names(tstterm)[length(names(tstterm))]<-"deny_score"tstterm$adv_score[!complete.cases(tstterm$adv_score)]<--999tstterm$deny_score[!complete.cases(tstterm$deny_score)]<--999tstterm$id_tot<-as.numeric(gsub(" ","",tstterm$id_tot))#-------------------[6]语句情感得分计算:#------注意:#           仅计算有情感词的片段的情感值,因为副词及否定词用于修饰情感词[根据研究内容定立]# 4-1函数功能:对片段进行情感性打分# 4-2参数说明:#             idname:片段标号#             fliename:带有否定词、副词和正负情感词的文本#####################################################################word_segment <- function(idname,filename){    #[1]打行号  #抽取片段  filepart = subset(filename,id==idname)  #[2]对片段中每个分词打上id:也就是分词结果中,每个词的位置  wordfile = data.frame(    filepart    ,idx=1:nrow(filepart) )    #[3]找出正负情感词在片段中的位置  wordindex = wordfile$idx[!is.na(wordfile$weight)]    #[4]上下限表  citeration = data.frame(    wordindex    ,left  = wordindex-3    ,right = wordindex+3    ,leftidx = c(wordindex[1]-4,head(wordindex,-1))    ,rightidx = c(tail(wordindex,-1),wordindex[length(wordindex)]+4)    ,left_up=c(tail(wordindex-3,-1),wordindex[length(wordindex-3)]+3)  )    #[5]窗口期判定函数:wordindex为情感词所在位置  computevalue <- function(i,citeration,wordindex,filepart){    left = ifelse(citeration$left[wordindex==i]<0,0,citeration$left[wordindex==i])#0    right= citeration$right[wordindex==i]#6    leftidx= ifelse(citeration$leftidx[wordindex==i]<0,0,citeration$leftidx[wordindex==i])#0    rightidx= citeration$rightidx[wordindex==i]#7    left_up=citeration$left_up[wordindex==i]#6    wdidx=citeration$wordindex[wordindex==i]#3        result = cbind(      ifelse(right<rightidx             ,max((filepart$adv_score[max(left,leftidx+1):max(wdidx,left_up-1)]),na.rm=T)             ,max(filepart$adv_score[max(left,leftidx+1):wdidx],na.rm=T)      )      ,ifelse(right<rightidx              ,max(filepart$deny_score[max(left,leftidx+1):max(wdidx,left_up-1)],na.rm=T)              ,max(filepart$deny_score[max(left,leftidx+1):wdidx],na.rm=T))    )    return(result)  }    #[6]计算值:  result = data.frame(t(sapply(wordindex,computevalue,citeration,wordindex,filepart)))  names(result) = c('adv','deny')    final_result = data.frame(    id=idname     ,posneg=filepart$weight[wordindex]    ,result  )    return(final_result)}# 5-1函数功能:综合计算每条评论总得分# 5-2参数说明:#             texttb:评论文本(打上情感词、否定词和副词标签后的)#情感词综合打分valuefun<-function(texttb){  #[1]抽取正负情感词所在的片段:片段id(即仅提取含有情感词的片段)  idnotnull<-data.frame(id=unique(texttb$id[complete.cases(texttb$weight)]))  idnotnull$id<-as.character(idnotnull$id)    #[2]查找有情感值的片段所对应的整个语句:  tstterm_nnid<-join(texttb,idnotnull,type="inner")    #[3]获取含有情感值片段所在id:  #此时评论是包含情感值的评论;  #注意该片段里面必须含有情感词否则不算;  word_index<-unique(tstterm_nnid$id)    system.time(score_combine<-lapply(word_index,word_segment,tstterm_nnid))  score_combine_tb<-do.call("rbind", score_combine)   score_combine_tb$id<-as.character(score_combine_tb$id)  score_combine_tb$adv[score_combine_tb$adv==-999]<-1  score_combine_tb$deny[score_combine_tb$deny==-999]<-1  #[4]片段得分计算:  score_combine_tb$value<-score_combine_tb$posneg*score_combine_tb$adv*score_combine_tb$deny    #[5]片段得分汇总聚合:  subconvalue<-aggregate(score_combine_tb$value,by=list(score_combine_tb$id),sum)  subconvalue$idtot<-as.numeric(unlist(lapply(strsplit(subconvalue$Group.1,'-'),function(x) x[1])))    #[6]语句得分汇总聚合  commentvalue<-aggregate(subconvalue$x,by=list(subconvalue$idtot),sum)  names(commentvalue)[1]<-'id'  commentvalue$x<-round(commentvalue$x,2)  return(commentvalue)}system.time(valuetb<-valuefun(tstterm))head(valuetb)#最终结果展示;#-------------------[6]使用内连接,索引回原评论:all_result <- join(comments,valuetb,by = "id",type="inner")names(all_result)<-c("content","uid","score")pos_comments <- all_result[all_result$score>0,]neu_comments <- all_result[all_result$score==0,]neg_comments <- all_result[all_result$score<0,]#频率:各类情感类型占比;a1 <- round(1092/1647,2)a2 <- round(69/1647,2)a3 <- round(486/1647,2)a1;a2;a3summary(pos_comments$score)summary(neu_comments$score)summary(neg_comments$score)

2.2分类结果示例及可视化

2.2.1情感分类结果示例:

2.2.2情感分类结果可视化

图1-5 情感分类结果可视化

由上图可以得出,通过对热水器评论的情感倾向分析可知,大部分用户对于京东购买的美的热水器持肯定态度(占比66%)。通过R语言的summary()函数,分析得到各类评论的均值、极值如下表所示:

通过上表可知,在正面评论中,文本情感均值为8.719分,所有评论的最高分为54.6分,其次是负面评论,共487条,占比30%,在负面评论中,评论均分为-1.518,最低分为-6.0分。

接下来对分析结果与原有评论倾向绘制情感倾向分析混淆矩阵,结果如下:

通过将分析结果类型与原有评论类型进行比较,基于词典的情感倾向强弱分析准确率高达93.92%,这表明,基于词法分析的情感分析方法是可行的。

接下来对分词结果集进行整理,为下一步LDA主题建模做准备,主要代码如下:

#将正负面评论数据结果导出备用:posword <- tstterm[tstterm$id_tot %in% pos_comments$uid,]negword <- tstterm[tstterm$id_tot %in% neg_comments$uid,]pos.frep <- table(posword$term)pos.frep <- sort(pos.frep,decreasing = TRUE)pos.frep <- as.data.frame(pos.frep)pp1 <- pos.frep[nchar(as.character(pos.frep$Var1))>=2,]head(pp1,50)neg.frep <- table(negword$term)neg.frep <- sort(neg.frep,decreasing = TRUE)neg.frep <- as.data.frame(neg.frep)nn1 <- neg.frep[nchar(as.character(neg.frep$Var1))>=2,]head(nn1,50)library("sqldf")library("gsubfn")library("proto")library("RSQLite")#正负面评论结果导出:head(posword)posword$content_type <- "pos"#计算每个语句的词数:p_word_n <- as.data.frame(sqldf('select count(id) from posword group by id_tot'))posword$index_word <- unlist(sapply(p_word_n$`count(id)`,seq))posword$index_word <- posword$index_word - 1posword <- posword[,c(8,4,3,1,9)]names(posword) <- c("content_type","index_content","nature","word","index_word")head(negword)negword$content_type <- "neg"#计算每个语句的词数:n_word_n <- as.data.frame(sqldf('select count(id) from negword group by id_tot'))negword$index_word <- unlist(sapply(n_word_n$`count(id)`,seq))negword$index_word <- negword$index_word - 1negword <- negword[,c(8,4,3,1,9)]names(negword) <- c("content_type","index_content","nature","word","index_word")#数据导出:write.csv(posword,"posdata.csv",row.names = F)write.csv(negword,"negdata.csv",row.names = F)#情感分类结果及得分导出valuetb1 <- valuetb[valuetb$x != 0,]valuetb1$a_type[valuetb1$x >0] <- "pos" valuetb1$a_type[valuetb1$x <0] <- "neg" valuetb1$content_type <- ""valuetb1$content_type[valuetb1$id <= 1000] <- "pos"valuetb1$content_type[valuetb1$id > 1000] <- "neg"valuetb2 <- valuetb1[,c(1,3,4)]names(valuetb2) <- c("index_content","a_type","content_type")write.table(valuetb2,"outputfile.csv",row.names=FALSE,col.names=TRUE,sep=",")
小结

本文转载自R数据科学,原创作者建建baby,请支持原创!,由于文章长度超出限制,后续部分请关注下一篇文章。

感谢大家耐心看完,自己的文章都写的很细,代码都在原文中,希望大家都可以自己做一做,请关注后私信回复“数据链接”获取所有数据和本人收集的学习资料。如果对您有用请先收藏,再点赞转发。

也欢迎大家的意见和建议。

如果你是一个大学本科生或研究生,如果你正在因为你的统计作业、数据分析、论文、报告、考试等发愁,如果你在使用SPSS,R,Python,Mplus, Excel中遇到任何问题,都可以联系我。因为我可以给您提供最好的,最详细和耐心的数据分析服务。

如果你对Z检验,t检验,方差分析,多元方差分析,回归,卡方检验,相关,多水平模型,结构方程模型,中介调节,量表信效度等等统计技巧有任何问题,请私信我,获取最详细和耐心的指导。

If you are a student and you are worried about you statistical #Assignments, #Data #Analysis, #Thesis, #reports, #composing, #Quizzes, Exams.. And if you are facing problem in #SPSS, #R-Programming, #Excel, Mplus, then contact me. Because I could provide you the best services for your Data Analysis.

Are you confused with statistical Techniques like z-test, t-test, ANOVA, MANOVA, Regression, Logistic Regression, Chi-Square, Correlation, Association, SEM, multilevel model, mediation and moderation etc. for your Data Analysis...??

Then Contact Me. I will solve your Problem...

加油吧,打工人!

猜你喜欢:

R文本挖掘:文本聚类分析

R文本挖掘:中文文本聚类

R文本挖掘:情感分析「2」

R文本挖掘:情感分析

R文本挖掘:中文词云生成

R文本挖掘:中文词云生成,以2021新年贺词为例

R文本挖掘:社会网络分析

R文本挖掘:文本主题分析topic analysis

R文本挖掘:手把手教你做词云图,小白教程

R文本挖掘:词云图怎么做,worldcloud2初识

标签: #win10codewar #文本挖掘lda