利用R语言画出词云的一些实验
近日楼主偶然在一本书上介绍了文本挖掘的内容,出于好奇心也想尝试一下,所以找了很多资料,这其中学到很多,写日记最大的好处就是整理自己,整理自己的思路,整理自己的知识。在进行文本挖掘的时候特别是中文文本挖掘时要利用rJava这个包,安装的时候也出现很多问题,解决问题的思路可以参考这篇博文
下面的程序主要参考这篇博文,十分感谢这位博主的分享,真的学到了很多东西,不过也遇到很多问题,一个人学习果然十分痛苦,很多不了的地方要不断的查资料和调试。这次文本挖掘是胡锦涛在十八大的重要讲话,个人词库可以自己建立,停用词等都上传到网盘
Sys.setenv(JAVA_HOME='C:/Program Files/Java/jre7')
library(rJava)
install.packages("Rwordseg", repos = "http://R-Forge.R-project.org")
library(Rwordseg) #载入分词包
library(tm) #载入文本挖掘包
#第一部分:分词
#把要分析的文件,存为文本文件(txt后缀),放到某个目录
#1、装载自定义词库(这里的自定义词库,是根据分析文件中的某些特殊用词,自己编写的一个词库文件,其实也是一个文本文件,每行一个词。为什么要装自定义词库勒,是为了准确进行分词。某些单词如果不设置为自定义词,那么分词的时候可能会分解成其他的词汇。比如"中国电信",如果不设置为自定义词,那么就会被分解为"中国 电信";如果设置为自定义词,那么就会识别为一个词。
installDict(file.choose(),"mydict") #装载
listDict() #查看词典
loadDict(dictpath = getOption("dic.dir"))
#2、分词
segmentCN(file.choose(),returnType="tm") #这种模式分词后,会在分词文件的同一个目录生成一个"源文件名+.segment"的文本文件,就是分词的结果。Rwordseg的特点是分词很快。
#必须要注意,用Rwordseg分词后的文本文件,其编码格式是"UTF-8无BOM编码格式",这种编码用TM包读入后,全是乱码。解决办法是用windows自带的记事本打开,然后另存,另存的时候选择编码格式为"ANSI"
##返回值选取tm是为了以后用corpus方便
#第二部分:建立语料库
#这部分是读入分词后的文件,然后用TM包进行整理,清洗,变换成用于分析的"语料库"。
#1、读入分词后的文本
mydoc<-readLines(file.choose())
#2、建立语料库(这里读取文本到变量,根据文本变量来建立语料库)
mydoc.vec<-VectorSource(mydoc)
mydoc.corpus<-Corpus(mydoc.vec)
#3、删除停用词(就是删除一些介词、叹词之类的词语,这些词语本身没多大分析意义,但出现的频率却很高,比如"的、地、得、啊、嗯、呢、了、还、于是、那么、然后"等等。前提是必须要有一个停用词库,网上搜索即可下载,也是一个txt的文本文件,每行一个词。网上有两种版本,一种是500多个词的,一种是1000多个词的)
data_stw=read.table(file=file.choose(),colClasses="character") #读取停用词,挨个转换到一个列表中
stopwords_CN=c(NULL)
for(i in 1:dim(data_stw)[1]){
stopwords_CN=c(stopwords_CN,data_stw[i,1])
}
mydoc.corpus<-tm_map(mydoc.corpus,removeWords,stopwords_CN) #删除停用词
#4、进一步清洗数据
mydoc.corpus<-tm_map(mydoc.corpus,removeNumbers) #删除数字
mydoc.corpus<-tm_map(mydoc.corpus,stripWhitespace) #删除空白
#第三部分:进行内容分析
#到这里要分析的数据已经准备好了,可以进行各种分析了,下面以聚类分析为例。
#1、建立TDM矩阵(TDM就是"词语×文档"的矩阵)
control=list(removePunctuation=T,minDocFreq=5,wordLengths = c(1, Inf),weighting = weightTfIdf) #设置一些建立矩阵的参数,用变量control来存储参数,控制如何抽取文档
#removePunctuation表示去除标点
#minDocFreq=5表示只有在文档中至少出现5次的词才会出现在TDM的行中
#tm包默认TDM中只保留至少3个字的词(对英文来说比较合适,中文就不适用了吧……),wordLengths = c(1, Inf)表示字的长度至少从1开始。
#默认的加权方式是TF,即词频,这里采用Tf-Idf,该方法用于评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度:
mydoc.tdm=TermDocumentMatrix(mydoc.corpus,control) #建立矩阵
# 在一份给定的文件里,词频 (term frequency, TF) 指的是某一个给定的词语在该文件中出现的次数。这个数字通常会被归一化,以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词频,而不管该词语重要与否。)
# 逆向文件频率 (inverse document frequency, IDF) 是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到。
# 某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于保留文档中较为特别的词语,过滤常用词。
library(wordcloud)
m<-as.matrix(mydoc.tdm)
wordfred<-sort(rowSums(m),decreasing=T)
set.seed(375)
op = par(bg = "lightgrey") #背景为亮黄色
wordcloud(words=names(wordfred),freq=wordfred, min.freq=2,random.order=F,col = rainbow(length(wordfred)))
par(op) #为画框添加背景。
遇到的问题:
1、安装rjava的时候老是出现问题,光是处理这个问题就花了大半天,结果又是改环境变量,又是更新版本,终于在一片博文的提示下修改好了
2、上面的自定义词库一直不太了解,好像根本没有用到,因为我定义词“中国特色社会主义”,系统依旧是把他分开了
3、博文中说可以删除停用词,但是‘把’、‘’是‘,’的‘等词依然存在,只不过是和其他词是在一起的。
4、如果不设置变量种子,多次运行wordcloud()函数得到的结果是不一样的。
5、或许是中文的原因,楼主在尝试利用英文文本挖掘时就很顺利,看来还是应该多多努力啊。
从结果来看并没有得到我们想要的文本挖掘结果,希望大家能一起实验,相互交流。如果喷水我也不会怪你的。
另外、楼主在搜索的时候看到有人用Rweibo包实现网络舆情分析,这是一个十分有意义的想法,大家可以浏览这篇博文
下面的程序主要参考这篇博文,十分感谢这位博主的分享,真的学到了很多东西,不过也遇到很多问题,一个人学习果然十分痛苦,很多不了的地方要不断的查资料和调试。这次文本挖掘是胡锦涛在十八大的重要讲话,个人词库可以自己建立,停用词等都上传到网盘
Sys.setenv(JAVA_HOME='C:/Program Files/Java/jre7')
library(rJava)
install.packages("Rwordseg", repos = "http://R-Forge.R-project.org")
library(Rwordseg) #载入分词包
library(tm) #载入文本挖掘包
#第一部分:分词
#把要分析的文件,存为文本文件(txt后缀),放到某个目录
#1、装载自定义词库(这里的自定义词库,是根据分析文件中的某些特殊用词,自己编写的一个词库文件,其实也是一个文本文件,每行一个词。为什么要装自定义词库勒,是为了准确进行分词。某些单词如果不设置为自定义词,那么分词的时候可能会分解成其他的词汇。比如"中国电信",如果不设置为自定义词,那么就会被分解为"中国 电信";如果设置为自定义词,那么就会识别为一个词。
installDict(file.choose(),"mydict") #装载
listDict() #查看词典
loadDict(dictpath = getOption("dic.dir"))
#2、分词
segmentCN(file.choose(),returnType="tm") #这种模式分词后,会在分词文件的同一个目录生成一个"源文件名+.segment"的文本文件,就是分词的结果。Rwordseg的特点是分词很快。
#必须要注意,用Rwordseg分词后的文本文件,其编码格式是"UTF-8无BOM编码格式",这种编码用TM包读入后,全是乱码。解决办法是用windows自带的记事本打开,然后另存,另存的时候选择编码格式为"ANSI"
##返回值选取tm是为了以后用corpus方便
#第二部分:建立语料库
#这部分是读入分词后的文件,然后用TM包进行整理,清洗,变换成用于分析的"语料库"。
#1、读入分词后的文本
mydoc<-readLines(file.choose())
#2、建立语料库(这里读取文本到变量,根据文本变量来建立语料库)
mydoc.vec<-VectorSource(mydoc)
mydoc.corpus<-Corpus(mydoc.vec)
#3、删除停用词(就是删除一些介词、叹词之类的词语,这些词语本身没多大分析意义,但出现的频率却很高,比如"的、地、得、啊、嗯、呢、了、还、于是、那么、然后"等等。前提是必须要有一个停用词库,网上搜索即可下载,也是一个txt的文本文件,每行一个词。网上有两种版本,一种是500多个词的,一种是1000多个词的)
data_stw=read.table(file=file.choose(),colClasses="character") #读取停用词,挨个转换到一个列表中
stopwords_CN=c(NULL)
for(i in 1:dim(data_stw)[1]){
stopwords_CN=c(stopwords_CN,data_stw[i,1])
}
mydoc.corpus<-tm_map(mydoc.corpus,removeWords,stopwords_CN) #删除停用词
#4、进一步清洗数据
mydoc.corpus<-tm_map(mydoc.corpus,removeNumbers) #删除数字
mydoc.corpus<-tm_map(mydoc.corpus,stripWhitespace) #删除空白
#第三部分:进行内容分析
#到这里要分析的数据已经准备好了,可以进行各种分析了,下面以聚类分析为例。
#1、建立TDM矩阵(TDM就是"词语×文档"的矩阵)
control=list(removePunctuation=T,minDocFreq=5,wordLengths = c(1, Inf),weighting = weightTfIdf) #设置一些建立矩阵的参数,用变量control来存储参数,控制如何抽取文档
#removePunctuation表示去除标点
#minDocFreq=5表示只有在文档中至少出现5次的词才会出现在TDM的行中
#tm包默认TDM中只保留至少3个字的词(对英文来说比较合适,中文就不适用了吧……),wordLengths = c(1, Inf)表示字的长度至少从1开始。
#默认的加权方式是TF,即词频,这里采用Tf-Idf,该方法用于评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度:
mydoc.tdm=TermDocumentMatrix(mydoc.corpus,control) #建立矩阵
# 在一份给定的文件里,词频 (term frequency, TF) 指的是某一个给定的词语在该文件中出现的次数。这个数字通常会被归一化,以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词频,而不管该词语重要与否。)
# 逆向文件频率 (inverse document frequency, IDF) 是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到。
# 某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于保留文档中较为特别的词语,过滤常用词。
library(wordcloud)
m<-as.matrix(mydoc.tdm)
wordfred<-sort(rowSums(m),decreasing=T)
set.seed(375)
op = par(bg = "lightgrey") #背景为亮黄色
wordcloud(words=names(wordfred),freq=wordfred, min.freq=2,random.order=F,col = rainbow(length(wordfred)))
par(op) #为画框添加背景。
![]() |
遇到的问题:
1、安装rjava的时候老是出现问题,光是处理这个问题就花了大半天,结果又是改环境变量,又是更新版本,终于在一片博文的提示下修改好了
2、上面的自定义词库一直不太了解,好像根本没有用到,因为我定义词“中国特色社会主义”,系统依旧是把他分开了
3、博文中说可以删除停用词,但是‘把’、‘’是‘,’的‘等词依然存在,只不过是和其他词是在一起的。
4、如果不设置变量种子,多次运行wordcloud()函数得到的结果是不一样的。
5、或许是中文的原因,楼主在尝试利用英文文本挖掘时就很顺利,看来还是应该多多努力啊。
从结果来看并没有得到我们想要的文本挖掘结果,希望大家能一起实验,相互交流。如果喷水我也不会怪你的。
另外、楼主在搜索的时候看到有人用Rweibo包实现网络舆情分析,这是一个十分有意义的想法,大家可以浏览这篇博文