用R语言实现文本挖掘(tm)、聚类

最近因为写毕业论文,想要找找怎样能够识别不相干方法评论,结果看到了R语言中使用K-mean聚类,可以查看不在聚类范围类的,输出异常的评论。由于K-mean聚类是针对数值型数据的,所以在运用K-mean聚类算法对文本进行主题聚类时,需要经历分词、词向量、文档-词矩阵等,用到了几个包。我原先针对这部分的文本分析主要时用Python中的结巴工具分词、提出关键词、LDA主题分类等方法。今天想要试试用R语言处理下看看


 

安装的包

1、Rwordseg   rJava

 所需要的中文分词包Rwordseg,  rjava包。

install.packages("rJava")

 install.packages("Rwordseg")   #安装时出现了以下错误

       Warning in install.packages :
           package ‘Rwordseg’ is not available (for R version 3.4.3)

参考这位帖子里面的解决方法:http://f.dataguru.cn/forum.php?mod=viewthread&tid=558124

 由于我的是64位的,按照帖子的解决方法一,按照时总时出现错误,因为下载的是Win32位的应用程序。所以我采用了方法二,自己手动下载,再解压缩到R语言安装包的目录下。

  2、tm

install.packages("tm")

在后面做文本处理生成词频矩阵DocumentTermMatrix时,出现了中文乱码的问题,在解决这个问题上花费了很长的时间。后来将tm版本换成了0.6-2版本的,手动安装。步骤如下:

  • 首先下载低版本点儿的tm二进制文件,任意放入一个路径下即可:tm_0.6-2.zip
  • 在Rstudio中,写代码直接手动安装:
    install.packages("C:/Users/35469/Documents/R/win-library/3.4/tm_0.6-2.zip",repos = NULL)

    注意引用的路径,repos=NULL 代表无依赖包

  • 引入下看看,是否成功。

    library(tm)

     


 

 分词处理

library(Rwordseg)
mydata<-read.csv(file.choose())  #选择所需要分词的文件
edit(mydata) # 查看文件
insertWords(c("微医")) #自定义词典,可以将新词加入其中,试其分词时作为单独的一个词
# 用 segmentCN(mydata) 分词时出现了错误:Error in segmentCN(mydata) : Please input character

#所以直接引入文件路径,分词成功后的文件还是保存在该目录下,我的分词名字为 data_fenci01.segment.csv
segmentCN("D:/text_fenci/data_fenci01.csv")

打开分词后的文件后,发现出现乱码,我的做法是用编辑器EmEditor打开,然后保存为“gbk2312”的格式。为了便于文件名好记,我把文件名 data_fenci01.segment.csv  改成文件名: r_data.csv

分词后的结果如下图: 

用R语言实现文本挖掘(tm)、聚类_第1张图片


 

tm文本挖掘处理 

 

library(NLP)
library(tm)

#读取分词后的文件,注意用的是readLines,因为是把每一条评论当成一个文档
mydoc<-readLines(file.choose()) 
edit(mydoc) #查看文件,看看是否有乱码的现象

#生成语料库
mydoc.vec<-VectorSource(mydoc)
mydoc.corpus<-Corpus(mydoc.vec)
inspect(mydoc.corpus) #查看语料库中的文档

#导出语料库,方法:writeCorpus(x, path = ".", filenames = NULL)
writeCorpus(mydoc.corpus, path = "D:/text_fenci/",filenames = paste(seq_along(mydoc.corpus), ".txt", sep = ""))

#引入停用词表
#读取时出现了以下错误:EOF within quoted string  所以加上了quote=""
data_stw<-read.table(file=file.choose(),colClasses="character",quote = "")
cnword<-c(NULL)
for(i in 1:dim(data_stw)[1]){
  
  cnword<-c(cnword,data_stw[i,1])
  
}
#出现以下错误:In gsub(sprintf("(*UCP)\\b(%s)\\b", paste(sort(words, decreasing = TRUE),可能是停用此表中出现了非UTF-8的元素,所以先去掉未知的编码字符
stopwords<-cnword[Encoding(cnword)!="unknown"]

mydoc.corpus<-tm_map(mydoc.corpus,removeWords,stopwords)#去掉停用词
mydoc.corpus<-tm_map(mydoc.corpus,removeNumbers)  #去掉数字
mydoc.corpus<-tm_map(mydoc.corpus,stripWhitespace) #删除空白

#建立TDM矩阵
  #removePunctuation表示去除标点

  #minDocFreq=5表示只有在文档中至少出现5次的词才会出现在TDM的行中

  #wordLengths = c(1, Inf)表示字的长度至少从1开始。

  #默认的加权方式是TF,即词频,这里采用Tf-Idf,该方法用于评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度:
