原文链接: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("\n","",res)###############library(r; 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) #############绘制词汇图####################3library("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)#每个类核心最初能够失去直观的用户的聚类特色从而进一步进行钻研。
...