1. 首页
  2. 数据分析

手把手教你做文本挖掘

手把手教你做文本挖掘


一、文本挖掘定义
文本挖掘指的是从文本数据中获取有价值的信息和知识,它是数据挖掘中的一种方法。文本挖掘中最重要最基本的应用是实现文本的分类和聚类,前者是有监督的挖掘算法,后者是无监督的挖掘算法。
手把手教你做文本挖掘


二、文本挖掘步骤

1)读取数据库或本地外部文本文件

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镜像中下载到,有关这两个包的下载方法可参见下文:

http://mp.weixin.qq.com/s__biz=MzIxNjA2ODUzNg==&mid=209748877&idx=1&sn=5b6d721ba4371063fc5b51b81b38f568&scene=21#wechat_redirect


四、实战

本文所用数据集来自于sougou实验室数据,具体可至如下链接下载:

http://download.labs.sogou.com/dl/sogoulabdown/SogouC.mini.20061102.tar.gz

本文对该数据集做了整合,将各个主题下的新闻汇总到一张csv表格中,数据格式如下图所示:

手把手教你做文本挖掘

具体数据可至文章后面的链接。

  1. #加载所需R包

  2. library(tm)

  3. library(Rwordseg)

  4. library(wordcloud)

  5. library(tmcn)

  6. #读取数据 mydata <- read.table(file = file.choose(), header = TRUE, sep= ',', stringsAsFactors = FALSE)

  7. str(mydata)

手把手教你做文本挖掘

接下来需要对新闻内容进行分词,在分词之前需要导入一些自定义字典,目的是提高切词的准确性。由于文本中涉及到军事、医疗、财经、体育等方面的内容,故需要将搜狗字典插入到本次分析的字典集中。

  1. #添加自定义字典

  2. installDict(dictpath = 'G:\dict\财经金融词汇大全【官方推荐】.scel',

  3.            dictname = 'Caijing', dicttype = 'scel')

  4. installDict(dictpath = 'G:\dict\军事词汇大全【官方推荐】.scel',

  5.            dictname = 'Junshi', dicttype = 'scel')

  6. installDict(dictpath = 'G:\dict\篮球【官方推荐】.scel',

  7.            dictname = 'Lanqiu', dicttype = 'scel')

  8. installDict(dictpath = 'G:\dict\旅游词汇大全【官方推荐】.scel',

  9.            dictname = 'Lvyou', dicttype = 'scel')

  10. installDict(dictpath = 'G:\dict\汽车词汇大全【官方推荐】.scel',

  11.            dictname = 'Qiche1', dicttype = 'scel')

  12. installDict(dictpath = 'G:\dict\汽车频道专用词库.scel',

  13.            dictname = 'Qiche2', dicttype = 'scel')

  14. installDict(dictpath = 'G:\dict\医学词汇大全【官方推荐】.scel',

  15.            dictname = 'Yixue', dicttype = 'scel')

  16. installDict(dictpath = 'G:\dict\足球【官方推荐】.scel',

  17.            dictname = 'Zuqiu', dicttype = 'scel') #查看已安装的词典 listDict()

手把手教你做文本挖掘

如果需要卸载某些已导入字典的话,可以使用uninstallDict()函数。

分词前将中文中的英文字母统统去掉。

  1. #剔除文本中含有的英文字母

  2. mydata$Text <- gsub('[a-zA-Z]','',mydata$Text)

  3. #分词

  4. segword<- segmentCN(strwords = mydata$Text)

  5. #查看第一条新闻分词结果

  6. segword[[1]]

