package:tm
Posted 天戈朱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了package:tm相关的知识,希望对你有一定的参考价值。
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://stackoverflow.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))
以上是关于package:tm的主要内容,如果未能解决你的问题,请参考以下文章