control<-list(removePunctuation=T,minDocFreq=5,wordLengths = c(1, Inf),weighting = weightTfIdf)

#建立TermDocumentMatrix矩阵
mydoc.tdm<-TermDocumentMatrix(mydoc.corpus,control)

length(mydoc.tdm$dimnames$Terms) #查看原先有多少个词
#词太多了需要降维
tdm_removed<-removeSparseTerms(mydoc.tdm, 0.95) #去掉低于95%的的稀疏条数,可以根据自己的文本,自行调整
length(tdm_removed$dimnames$Terms) #再次查看还有多少个词

findFreqTerms(mydoc.tdm,3) #查看高频词
findAssocs(mydoc.tdm,"态度",0.5) #查找与“态度”相关系数大于0.5的词

#将数据转换成数据框结构
mydata <- as.data.frame(inspect(tdm_removed))

#开始聚类分析-层次聚类
mydata.scale<-scale(mydata) #数据标准化和中心和变换
d<-dist(mydata.scale,method="euclidean") #计算矩阵距离来的函数tm包
fit <- hclust(d, method="ward.D")  #层次聚类算法
plot(fit)



#kmeans聚类
k<-3
kmeansRes <- kmeans(mydata,k) #k是聚类数 
mode(kmeansRes) #kmeansRes的内容 
names(kmeansRes)
kmeansRes$cluster #聚类结果
kmeansRes$size #每个类别下有多少条数据

 

词条-文档矩阵 (部分)

      Docs
Terms     1         2         3         4         5 6        7 8         9
  不错    0 0.0000000 0.0000000 0.0000000 0.0000000 0 0.000000 0 0.0000000
  医生    0 0.0000000 0.0000000 0.0000000 0.0000000 0 0.000000 0 0.0000000
  方便    0 0.3571887 0.0000000 0.4592426 0.0000000 0 0.535783 0 0.3571887
  非常    0 0.0000000 0.0000000 0.0000000 0.0000000 0 0.000000 0 0.0000000
  挂号    0 0.2675367 0.0000000 0.3439758 0.0000000 0 0.000000 0 0.0000000
  健康    0 0.0000000 0.0000000 0.0000000 0.0000000 0 0.000000 0 0.0000000
  可以    0 0.0000000 0.0000000 0.0000000 0.0000000 0 0.000000 0 0.0000000
  软件    0 0.0000000 0.0000000 0.0000000 0.3237858 0 0.000000 0 0.0000000
  推荐    0 0.0000000 0.9348849 0.0000000 0.0000000 0 0.000000 0 0.4155044

 层次聚类后的结果图:

用R语言实现文本挖掘(tm)、聚类_第2张图片


 

修改Rstudio的字体主题背景

在使用Rstudio时,里面的字体太小了,还有背景是白色的,看着眼疼。。。上网查了下如何更改字体、背等,可以参考以下链接:https://jingyan.baidu.com/article/3aed632edf222e701080911c.html 


参考文献:

[1] http://blog.sina.com.cn/s/blog_54f07aba0102vfsw.html#cmt_59809C89-A450E2A-0-87E-8A6 蔡捕头博客里关于文本分析写的非常详细

[2] http://blog.sina.com.cn/s/blog_54f07aba0102vfsw.html#cmt_59809C89-A450E2A-0-87E-8A6  用R语言处理时出现了几个问题,在此博客上查找到解决方法

[3] https://wenku.baidu.com/view/d9a5500be518964bcf847c88.html R语言文本挖掘的文档

[4] https://jingyan.baidu.com/article/3aed632edf222e701080911c.html  中间嫌字体太小,百度了下修改主题背景、字体大小的方法


 

中间遇到的突发问题:

分词后,打开分词后的文档发现乱码问题,用笔记本更改为utf-8编码后无乱码现象,但再次用R 语言读入时,显示的还是乱码。最后修改编码为:gbk2312。

在建立TermDocumentMatrix矩阵后,发现出现乱码现象。尝试两种解决方法:一种时升级R、Rstudio版本,另一种是手动下载低版本的tm包。最终还是通过手动安装低版本的tm包解决的。

在引入停用词表时,出现EOF within quoted string,In gsub(sprintf("(*UCP)\\b(%s)\\b", paste(sort(words, decreasing = TRUE) 等问题,通过百度得以解决。

在读入分词后的csv文件时用 readlines。 因为文本中的一条评论就为一个文档,也就是一行就为一个文档。

你可能感兴趣的:(用R语言实现文本挖掘(tm)、聚类)