本文摘自《Kears深度学习:入门、实战及进阶》第10章10.2小节。
文本挖掘被描述为“自动化或半自动化处理文本的过程”,中文分词的结果就可以直接用来建立文本对象,最常用的结构就是词条与文档的关系矩阵,利用这个矩阵可以使用很多文本挖掘的算法来得到不同的结果,包括相似度计算、文本聚类、文本分类、主题模型、情感分析等。
R语言提供了丰富的扩展包来完成文本分词和建模。常用的有tm、tmcn、RwordSeg、jiebaR、tidytext等扩展包。以下对这些扩展包进行简要介绍及安装。
tm包是文本挖掘的基础框架包,它被很多NLP相关的包。tm.plugin.dc、tm.plugin.mail、tm.plugin.factiva是针对tm包的扩展,可以用来分布式存储语料、处理邮件文本、获取Factiva语料。
tm包的安装非常简单,直接通过命令install.packages("tm")即可完成安装。
tmcn试图去解决tm包的问题,先从中文支持开始,然后逐渐更新去解决各种问题,同时也会兼顾tm框架,在框架之外进行一些有益的补充。tmcn包突出的优点如下:
中文编码:各种编码的识别和UTF-8之间的转换;中文简体字和繁体字之间的切换;增强了tau包中的一些功能。
中文语料资源:例如GBK字符集及中文停止词等。
字符处理:常用的字符处理函数,一些函数是对stringr包的优化或者不同实现。
文本挖掘:基于基础R对象的文本挖掘框架,包含常用的文本挖掘模型,包含一些独立的NLP库,比如CRF++、word2vec等。
tmcn包目前在R-forge上开发和发布,读者可以下载不同系统的版本进行安装。
在最新版本的R中可以使用以下命令直接通过R-forge安装:
install.packages("tmcn", repos = "http://R-Forge.R-project.org")
Rwordseg是一个R环境下的中文分词工具,使用rJava调用Java分词工具Ansj。
Rwordseg包完全引用了Ansj包,在这个Java包的基础上开发了R的接口,并根据R处理文本的习惯进行了调整。
能否成功安装Rwordseg包的前提是需提前安装rJava依赖包,而安装rJava前提是本机需要安装JDK(Java Platform),可从Oracle官网免费下载与R对应系统位数一致的JDK进行安装及环境变量配置。然后,可通过以下命令在线安装rJava包和Rwordseg包。
install.packages("rJava")
install.packages("Rwordseg", repos = "http://R-Forge.R-project.org")
如果以上命令Rwordseg包安装不成功,也可直接在R-forge网站下载Rwordseg压缩包进行本地安装。
结巴分词(jiebaR)是一款高效的R语言中文分词包,底层使用的是C++,通过Rcpp进行高效调用。jiebaR支持最大概率法(Maximum Probability),隐式马尔科夫模型(Hidden Markov Model),索引模型(QuerySegment),混合模型(MixSegment),共四种分词模式,同时有词性标注,关键词提取,文本Simhash相似度比较等功能。
jiebaR已经发布到CRAN上,可以通过以下命令进行在线安装。
install.packages("jiebaR")
由于文本是非结构化数据,常规的数据处理及可视化方法不适合做文本分析。tidytext包提供了相对简单却实用的功能,其将文本视为单个单词的数据框架可以使我们轻松地对文本进行操作、汇总和可视化,这使得许多文本挖掘任务变得更容易高效。
tidytext已经发布到CRAN上,可以通过以下命令进行在线安装。
install.packages("tidytext")
最后,让我们先看本章一个对中国四大名著进行词频统计的例子。
文本挖掘的一个常见任务是查看分词后的词频,并比较不同文本的频数。
运行以下代码对水浒传的词频进行统计,并对词频进行降序排序。
> library(mqxsr)
> mqxs <- books()
> unique(mqxs$book)
[1] 水滸傳 三國志演義 西遊記 紅樓夢 喻世明言 警世通言 醒世恆言
Levels: 水滸傳 三國志演義 西遊記 紅樓夢 喻世明言 警世通言 醒世恆言
> tidy_mqxs_simplified %>%
+ filter(book=="水浒传") %>%
+ count(word,sort = TRUE)
# A tibble: 13,027 x 2
word n
<fct> <int>
1 了 8062
2 道 5704
3 来 3691
4 裏 3332
5 我 3288
6 你 3050
7 去 3032
8 那 2985
9 人 2838
10 的 2646
# ... with 13,017 more rows
运行以下代码对三国志演义的词频进行统计,并对词频进行降序排序。
> tidy_mqxs_simplified %>%
+ filter(book=="三国志演义") %>%
+ count(word,sort = TRUE)
# A tibble: 15,479 x 2
word n
<fct> <int>
1 曰 8721
2 之 6269
3 兵 3298
4 人 2399
5 将 2339
6 吾 2274
7 为 2267
8 不 2242
9 军 2240
10 也 2230
# ... with 15,469 more rows
运行以下代码对西游记的词频进行统计,并对词频进行降序排序。
> tidy_mqxs_simplified %>%
+ filter(book=="西遊记") %>%
+ count(word,sort = TRUE)
# A tibble: 18,673 x 2
word n
<fct> <int>
1 道 9763
2 了 7197
3 那 6838
4 我 6343
5 他 5600
6 你 5259
7 的 5190
8 是 4186
9 行者 4156
10 来 3141
# ... with 18,663 more rows
运行以下代码对红楼梦的词频进行统计,并对词频进行降序排序。
> tidy_mqxs_simplified %>%
+ filter(book=="红楼梦") %>%
+ count(word,sort = TRUE)
# A tibble: 18,630 x 2
word n
<fct> <int>
1 了 18827
2 的 15148
3 道 8009
4 我 7731
5 他 6666
6 说 6653
7 是 6161
8 你 6035
9 也 5808
10 人 5273
# ... with 18,620 more rows
利用wordcloud()函数对水浒传中出现频率最高的200个词语进行词云展示。
if(!require(wordcloud)) install.packages("wordcloud")
> data_sub <- tidy_mqxs_simplified %>%
+ filter(book== "红楼梦") %>%
+ count(word,sort = TRUE) %>%
+ top_n(200)
Selecting by n
> wordcloud(data_sub$word,
+ data_sub$n,
+ random.order = F)
我们也可以利用wordcloud2包的wordcloud2()函数对词频进行交互式的词云展示。
> library(wordcloud2)
> data_sub <- tidy_mqxs_simplified %>%
+ filter(book== "三国志演义") %>%
+ count(word,sort = TRUE) %>%
+ top_n(200)
Selecting by n
> wordcloud2(data_sub,shape = 'star')