R语言文本挖掘综合性处理tm包详解

1.tm包介绍:tm包(建议使用版本0.7-4)是R语言为文本挖掘提供综合性处理的package,vignette()命令可以得到相关的文档说明。tm包的主要功能有:1.数据载入;2.语料库处理;3.数据预处理;4.元数据管理;5.建立“文档-词条”矩阵

2.载入数据的方式:tm包主要管理文件的数据结构称为语料库(Corpus)它表示一系列文档的集合。语料库又分为动态语料库(Volatile Corpus)和静态语料库(Permanent Corpus)。动态语料库作为R对象保存在内存中,可以使用VCorpus()或者Corpus()生成,静态语料库则作为R外部文件保存(内存只是存放文档的指针,真正的文档存储在磁盘上),可以使用PCorpus()函数生成

3.载入数据的格式要求:tm包支持多种格式的数据,用getreader()函数可以获取tm包支持的数据格式文件

4.VCorpus函数的使用

VCorpus(x,readerControl=list(reader=reader(x),language="en"))
#第一个参数x即文本数据来源(必须是source对象),对于VCorpus(),可以使用以下五种方式载入x
1.DirSource():tm包函数,从本地文件目录夹导入,输入的必须是完整路径名-字符向量,只能创建一个目录源,不能指向某个文件;system.file():查找package包中文件的全部文件目录
txt<-system.file("texts","txt",package='tm')
#输出"D:/R/R-3.3.1/library/tm/texts/txt"
docs<-Corpus(DirSource(txt,encoding = "UTF-8"))
#自定义目录
IceAndSongs<-VCorpus(DirSource(directory="D:/my_R_workfile/RPROJECT/textming/data/IceAndSongs",encoding = "UTF-8"))
2.VectorSource():输入文本构成的向量,目的是创建矢量源
docs<-c("this is a text","And we create a vector.")
VCorpus(VectorSource(docs))
3.DataframeSource():输入文本构成的data frame,每一行作为一个文档
4.URLSource(x,encoding="",mode="text"):每个URL作为一个文档
loremipsum <- system.file("texts", "loremipsum.txt", package = "tm")
ovid <- system.file("texts", "txt", "ovid_1.txt", package = "tm")
us <- URISource(sprintf("file://%s", c(loremipsum, ovid)))
5.XMLSource():个人不建议使用(xml格式的文件可以先解析出文本,然后使用VectorSource())
#对于第二个参数readerControl,即指定文件类型对应的读入方式.默认使用tm支持的(即getReaders()中罗列的)一系列函数.language即文件的语言类型.似乎不能支持中文

5.将语料库导出到本地硬盘

#每个文档生成一个文件
writeCorpus(IceAndSongs,path="D:/my_R_workfile/RPROJECT/textming/data/Corpus")

6.语料库的查看与构建

可以使用print()和summary()查看语料库的部分信息。而完整信息的提取则需要使用inspect()函数

#查看某几条信息
inspect(IceAndSongs[1:2])
#查看单个文档元数据
meta(IceAndSongs[[1]])
#查看单个文档内容
as.character(IceAndSongs[[1]])
#查看多个文档内容
lapply(IceAndSongs[1:5],as.character)

library(tm)
vignette("tm")	
getReaders() #获得tm包支持的数据文件格式
"readDOC"  "readPDF"  "readPlain"  "readRCV1"   "readRCV1asPlain"   
"readReut21578XML"  "readReut21578XMLasPlain" "readTabular"            
"readTagged"   "readXML"
#读取文本,所用文本是tm包自带的20个XML格式文本,存放在library\tm\texts\crude文件夹中.用Corpus命令读取文本并生成语料库文件
#发现文件的完整路径名
reut21578<-system.file("texts","crude",package="tm");
#DirSource创建目录源,Corpus语料库的表示与计算
reuters<-Corpus(DirSource(reut21578), readerControl = list(reader = readReut21578XML))

