tm包是R语言中为文本挖掘提供综合性处理的package,进行操作前载入tm包,vignette命令可以让你得到相关的文档说明。使用默认安装的R平台是不带tm package的,在安装的过程中,它会依赖于NLP’,‘BH’ ,‘slam’包,所以最简单的方式就是采用在线安装。 在tm 中主要的管理文件的结构被称为语料库(Corpus),代表了一系列的文档集合
tm包安装
- 在安装依赖的slam包时,出现如下异常,R版本3.2.5
> install.packages("slam", type = "source")
Installing package into ‘C:/Users/zhushy/Documents/R/win-library/3.2’
(as ‘lib’ is unspecified)
Warning in install.packages :
package ‘slam’ is not available (for R version 3.2.5) - 通过如下方式解决:
- 参考:https://cran.r-project.org/web/packages/tm/index.html
- 参考:http://*.com/questions/40419015/install-packagestm-dependency-slam-is-not-available
library(devtools)
install_url("https://cran.r-project.org/src/contrib/Archive/slam/slam_0.1-37.tar.gz")
基本函数
- 基本用法参考:http://blog.163.com/zzz216@yeah/blog/static/162554684201412892742116/
- vignette("tm") //会打开一个tm.pdf的英文文件,讲述tm package的使用及相关函数
-
VectorSource函数: 可以将字符向量创建为corpus,示例如下:
> library(tm)
> library(NLP)
> doc=c("halo halo !","this is second word!")
> corpus1=Corpus(VectorSource(doc))
> corpus1
<<SimpleCorpus>>
Metadata: corpus specific: 1, document level (indexed): 0
Content: documents: 2 -
system.file(): 在指定的package中找到每个文件的地址
#找到tm包下texts/crude文件夹的位置,里面含有20个xml文档
adress=system.file("texts","crude",package="tm")
reuters=Corpus(DirSource(adress),readerControl=list(reader=readReut21578XML)) - DirSource():建立一个目录,除此之外还可以利用如下的函数导入不同形式的数据
- VectorSource:由文档构成的向量
- DataframeSource:数据框,就像 CSV 文件
-
readerControl=list(reader=,language=),ReadControl中有ReadDOC,readPDF,readPlain,readReut21578XML等不同的读入方式,可以使用getReaders()函数显示出所用的可能的方式,如下:
> getReaders()
[1] "readDOC" "readPDF" "readPlain"
[4] "readRCV1" "readRCV1asPlain" "readReut21578XML"
[7] "readReut21578XMLasPlain" "readTabular" "readTagged"
[10] "readXML" - Corpus:会将此目录下的文件当做一个个的文档
查看及写语料包
-
writeCorpus() :将生成的语料库保存成多个纯文本文件
writeCorpus(corpus1,"E:\\R\\",c("a1.txt","a2.txt"))
- 结果如下图:(说明:原字符中下图中字符,有敏感词变禁止提交,so 上面的代码换成字母类)
- 查看:inspect\print\summary
> inspect(reuters)
<<VCorpus>>
Metadata: corpus specific: 0, document level (indexed): 0
Content: documents: 20 [[1]]
<<XMLTextDocument>>
Metadata: 16
........ > print(reuters)
<<VCorpus>>
Metadata: corpus specific: 0, document level (indexed): 0
Content: documents: 20 > summary(reuters)
Length Class Mode
127 2 XMLTextDocument list
144 2 XMLTextDocument list
191 2 XMLTextDocument list
194 2 XMLTextDocument list
.......
transformation
- 主要是tm_map函数,可以使用 getTransformations()函数查看所有的字符处理方式(好象不全)
> getTransformations()
[1] "removeNumbers" "removePunctuation" "removeWords" "stemDocument" "stripWhitespace" -
示例:
#将reuters转换为纯文本,去除标签
reuters=tm_map(reuters,PlainTextDocument)
# 所有字母转换成小写
corpus_clean <- tm_map(reuters, tolower)
# 去除text中的数字
corpus_clean <- tm_map(reuters, removeNumbers)
# 去除停用词,例如and,or,until...
corpus_clean <- tm_map(reuters, removeWords, stopwords())
# 去除标点符号
corpus_clean <- tm_map(reuters, removePunctuation)
# 去除多余的空格,使单词之间只保留一个空格
corpus_clean <- tm_map(reuters, stripWhitespace)
meta
- 元数据是为了标记语料库的附加信息,最简单的使用范式就是调用meta()函数 .文档会被预先被定义一些属性,比如作者信息,但也可能是任意自定义的元数据标签。这些附加的元数据标签都是独立的附加在单个文档上。从语料库的视角上看,这些元数据标签被独立的存储在每个文档上。除了meta()函数外,DublinCore()函数提供了一套介于SimpleDublin Core元数据和tm元数据之间的映射机制,用于画的或设置文档的元数据信息
- DublinCore:按照都柏林核心的国际标准显示
- 示例:
data("crude")
meta(crude[[1]])
DublinCore(crude[[1]]) -
可以对其进行相应的修改、添加
> data("crude")
> meta(crude[[1]],tag="author")
character(0)
> meta(crude[[1]],tag="author") <- "ZZ"
> meta(crude[[1]])
author : ZZ
datetimestamp: 1987-02-26 17:00:56
.......
词条-文档关系矩阵
- 在tm 包里,根据词条、文档分别作为行、列或反之,对应有TermDocumentMatrix 和 DocumentTermMatrix 两类稀疏矩阵, 如下:
> doc=c("This is Frist Word.","That is Second Word!")
> corpus1=Corpus(VectorSource(doc))
> dtm <- DocumentTermMatrix(corpus1)
> inspect(dtm)
<<DocumentTermMatrix (documents: 2, terms: 5)>>
Non-/sparse entries: 6/4
Sparsity : 40%
Maximal term length: 6
Weighting : term frequency (tf)
Sample :
Terms
Docs frist second that this word
1 1 0 0 1 1
2 0 1 1 0 1 -
字典是一个字符集合。经常用于在文本挖掘中展现相关的词条时。使用Dictionary() 函数实现,当将字典传递到DocumentTermMatrix() 以后,生成的矩阵会根据字典提取计算,而不是全部提取
> d=c("word")
> inspect(DocumentTermMatrix(corpus1, list(dictionary = d)))
<<DocumentTermMatrix (documents: 2, terms: 1)>>
Non-/sparse entries: 2/0
Sparsity : 0%
Maximal term length: 4
Weighting : term frequency (tf)
Sample :
Terms
Docs word
1 1
2 1 实际上对于矩阵的操作R 有大量的函数(比如聚类、分类算法等)支持,但这个包还是提供了一些常用的函数支持。
- 假如需要找出发生2 次及以上的条目,可以使用findFreqTerms() 函数:
> findFreqTerms(dtm,2)
[1] "word" 找到相关性,比如对于opec,找到相关系数在0.8 以上的条目,使用findAssocs(),以上小节示例为例
- 词条-文档关系矩阵一般都是非常庞大的数据集,因此这里提供了一种删减稀疏条目的方法removeSparseTerms,比如有些条目尽在很少的文档中出现。一般来说,这样做不会对矩阵的信息继承带来显著的影响。
- 因为生成的term-document矩阵dtm是一个稀疏矩阵,再进行降维处理,之后转为标准数据框格式,以上节示例说明:
#进行降维处理
dtm2 <- removeSparseTerms(dtm, sparse=0.95)
#将term-document矩阵生成数据框
data <- as.data.frame(inspect(dtm2))
完整示例
library(tm)
library(NLP) #找到tm包下texts/crude文件夹的位置,里面含有20个xml文档
adress=system.file("texts","crude",package="tm")
reuters=Corpus(DirSource(adress),readerControl=list(reader=readReut21578XML)) #将reuters转换为纯文本,去除标签
reuters=tm_map(reuters,PlainTextDocument)
# 所有字母转换成小写
corpus_clean <- tm_map(reuters, tolower)
# 去除text中的数字
corpus_clean <- tm_map(reuters, removeNumbers)
# 去除停用词,例如and,or,until...
corpus_clean <- tm_map(reuters, removeWords, ("english"))
# 去除标点符号
corpus_clean <- tm_map(reuters, removePunctuation)
# 去除多余的空格,使单词之间只保留一个空格
corpus_clean <- tm_map(reuters, stripWhitespace)
#将文档转为稀疏矩阵,
dtm <- DocumentTermMatrix(reuters)
#找出发生5次及以上的条目
findFreqTerms(dtm, 5)
#找相关性,比如对于opec,找到相关系数在0.8 以上的条目
findAssocs(dtm, "opec", 0.8)
#要考察多个文档中特有词汇的出现频率,可以手工生成字典,并将它作为生成矩阵的参数
d <- Dictionary(c("prices", "crude", "oil")))
inspect(DocumentTermMatrix(reuters, list(dictionary = d))) #进行降维处理
dtm2 <- removeSparseTerms(dtm, sparse=0.95)
#将term-document矩阵生成数据框
data <- as.data.frame(inspect(dtm2))