zoukankan      html  css  js  c++  java
  • R语言代写进行网站评论文本数据挖掘聚类

    原文:http://tecdat.cn/?p=3994

       

        对于非结构化的网站中文评论信息,r的中文词频包可能是用来挖掘其潜在信息的好工具,要分析文本内容,最常见的分析方法是提取文本中的词语,并统计频率。频率能反映词语在文本中的重要性,一般越重要的词语,在文本中出现的次数就会越多。词语提取后,还可以做成词云,让词语的频率属性可视化,更加直观清晰。 

          比如对于如下的网站评论信息:

    通过一系列的文本处理和高频词汇的提取,最后结合聚类,我们可以得到如下的可视化结果。
    第一类客户:
    第二类

    第三类

    这是根据某网站成交评论制作的可视化词云,词频的统计,分词和词云的制作都是用R,最后做了聚类,将不同的用户聚成了3个类别。这个图能很直观看到,每个类别的客户的特点。不过这张图中的词语还需要进行优化,因为有些术语或词组可能被拆分成了更小的词语,没有展示出来,为了演示,我就没再花更多时间去优化词库,主要介绍分析的过程与方法。
                                                                                                        pinglun=readLines("E:\ 手机评论1.txt")
                                                                                                          write.table(pinglun,"E:\ 手机评论整理.txt")
                                                                                                          pinglun1=read.table("E:\手机评论整理.txt",sep="|")
     
     
    # == 文本预处理  
    res=pinglun1[pinglun1!=" "];  
    #剔除通用标题  
    res=gsub(pattern="[專賣店【未拆封順豐】||]+"," ",res);   
    #剔除特殊词  
    res=gsub(pattern="[我|你|的|了|是]"," ",res);       
    #清理文本里的回车!否则每个回车就会被识别成一段文本
    res=gsub("
    ","",res)
    ###############
    library(rJava);  
    library(Rwordseg);  
     
    # == 分词+频数统计  
    words=unlist(lapply(X=res, FUN=segmentCN));  
    word=lapply(X=words, FUN=strsplit, " ");  
    v=table(unlist(word));    
    # 降序排序  
    v=rev(sort(v));   
    d=data.frame(word=names(v), freq=v);   
    # 过滤掉1个字和词频小于100的记录  
    d=subset(d, nchar(as.character(d$word))>1 & d$freq>=100)  
     
    # == 输出结果  
                                                                                                           write.table(d, file="E: \worldcup_keyword.txt", row.names=FALSE)  
    #############绘制词汇图####################3
    library("wordcloud")
    mycolors <- brewer.pal(8,"Dark2")#设置一个颜色系:
    wordcloud(d[1:30,]$word,d[1:30,]$freq,random.order=FALSE,random.color=FALSE,colors=mycolors,family="myFont3")
                                                                                                            write.csv(d[1:30,], file="E:\ 30个keyword.csv", row.names=FALSE)  
     
     
     
     
     
    ############kmeans聚类#######################
    res1=res[1:10000]#筛选500个样本做测试
    words=unlist(lapply(X=res1, FUN=segmentCN));  
    word=lapply(X=words, FUN=strsplit, " ");  
    v=table(unlist(word));    
    # 降序排序  
    v=rev(sort(v));   
    d=data.frame(word=names(v), freq=v);   
    # 过滤掉1个字和词频小于100的记录  
    d=subset(d, nchar(as.character(d$word))>1 & d$freq>=100)  #获得高频词汇
     
     
    rating=matrix(0,length(res1),dim(d)[1])#生成评价矩阵
    colnames(rating)=d[,1]#给矩阵列命名
     
    for(i in 1:length(res1)){
      words=unlist(lapply(X=res1[i], FUN=segmentCN));#对每一条记录分析获得词频  
      word=lapply(X=words, FUN=strsplit, " ");  
      v=table(unlist(word));    
      # 降序排序  
      v=rev(sort(v));   
      dd=data.frame(word=names(v), freq=v); 
      index=intersect(dd[,1],colnames(rating))#找到每条记录中拥有的高频词汇
      if(length(index)==0)next;
      for(j in 1:length(index)){
        jj=which(dd[,1]==index[j])
        rating[i,colnames(rating)==index[j]]=dd[jj,2][[1]]#高频词汇的数量赋值到评价矩阵
      }  
    }
                                                                                                          write.table(rating, file="E:\ 评价矩阵.txt", row.names=FALSE)  
     
     
    kmeans(rating,5)#对评价矩阵进行k均值聚类
     
     
                                                                                                          result=read.csv("E:\ 聚类结果.csv")
    colnames(result)=d[1:30,1]
     
    ###分类别
    c1=result[result[,31]==1,]
    c2=result[result[,31]==2,]
    c3=result[result[,31]==3,]
     
    freq1=apply(c1,2,sum)[-31]
    freq2=apply(c2,2,sum)[-31]
    freq3=apply(c3,2,sum)[-31]
     
     
    library("wordcloud")
    mycolors <- brewer.pal(8,"Dark2")#设置一个颜色系:
    wordcloud(colnames(result)[-17],freq1[-17],random.order=FALSE,random.color=FALSE,colors=mycolors,family="myFont3")
     
    wordcloud(colnames(result)[-17],freq2[-17],random.order=FALSE,random.color=FALSE,colors=mycolors,family="myFont3")
     
    wordcloud(colnames(result)[-17],freq3[-17],random.order=FALSE,random.color=FALSE,colors=mycolors,family="myFont3")
     
     
     
    ######算法比较
    y=rbind(matrix(rnorm(10000,mean=2,sd=0.3),ncol=10),matrix(rnorm(10000,mean=1,sd=0.7),ncol=10))#生成两类随机数合并
    colnames(y)=c(paste("y",1:10))#变量名
     
     
    #Kmeans算法聚类
    cl=kmeans(y,2)
    pch1=rep("1",1000)#类标号
    pch2=rep("2",1000)
    plot(y,col=cl$cluster,pch=c(rep("1",1000),rep("2",1000)),main="kmeans算法聚类图")#每个类样本
    points(cl$centers,col=3,pch="*",cex=3)#每个类中心

    如果您有任何疑问,请在下面发表评论。   

  • 相关阅读:
    c++趣味之难以发现的bug
    解决html5 canvas 绘制字体、图片与图形模糊问题
    c++趣味之shared_ptr额外好处
    标准mysql(x64) Windows版安装过程
    解决Chrome与jQuery菜单兼容问题
    在Linux与Windows上获取当前堆栈信息
    TypeScript技巧集锦(陆续更新)
    c++趣味之变量名,颠覆所有教科书的VisualStudio
    Web前端:博客美化:三、右上角的Github Ribbon
    Web前端:博客美化:二、鼠标特效
  • 原文地址:https://www.cnblogs.com/tecdat/p/11214920.html
Copyright © 2011-2022 走看看