4月20日(今晚)Sim老师在Hellobi Live直播授课《手把手教你做文本挖掘》,阅读全文课报名。老司机带你快速上手文本挖掘!
一、文本挖掘定义
文本挖掘指的是从文本数据中获取有价值的信息和知识,它是数据挖掘中的一种方法。文本挖掘中最重要最基本的应用是实现文本的分类和聚类,前者是有监督的挖掘算法,后者是无监督的挖掘算法。
二、文本挖掘步骤
2)文本分词
2.1)自定义字典
2.2)自定义停止词
2.3)分词
2.4)文字云检索哪些词切的不准确、哪些词没有意义,需要循环2.1、2.2和 2.3步骤
3)构建文档-词条矩阵并转换为数据框
4)对数据框建立统计、挖掘模型
5)结果反馈
三、文本挖掘所需工具
本次文本挖掘将使用R语言实现,除此还需加载几个R包,它们是tm包、tmcn包、Rwordseg包和wordcloud包。其中tmcn包和Rwordseg包无法在CRAN镜像中下载到,有关这两个包的下载方法可参见下文:
R语言之文本挖掘--分词
四、实战
本文所用数据集来自于sougou实验室数据,具体可至如下链接下载:
http://download.labs.sogou.com/dl/sogoulabdown/SogouC.mini.20061102.tar.gz
本文对该数据集做了整合,将各个主题下的新闻汇总到一张csv表格中,数据格式如下图所示:
#加载所需R包
library(tm)
library(Rwordseg)
library(wordcloud)
library(tmcn)
#读取数据
mydata <- read.table(file = file.choose(),header = TRUE,sep = ',', stringsAsFactors = FALSE)
str(mydata)
接下来需要对新闻内容进行分词,在分词之前需要导入一些自定义字典,目的是提高切词的准确性。由于文本中涉及到军事、医疗、财经、体育等方面的内容,故需要将搜狗字典插入到本次分析的字典集中。
installDict(dictpath = 'G:\\dict\\财经金融词汇大全【官方推荐】.scel',
dictname = 'Caijing',dicttype = 'scel')
installDict(dictpath = 'G:\\dict\\军事词汇大全【官方推荐】.scel',65); Box-sizing: border-Box !important; word-wrap: break-word !important;"> dictname = 'Junshi',65); Box-sizing: border-Box !important; word-wrap: break-word !important;">installDict(dictpath = 'G:\\dict\\篮球【官方推荐】.scel',65); Box-sizing: border-Box !important; word-wrap: break-word !important;"> dictname = 'Lanqiu',65); Box-sizing: border-Box !important; word-wrap: break-word !important;">installDict(dictpath = 'G:\\dict\\旅游词汇大全【官方推荐】.scel',65); Box-sizing: border-Box !important; word-wrap: break-word !important;"> dictname = 'Lvyou',65); Box-sizing: border-Box !important; word-wrap: break-word !important;">installDict(dictpath = 'G:\\dict\\汽车词汇大全【官方推荐】.scel',65); Box-sizing: border-Box !important; word-wrap: break-word !important;"> dictname = 'Qiche1',65); Box-sizing: border-Box !important; word-wrap: break-word !important;">installDict(dictpath = 'G:\\dict\\汽车频道专用词库.scel',65); Box-sizing: border-Box !important; word-wrap: break-word !important;"> dictname = 'Qiche2',65); Box-sizing: border-Box !important; word-wrap: break-word !important;">installDict(dictpath = 'G:\\dict\\医学词汇大全【官方推荐】.scel',65); Box-sizing: border-Box !important; word-wrap: break-word !important;"> dictname = 'Yixue',65); Box-sizing: border-Box !important; word-wrap: break-word !important;">installDict(dictpath = 'G:\\dict\\足球【官方推荐】.scel',65); Box-sizing: border-Box !important; word-wrap: break-word !important;"> dictname = 'Zuqiu',dicttype = 'scel')
#查看已安装的词典
listDict()
如果需要卸载某些已导入字典的话,可以使用uninstallDict()函数。
#剔除文本中含有的英文字母
mydata$Text <- gsub('[a-zA-Z]','',mydata$Text)
#分词
segword <- segmentCN(strwords = mydata$Text)
#查看第一条新闻分词结果
segword[[1]]
#创建停止词
mystopwords <- read.table(file = file.choose(),stringsAsFactors = FALSE)
head(mystopwords)
class(mystopwords)
#需要将数据框格式的数据转化为向量格式
mystopwords <- as.vector(mystopwords[,1])
head(mystopwords)
removewords <- function(target_words,stop_words){
target_words = target_words[target_words%in%stop_words==FALSE]
return(target_words)
}
segword2 <- sapply(X = segword,FUN = removewords,mystopwords)
#查看已删除后的分词结果
segword2[[1]]
判别分词结果的好坏,最快捷的方法是绘制文字云,可以清晰的查看哪些词不该出现或哪些词分割的不准确。
#绘制文字图
word_freq <- getWordFreq(string = unlist(segword2))
opar <- par(no.readonly = TRUE)
par(bg = 'black')
#绘制出现频率最高的前50个词
wordcloud(words = word_freq$Word,freq = word_freq$Freq,max.words = 50,random.color = TRUE,colors = rainbow(n = 7))
par(opar)
#将已分完词的列表导入为语料库,并进一步加工处理语料库
text_corpus <- Corpus(x = VectorSource(segword2))
text_corpus
#去除语料库中的数字
text_corpus <- tm_map(text_corpus,removeNumbers)
#去除语料库中的多余空格
ipwhitespace)
#创建文档-词条矩阵
dtm <- DocumentTermMatrix(x = text_corpus,control = list(wordLengths = c(2,Inf)))
dtm
由于稀疏矩阵的稀疏率过高,这里将剔除一些出现频次极地的词语。
#去除稀疏矩阵中的词条
dtm <- removeSparseTerms(x = dtm,sparse = 0.9)
dtm
为了便于进一步的统计建模,需要将矩阵转换为数据框格式。
#将矩阵转换为数据框格式
df <- as.data.frame(inspect(dtm))
#查看数据框的前6行(部分)
head(df)
统计建模:聚类分析
聚类分析是文本挖掘的基本应用,常用的聚类算法包括层次聚类法、划分聚类法、EM聚类法和密度聚类法。相关算法的应用可参考如下几篇文章:
基于R语言的数据挖掘之聚类算法--划分方法
基于R语言的数据挖掘之聚类算法--层次方法
基于R语言的数据挖掘之聚类算法--基于密度方法
聚类之EM算法
这里使用层次聚类中的McQuitty相似分析法实现新闻的聚类。
#计算距离
d <- dist(df)
#层次聚类法之McQuitty相似分析法
fit1 <- hclust(d = d,method = 'mcquitty')
plot(fit1)
rect.hclust(tree = fit1,k = 7,border = 'red')
1)文章的主干关键词出现频次不够,使得文章没能反映某种主题;
2)分词过程中没有剔除对建模不利的干扰词,如中国、美国、公司、市场、记者等词语;
3)没能够准确分割某些常用词,如黄金周。
总结
所以在实际的文本挖掘过程中,最为困难和耗费时间的就是分词部分,既要准确分词,又要剔除无意义的词语,这对文本挖掘者是一种挑战。
本文作者:刘顺祥,浙江工商大学统计学硕士,3年的数据分析经验
微信公众号:每天进步一点点2015