注:readDOC和readPDF即读取DOC和PDF文档,需要事先安装antiword\xpdf,并配置环境变量(参考我的博客
注:也可以为tm包开发一个中文reader(参考:http://www.bagualu.net/wordpress/archives/6118)

7.语料库的变换

#用tm_map对语料库文件进行预处理,将其转为纯文本并去除多余空格,转换小写,去除常用词汇\合并异形同义词汇.通过使用map的方式将转化函数应用到每一个语料上
library("SnowballC")
#纯文本
reuters<-tm_map(reuters,PlainTextDocument)
#消除数字
reuters<-tm_map(reuters,removeNumbers)
#去除标点符号
reuters<-tm_map(reuters,removePunctuation)
#消除空格
reuters<-tm_map(reuters,stripWhitespace)
#大小写转换
reuters<-tm_map(reuters,tolower)
#removeWords去除语料库停用词,可以替换成自己的停止词集对象即可,停用词必须是向量形式
reuters<-tm_map(reuters,removeWords,stopwords("english"));
#去词干化.词干化,即词干提取.指的是去除词缀得到词根的过程:得到单词最一般的写法.如以单复数等多种形式存在的词,或多种时态形式存在的同一个词,它们代表的其实是同一个意思.因此需要通过词干化将它们的形式进行统一
tm_map(reuters,stemDocument)

8.语料库的过滤

reuters<-Corpus(VectorSource(reuters))	#创建语料库
#过滤功能,文档内容中含有"冰与火之歌1.txt"的id号,idx返回TRUE\FALSE
idx<-meta(reuters,"id")=="冰与火之歌1.txt"
reuters[idx]
#也可以进行全文搜索,如含有"winter is coming"的文档
tm_filter(reuters,FUN=function(x){any(grep("winter is coming",content(x)))})
#只返回是否满足条件的布尔值
tm_index(reuters,FUN=function(x){any(grep("winter is coming",content(x)))})

9.文档词条矩阵

#词条文档矩阵,文档标签为行,词条为列.默认情况下,矩阵的元素是词的频率
dtm<-DocumentTermMatrix(reuters);

10.字典

#字典是一个字符集.它可以作为一个控制参数传入DocumentTermMatrix(),从而选择需要的词条建立文档-词条矩阵
DocumentTermMatrix(IceAndSongs,list(dictionary = c("winter","power","ice")))

11.对文档词条矩阵进行操作

#部分矩阵内容可通过inspect来观察
inspect(dtm[1:5,100:105])
#词频过滤,筛选至多出现10次的词
findFreqTerms(dtm,lowfreq=0,highfreq=10);
#词语之间的相关性计算
findAssocs(dtm,"winter",0.5)
#因为生成的矩阵是一个稀疏矩阵,再进行降维处理,之后转为标准数据框格式
#sparse为最大允许稀疏性的词,高于的将被删除
dtm2<-removeSparseTerms(dtm,sparse=0.95)
data<-as.data.frame(inspect(dtm2))
#之后就可以利用R语言中任何工具加以研究了,层次聚类
#先进行标准化处理,再生成距离矩阵,再用层次聚类
data.scale<-scale(data)
d<-dist(data.scale,method="euclidean")
fit<-hclust(d,method="ward")
#绘制聚类图
plot(fit)

12.词项-文档矩阵

生成语料库之后,需要生成词项-文档矩阵(Term Document Matrix,TDM)TDM是一个矩阵,列对应语料库中所有文档,行对应所有文档中的抽取词项,该矩阵中[i,j]位置的元素代表词项i在文档j中出现的次数.由于tm包是对英文文档统计挖掘的,所以生成TDM时会对英文文档进行分词(即使用标点和空格分词)Rwordseg包做的就是将中文语句拆分成一个个词,并用空格间隔
#创建TDM语句:
control=list(removePunctuation=T,minDocFreq=5,wordLengths= c(1,Inf),weighting = weightTfIdf)
doc.tdm=TermDocumentMatrix(doc.corpus,control)
#变量control是选项列表,控制如何抽取文档,removePunctuation表示去除标点,minDocFreq=5表示只有在文档中至少出现5次的词才会出现在TDM的行中.tm包默认TDM中只保留至少3个字的词,wordLengths = c(1, Inf)表示字的长度至少从1开始.默认的加权方式是TF即词频,这里采用Tf-Idf,该方法用于评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度

13.元数据管理

元数据分为两个层次(文档级别、语料库级别),meta()函数获取元数据,每篇文档有一些预定义的元数据(如author),同时每篇文档也可以添加自定义的元数据

data(crude)
meta(crude[[1]], "author") <- "Jiang Hang"
#修改语料库级别的元数据(语料库元数据类型共三种indexed、corpus、local)
meta(crude, tag = "url", type = "corpus") <- "http://www.bagualu.net"
meta(crude, type = "corpus")

猜你喜欢

转载自blog.csdn.net/qq_38984677/article/details/81070280