基于R的文本分析01
2017-02-16 本文已影响340人
nonoBoy
第一步:载入分词包
library(Rwordseg) #载入分词包
library(tm) #载入文本挖掘包
第二步:装载需要分析的文本
installDict(file.choose(),"mydict") #装载 选择文件...
listDict() #查看词典
第三步:分词
segmentCN(file.choose(),returnType="tm")
#这种模式分词后,会在分词文件的同一个目录生成一个"源文件名+.segment"的文本文件,就是分词的结果
第四步:建立语料库
#这部分是读入分词后的文件,然后用TM包进行整理,清洗,变换成用于分析的"语料库"。
# 1、读入分词后的文本
mydoc<-readLines(file.choose())
# 2、建立语料库(这里读取文本到变量,根据文本变量来建立语料库)
mydoc.vec<-VectorSource(mydoc)
mydoc.corpus<-Corpus(mydoc.vec)
# 3、删除停用词
#读取停用词,挨个转换到一个列表中
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) #建立矩阵
# 2、降维(词太多了,不好聚类,所以需要降维,就是减少词的数量,把不重要的词剔除)
length(mydoc.tdm$dimnames$Terms) #查看原来有多少词
tdm_removed<-removeSparseTerms(mydoc.tdm, 0.9) #降维,去除了低于 99% 的稀疏条词,这里的参数可以自行调整,反复测试,直到词语数量满足你的研究需要
length(tdm_removed$dimnames$Terms) #查看降维后剩下多少词
# 3、查找高频词
findFreqTerms(mydoc.tdm,3) #列出高频词
# 4、找到与某个单词相关系数为?的单词
findAssocs(mydoc.tdm,"人力资源",0.5) #列出与"人力资源"相关系数大于等于0.5的词
#5、文本聚类
mydata <- as.data.frame(inspect(tdm_removed)) #转换分析数据为数据框结构
mydata.scale<-scale(mydata)
d<-dist(mydata.scale,method="euclidean") #计算矩阵距离
fit <- hclust(d, method="ward.D") #聚类分析
# 避免打印出框框 字体问题解决
par(family="STKaiti")
plot(fit) #用一张图展示聚类的结果
附图:
tm.png