京公网安备 11010802034615号
经营许可证编号:京B2-20210330
R文本挖掘之tm包
tm包是R文本挖掘方面不可不知也不可不用的一个package。它提供了文本挖掘中的综合处理功能。如:数据载入,语料库处理,数据预处理,元数据管理以及建立“文档-词条”矩阵。
下面,即从tm包提供的各项功能函数的探索出发,一起开始我们的文本挖掘奇幻之旅。
首先,运行下面的几行代码,即可看到介绍tm包的小品文:Introduction to the tm Package:Text Mining in R(https://cran.r-project.org/web/packages/tm/vignettes/tm.pdf).
install.packages("tm")
library(tm)
vignette("tm")
tm包重要函数初探
数据载入及语料库创建
载入数据的格式要求
tm包支持多种格式的数据。用getreaders()函数可以获得tm包支持的数据文件格式。
library(tm)
## Loading required package: NLP
getReaders()
## [1] "readDOC" "readPDF"
## [3] "readPlain" "readRCV1"
## [5] "readRCV1asPlain" "readReut21578XML"
## [7] "readReut21578XMLasPlain" "readTabular"
## [9] "readTagged" "readXML"
载入数据的方式
tm包中主要管理文件的数据结构称为语料库(Corpus),它表示一系列文档的集合。
语料库又分为动态语料库(Volatile Corpus)和静态语料库(Permanent Corpus)。
动态语料库将作为R对象保存在内存中,可以使用VCorpus()或者Corpus()生成。
而动态语料库则作为R外部文件保存,可以使用PCorpus()函数生成。
先来看一下VCorpus()函数的使用。
VCorpus(x, readerControl = list(reader = reader(x), language = "en"))
as.VCorpus(x)
第一个参数x即文本数据来源。对于as.VCorpus()中的x,指定的是一个R对象;对于VCorpus(),可以使用以下几种方式载入x。
DirSource():从本地文件目录夹导入
VectorSource():输入文本构成的向量
DataframeSource():输入文本构成的data frame
对于第二个参数readerControl,即指定文件类型的对应的读入方式。默认使用tm支持的(即getReaders()中罗列的)一系列函数。language即文件的语言类型。似乎不能支持中文。这个问题稍后解释如何解决。
这里,使用tm包自带的一个数据集进行语料库创建的测试。
DirSource()方式:
txt<-system.file("texts","txt",package = 'tm')
(docs<-Corpus(DirSource(txt,encoding = "UTF-8")))
## <<VCorpus>>
## Metadata: corpus specific: 0, document level (indexed): 0
## Content: documents: 5
VectorSource()方式:
docs<-c("this is a text","And we create a vector.")
VCorpus(VectorSource(docs))
## <<VCorpus>>
## Metadata: corpus specific: 0, document level (indexed): 0
## Content: documents: 2
下面,导入一个数据集『冰与火之歌』全五部(没错,我就是来剧透的~~),作为后面练习的例子。
IceAndSongs<-VCorpus(DirSource(directory = "D:/my_R_workfile/RPROJECT/textming/data/IceAndSongs",encoding = "UTF-8"))
数据导出
将语料库导出至本地硬盘上,可以使用writeCorpus()函数.
writeCorpus(IceAndSongs,path = "D:/my_R_workfile/RPROJECT/textming/data/Corpus")
语料库的查看及提取
可以使用print()和summary()查看语料库的部分信息。而完整信息的提取则需要使用inspect()函数。
inspect(IceAndSongs[1:2])
## <<VCorpus>>
## Metadata: corpus specific: 0, document level (indexed): 0
## Content: documents: 2
##
## [[1]]
## <<PlainTextDocument>>
## Metadata: 7
## Content: chars: 1745859
##
## [[2]]
## <<PlainTextDocument>>
## Metadata: 7
## Content: chars: 2018112
文件太大,而没有打印出来。我们可以使用writeLines()函数进行完全打印查看。
writeLines(as.character(IceAndSongs[[1]]))
对于单个文档的提取,可以类型列表取元素子集一样使用 [[ 操作。
identical(IceAndSongs[[1]],IceAndSongs[["冰与火之歌1.txt"]])
## [1] TRUE
数据转换
创建好语料库之后,一般还需要做进一步的处理,如:消除空格(Whitespace),大小写转换,去除停止词,词干化等。
所有的这些处理都可以使用tm_map()函数,通过map的方式将转化函数应用到每一个文档语料上。
消除空格
IceAndSongs<-tm_map(IceAndSongs,stripWhitespace)
去除数字
IceAndSongs<-tm_map(IceAndSongs,removeNumbers)
去除标点符号
IceAndSongs<-tm_map(IceAndSongs,removePunctuation)
大小写转换
IceAndSongs<-tm_map(IceAndSongs,tolower)
消除停止词
tm包中自带了停止词集。
IceAndSongs<-tm_map(IceAndSongs,removeWords,stopwords("english"))
当然,也可以指定你自己设定的停止词集,将stopwords("english")替换成你自己的停止词集对象即可。
词干化
词干化,即词干提取。指的是去除词缀得到词根的过程─—得到单词最一般的写法。
如以单复数等多种形式存在的词,或多种时态形式存在的同一个词,它们代表的其实是同一个意思。因此需要通过词干化将它们的形式进行统一。
tm_map(IceAndSongs,stemDocument)
## <<VCorpus>>
## Metadata: corpus specific: 0, document level (indexed): 0
## Content: documents: 5
去除特殊字符
for(i in seq(IceAndSongs)){
IceAndSongs[[i]]<-gsub("/"," ",IceAndSongs[[i]])
IceAndSongs[[i]]<-gsub("@"," ",IceAndSongs[[i]])
IceAndSongs[[i]]<-gsub("-"," ",IceAndSongs[[i]])
}
过滤
过滤功能能够选择出符合我们需要的文档。
idx<-meta(IceAndSongs,"id") == "冰与火之歌1.txt"
IceAndSongs[idx]
也可以进行全文搜索匹配。如含有”winter is coming”的文档。
tm_filter(IceAndSongs,FUN = function(x){ any(grep("winter is coming",content(x)))})
元数据管理
元数据指的是对文档进行标签化的附加信息。可以通过meta()函数进行元数据管理。
DublinCore()函数提供了一套介于Simple Dublin Core元数据和tm元数据之间的映射机制,用于获得或设置文档的元数据信息。
DublinCore(IceAndSongs[[1]],tag = "creator") <- "R.R.Martin"
DublinCore(IceAndSongs[[1]])
meta(IceAndSongs[[1]])
以上操作示例主要是针对文档级别的元数据管理。而元数据标签其实对应了两个级别:
整个语料库级别:文档的集合
单个文档级别
而文档级别的标签,可以用于文档分类(classification)。
下面演示一下语料库级别的元数据管理。
meta(IceAndSongs,tag = "test",type = "corpus")<-"test meta"
meta(IceAndSongs,type = "corpus")
创建词条-文档矩阵
词条-文档矩阵是一个非常重要的对象,它是后续建立文本分类,文本聚类等模型的基础。
词条-文档矩阵指的是词条作为行,文档标签作为列的稀疏矩阵。当然,也可以建立“文档-词条矩阵”。对应的两个操作函数为:TermDocumentMatrix()和DocumentTermMatrix().
dtm<-DocumentTermMatrix(IceAndSongs)
inspect(dtm[1:5,100:105])
默认情况下,矩阵的元素是词的频率。而我们还有一个重要参数可以设置。可以将矩阵的元素转化为TF-IDF值。
dtm_2<-DocumentTermMatrix(IceAndSongs,
control = list(removePunctuation = TRUE,stopwords = FALSE,weighting =
function(x)weightTfIdf(x,normalize = TRUE)))
inspect(dtm[1:5,10:15])
对文档词条矩阵操作
tm包提供的文档-词条矩阵操作有:词频过滤;词语之间的相关性计算;去除稀疏词等。
findFreqTerms(dtm,10)
findAssocs(dtm,"winter",0.5)
inspect(removeSparseTerms(dtm,0.4))
字典
字典是一个字符集。它可以作为一个控制参数传入DocumentTermMatrix(),从而选择我们需要的词条建立文档-词条矩阵。
inspect(DocumentTermMatrix(IceAndSongs,
list(dictionary = c("winter","power","ice"))))
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
近日,由 CDA 数据科学研究院重磅发布的《2026 全球数智化人才指数报告》,被中国教育科学研究院官方账号正式收录, ...
2026-04-22在数字化时代,客户每一次点击、浏览、下单、咨询等行为,都在传递其潜在需求与决策倾向——这些按时间顺序串联的行为轨迹,构成 ...
2026-04-22数据是数据分析、建模与业务决策的核心基石,而“数据清洗”作为数据预处理的核心环节,是打通数据从“原始杂乱”到“干净可用” ...
2026-04-22 很多数据分析师每天盯着GMV、转化率、DAU等数字看,但当被问到“什么是指标”“指标和维度有什么区别”“如何搭建一套完整的 ...
2026-04-22在数据分析与业务决策中,数据并非静止不变的数值,而是始终处于动态波动之中——股市收盘价的每日涨跌、企业月度销售额的起伏、 ...
2026-04-21在数据分析领域,当研究涉及多个自变量与多个因变量之间的复杂关联时,多变量一般线性分析(Multivariate General Linear Analys ...
2026-04-21很多数据分析师精通描述性统计,能熟练计算均值、中位数、标准差,但当被问到“用500个样本如何推断10万用户的真实满意度”“这 ...
2026-04-21在数据处理与分析的全流程中,日期数据是贯穿业务场景的核心维度之一——无论是业务报表统计、用户行为追踪,还是风控规则落地、 ...
2026-04-20在机器学习建模全流程中,特征工程是连接原始数据与模型效果的关键环节,而特征重要性分析则是特征工程的“灵魂”——它不仅能帮 ...
2026-04-20很多数据分析师沉迷于复杂的机器学习算法,却忽略了数据分析最基础也最核心的能力——描述性统计。事实上,80%的商业分析问题, ...
2026-04-20在数字化时代,数据已成为企业决策的核心驱动力,数据分析与数据挖掘作为解锁数据价值的关键手段,广泛应用于互联网、金融、医疗 ...
2026-04-17在数据处理、后端开发、报表生成与自动化脚本中,将 SQL 查询结果转换为字符串是一项高频且实用的操作。无论是拼接多行数据为逗 ...
2026-04-17面对一份上万行的销售明细表,要快速回答“哪个地区卖得最好”“哪款产品增长最快”“不同客户类型的购买力如何”——这些看似复 ...
2026-04-17数据分析师一天的工作,80% 的时间围绕表格结构数据展开。从一张销售明细表到一份完整的分析报告,表格结构数据贯穿始终。但你真 ...
2026-04-16在机器学习无监督学习领域,Kmeans聚类因其原理简洁、计算高效、可扩展性强的优势,成为数据聚类任务中的主流算法,广泛应用于用 ...
2026-04-16在机器学习建模实践中,特征工程是决定模型性能的核心环节之一。面对高维数据集,冗余特征、无关特征不仅会增加模型训练成本、延 ...
2026-04-16在数字化时代,用户是产品的核心资产,用户运营的本质的是通过科学的指标监测、分析与优化,实现“拉新、促活、留存、转化、复购 ...
2026-04-15在企业数字化转型、系统架构设计、数据治理与AI落地过程中,数据模型、本体模型、业务模型是三大核心基础模型,三者相互支撑、各 ...
2026-04-15数据分析师的一天,80%的时间花在表格数据上,但80%的坑也踩在表格数据上。 如果你分不清数值型和文本型的区别,不知道数据从哪 ...
2026-04-15在人工智能与机器学习落地过程中,模型质量直接决定了应用效果的优劣——无论是分类、回归、生成式模型,还是推荐、预测类模型, ...
2026-04-14