![](http://img.shujuren.org/pictures/NM/57133badad48f.png)

图中圈出来的词对后续的分析并没有什么实际意义,故需要将其剔除,即删除停止词。

  1. #创建停止词

  2. mystopwords <- read.table(file = file.choose(), stringsAsFactors= FALSE)

  3. head(mystopwords) class(mystopwords)

  4. #需要将数据框格式的数据转化为向量格式

  5. mystopwords<- as.vector(mystopwords[,1])

  6. head(mystopwords)

手把手教你做文本挖掘
图13

停止词创建好后,该如何删除76条新闻中实际意义的词呢?下面通过自定义删除停止词的函数加以实现。

  1. #自定义删除停止词的函数

  2. removewords <- function(target_words,stop_words){

  3. target_words= target_words[target_words%in%stop_words==FALSE] return(target_words)

  4. }

  5. segword2 <- sapply(X = segword, FUN = removewords, mystopwords)

  6. #查看已删除后的分词结果

  7. segword2[[1]]

手把手教你做文本挖掘
图14

相比与之前的分词结果,这里瘦身了很多,剔除了诸如“是”、“的”、“到”、“这”等无意义的次。

判别分词结果的好坏,最快捷的方法是绘制文字云,可以清晰的查看哪些词不该出现或哪些词分割的不准确。

  1. #绘制文字图

  2. word_freq <- getWordFreq(string = unlist(segword2))

  3. opar <-par(no.readonly = TRUE)

  4. par(bg = 'black')

  5. #绘制出现频率最高的前50个词

  6. wordcloud(words= word_freq$Word, freq = word_freq$Freq, max.words = 50, random.color =

  7. TRUE, colors = rainbow(n = 7))

  8. par(opar)

手把手教你做文本挖掘
图15

很明显这里仍然存在一些无意义的词(如说、日、个、去等)和分割不准确的词语(如黄金周切割为黄金,医药切割为药等),这里限于篇幅的原因,就不进行再次添加自定义词汇和停止词。

  1. #将已分完词的列表导入为语料库,并进一步加工处理语料库

  2. text_corpus <- Corpus(x = VectorSource(segword2))

  3. text_corpus

手把手教你做文本挖掘

图16

此时语料库中存放了76条新闻的分词结果。

  1. #去除语料库中的数字

  2. text_corpus <- tm_map(text_corpus, removeNumbers)

  3. #去除语料库中的多余空格

  4. text_corpus <- tm_map(text_corpus, stripWhitespace)

  5. #创建文档-词条矩阵

  6. dtm <-DocumentTermMatrix(x = text_corpus, control = list(wordLengths = c(2,Inf)))

  7. dtm

手把手教你做文本挖掘
图17

从图中可知,文档-词条矩阵包含了76行和7939列,行代表76条新闻,列代表7939个词;该矩阵实际上为稀疏矩阵,其中矩阵中非0元素有11655个,而0元素有591709,稀疏率达到98%;最后,这7939个词中,最频繁的一个词出现在了49条新闻中。

由于稀疏矩阵的稀疏率过高,这里将剔除一些出现频次极地的词语。

  1. #去除稀疏矩阵中的词条

  2. dtm <- removeSparseTerms(x = dtm, sparse = 0.9)

  3. dtm

手把手教你做文本挖掘
图18

这样一来,矩阵中列大幅减少,当前矩阵只包含了116列,即116个词语。

为了便于进一步的统计建模,需要将矩阵转换为数据框格式。

  1. #将矩阵转换为数据框格式

  2. df <- as.data.frame(inspect(dtm))

  3. #查看数据框的前6行(部分)

  4. head(df)

手把手教你做文本挖掘
图19

统计建模:聚类分析

聚类分析是文本挖掘的基本应用,常用的聚类算法包括层次聚类法、划分聚类法、EM聚类法和密度聚类法。相关算法的应用可参考如下几篇文章:

http://mp.weixin.qq.com/s?__biz=MzIxNjA2ODUzNg==&mid=209904579&idx=1&sn=66303539d699ee418d07f454df2cb7d0&scene=21#wechat_redirect

http://mp.weixin.qq.com/s?__biz=MzIxNjA2ODUzNg==&mid=209931634&idx=1&sn=ad508f4366cc1cc6bd8f201519357703&scene=21#wechat_redirect

http://mp.weixin.qq.com/s?__biz=MzIxNjA2ODUzNg==&mid=210023339&idx=1&sn=b103aa4851d6b9f331f1b677eca02051&scene=21#wechat_redirect

http://mp.weixin.qq.com/s?__biz=MzIxNjA2ODUzNg==&mid=400592499&idx=1&sn=069f4b9cd09a815f0f5c3ef861a77a55&scene=21#wechat_redirect

这里使用层次聚类中的McQuitty相似分析法实现新闻的聚类。

  1. #计算距离

  2. d <- dist(df)

  3. #层次聚类法之McQuitty相似分析法

  4. fit1 <- hclust(d = d, method= 'mcquitty')

  5. plot(fit1)

  6. rect.hclust(tree = fit1, k = 7, border = 'red')

图20

这里的McQuitty层次聚类法效果不理想,类与类之间分布相当不平衡,我想可能存在三种原因:

1)文章的主干关键词出现频次不够,使得文章没能反映某种主题;

2)分词过程中没有剔除对建模不利的干扰词,如中国、美国、公司、市场、记者等词语;

3)没能够准确分割某些常用词,如黄金周。

总结

所以在实际的文本挖掘过程中,最为困难和耗费时间的就是分词部分,既要准确分词,又要剔除无意义的词语,这对文本挖掘者是一种挑战。

文中数据和脚本可至如下链接下载:

http://yunpan.cn/cupyBj9xTkHe7 访问密码 a88b

作者:刘顺祥

数据分析师,热爱数据分析与挖掘工作,擅长使用R语言。

本文已获作者授权,严禁二次转载。


原文始发于微信公众号(PPV课数据科学社区):手把手教你做文本挖掘

原创文章,作者:ppvke,如若转载,请注明出处:http://www.ppvke.com/archives/4455

联系我们

4000-51-9191

在线咨询:点击这里给我发消息

工作时间:周一至周五,9:30-18:30,节假日休息