R语言——中文分词包jiebaR
R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大。
R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器。随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长。现在已不仅仅是统计领域,教育,银行,电商,互联网….都在使用R语言。
要成为有理想的极客,我们不能停留在语法上,要掌握牢固的数学,概率,统计知识,同时还要有创新精神,把R语言发挥到各个领域。让我们一起动起来吧,开始R的极客理想。
关于作者:
- 张丹(Conan), 程序员Java,R,PHP,Javascript
- weibo:@Conan_Z
- blog: http://blog.fens.me
- email: bsspirit@gmail.com
转载请注明出处:
http://blog.fens.me/r-word-jiebar/
前言
本文挖掘是数据挖掘中一个非常重要的部分,有非常广阔的使用场景,比如我们可以对新闻事件进行分析,了解国家大事;也可以对微博信息进行分析,通过社交舆情看看大家的关注点。通过文本挖掘找到文章中的隐藏信息,对文章的结构进行分析,判断是不是同一个作者写文章;同时可以对邮件分析,结合bayes算法判断哪些是垃圾邮件,哪些是有用的邮件。
本文挖掘的第一步,就是要进行分词,分词将直接影响文本挖掘的效果。R语言在分词方面有很好的支持,接下来就给大家介绍一个不错的R语言中文分词包“结巴分词”(jiebaR)。
目录
- jiebaR包介绍
- 5分钟上手
- 分词引擎
- 配置词典
- 停止词过滤
- 关键词提取
https://github.com/qinwf/jiebaR
本文所使用的系统环境
- Win10 64bit
- R: 3.2.3 x86_64-w64-mingw32/x64 b4bit
jiebaR包是在CRAN发布的标准库,安装起来非常简单,2条命令就可以了。
- ~ R
- > install.packages("jiebaR")
- > library("jiebaR")
如果想要安装开发版本,可以使用devtools来进行安装,devtools的介绍请参考文章:在巨人的肩膀前行 催化R包开发
- > library(devtools)
- > install_github("qinwf/jiebaRD")
- > install_github("qinwf/jiebaR")
- > library("jiebaR")
开发版本安装,官方建议使用Linux系统 gcc >= 4.6 编译,Windows需要安装 Rtools。
quick.R文件。
-
-
# <= 符号定义
-
`<=.qseg`<-function(qseg, code){
-
if(!exists("quick_worker",envir = .GlobalEnv ,inherits = F) ||
-
.GlobalEnv$quick_worker$PrivateVarible$timestamp != TIMESTAMP){
-
-
if(exists("qseg",envir = .GlobalEnv,inherits = FALSE ) )
-
rm("qseg",envir = .GlobalEnv)
-
-
modelpath = file.path(find.package("jiebaR"),"model","model.rda")
-
quickparam = readRDS(modelpath)
-
-
if(quickparam$dict == "AUTO") quickparam$dict = DICTPATH
-
if(quickparam$hmm == "AUTO") quickparam$hmm = HMMPATH
-
if(quickparam$user == "AUTO") quickparam$user = USERPATH
-
if(quickparam$stop_word == "AUTO") quickparam$stop_word = STOPPATH
-
if(quickparam$idf == "AUTO") quickparam$idf = IDFPATH
-
-
createquickworker(quickparam)
-
setactive()
-
}
-
-
//..代码省略
-
}
-
-
# [ 符号定义
-
`[.qseg`<- `<=.qseg`
-
我们也可以直接对文本文件进行分词,在当前目录新建一个文本文件idea.txt。
- ~ notepad idea.txt
- R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大。
- R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器。随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长。现在已不仅仅是统计领域,教育,银行,电商,互联网….都在使用R语言。
当然,我们运行分词程序,会在当前目录生成一个新的分词结果的文件。
- > wk['./idea.txt']
- [
打开文件idea.segment.2016-07-20_23_25_34.txt,整个本文以空格进行分词。
- ~ notepad idea.segment.2016-07-20_23_25_34.txt
- R 的 极客 理想 系列 文章 涵盖 了 R 的 思想 使用 工具 创新 等 的 一系列 要点 以 我 个人 的 学习 和 体验 去 诠释 R 的 强大 R 语言 作为 统计学 一门 语言 一直 在 小众 领域 闪耀着 光芒 直到 大 数据 的 爆发 R 语言 变成 了 一门 炙手可热 的 数据分析 的 利器 随着 越来越 多 的 工程 背景 的 人 的 加入 R 语言 的 社区 在 迅速 扩大 成长 现在 已 不仅仅 是 统计 领域 教育 银行 电商 互联网 都 在 使用 R 语言
是不是很简单,5分钟实践就能完成分词的任务。
撬动R内核的高级工具包pryr
-
-
# 加载 pryr包
-
> library(pryr)
-
> otype(wk) # 面向对象的类型检查
-
[1] "S3"
-
-
> class(wk) # 查看class是属性
-
[1] "jiebar" "segment" "jieba"

在实际使用中,jiebaR默认提供的用户词典只有5个单词,太简单了,肯定是不够用的。我们可以用搜狗词典,来丰富用户自己的词库。接下来,让我们配置搜狗词典。你需要安装一个搜狗输入法,具体的安装过程不再解释。
我安装的是搜狗五笔输入法,找到搜狗的安装目录,并找到词典文件。我的搜狗词典,在下面的安装位置。
- C:\Program Files (x86)\SogouWBInput\2.1.0.1288\scd\17960.scel
把17960.scel文件复制到自己的项目目录里,用文本编辑器打开文件,发现是二进制的。那么我需要用工具进行转换,把二进制的词典转成我们可以使用的文本文件。jiebaR包的作者,同时开发了一个cidian项目,可以转换搜狗的词典,那么我们只需要安装cidian包即可。
安装cidian项目
- > install.packages("devtools")
- > install.packages("stringi")
- > install.packages("pbapply")
- > install.packages("Rcpp")
- > install.packages("RcppProgress")
- > library(devtools)
- > install_github("qinwf/cidian")
- > library(cidian) 为确保安装顺利,建议首先下载Rtools,下载后直接双击进行安装,安装同一般软件安装,下载地址https://cran.r-project.org/bin/windows/Rtools/,注意选择对应自己软件版本的。然后打开Rstudio或者R,用install.packages()依次安装devtools、stringi、pbapply、Rcpp、RcppProgress,然后加载devtools,然后用install_github("qinwf/cidian")安装cidian,正常情况下就能顺利安装
转换二进制词典到文本文件。
- > decode_scel(scel = "./17960.scel",cpp = TRUE)
- output file: ./17960.scel_2016-07-21_00_22_11.dict
- > scan(file="./17960.scel_2016-07-21_00_22_11.dict",
- + what=character(),nlines=50,sep='\n',
- + encoding='utf-8',fileEncoding='utf-8')
- Read 50 items
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
接下来,直接把搜狗词典配置到我们的分词库中,就可以直接使用了。把搜狗词典文件改名,从17960.scel_2016-07-21_00_22_11.dict到user.dict.utf8,然后替换D:\tool\R-3.2.3\library\jiebaRD\dict目录下面的user.dict.utf8。这样默认的用户词典,就是搜狗词典了。很酷吧!
如果使用txt文件作为词典,需要将编码改为utf-8,之后输入命令:jieba.load_userdict("C:/Users/Lenovo/Desktop/dict.txt")#括号内可自行设置路径
TF-IDF与余弦相似性的应用(一):自动提取关键词。
jiebaR包的关键词提取提取的实现,也是使用了TF-IDF的算法。在安装目录中的idf.utf8文件,为IDF的语料库。查看idf.utf8内容。
- > scan(file="D:/tool/R-3.2.3/library/jiebaRD/dict/idf.utf8",
- + what=character(),nlines=50,sep='\n',
- + encoding='utf-8',fileEncoding='utf-8')
- Read 50 items
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
idf.utf8文件每一行有2列,第一列是词项,第二列为权重。然后,我通过计算文档的词频(TF),与语料库的IDF值相乘,就可以得到TF-IDF值,从而提取文档的关键词。
比如,我们对下面的文本内容进行关键词的提取。
- > wk = worker()
- > segment<-wk["R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大。"]
- # 计算词频
- > freq(segment)
- char freq
- 1 创新 1
- 2 了 1
- 3 文章 1
- 4 强大 1
- 5 R 3
- 6 个人 1
- 7 的 5
- 8 诠释 1
- 9 和 1
- 10 一系列 1
- 11 使用 1
- 12 以 1
- 13 等 1
- 14 极客 1
- 15 理想 1
- 16 思想 1
- 17 涵盖 1
- 18 系列 1
- 19 去 1
- 20 我 1
- 21 工具 1
- 22 学习 1
- 23 体验 1
- 24 要点 1
- # 取TF-IDF的前5的关键词
- > keys = worker("keywords",topn=5)
- # 计算关键词
- > vector_keywords(segment,keys)
- 11.7392 8.97342 8.23425 8.2137 7.43298
- "极客" "诠释" "要点" "涵盖" "体验"
使用jiebaR包处理分词确实简单,几行的代码就能实现分词的各种算法操作。有了这个工具,我们就可以文档中,发现各种语言规则进行文本挖掘了。下篇文章让我们挖掘一下上市公司的公告吧,说不定能发现什么市场规则。
本文只是抛砖引玉地介绍了jiebaR包的使用方法,详细使用操作,请参考包作者的官方介绍。再次感谢jiebaR作者@qinwenfeng,为R语言在中文分词中提供了一套非常不错的工具包!
转载请注明出处:
http://blog.fens.me/r-word-jiebar/
R-cidian将词库批量读入
用到cidian包中的decode_scel函数
参数scel用来给出细胞词库的路径(需要带上扩展名)
output给出输出文件的路径,我们在这里把他放到了和原细胞词库同一个路径下面,并且将其扩展名改为.txt;
cpp = TRUE表示采用Rcpp(速度会更快)
progress = TRUE表示显示转换进度条。由于一般而言转换速度非常快,所以是否显示进度条意义不大。
####此处词库为搜狗词库
library(dplyr)
library(stringr)
library(devtools)
library(data.table)
library(cidian)
#建立数据目录
data.dir <- sprintf("%s/data", getwd())
#用来输出结果的目录
results.dir <- sprintf("%s/results", getwd())
#获取所有搜狗词库的完整路径
cidian.dir <- sprintf("%s/搜狗细胞词库-201602", data.dir)
scel.paths <- list.files(cidian.dir, pattern = ".scel$", full.names = T)
#导入目录下所有词库,并输出成.txt文件
lapply(seq_along(scel.paths), function(i) {
decode_scel(scel = scel.paths[i],
output = str_c(scel.paths[i], ".txt"),
cpp = TRUE)}) %>%
invisible()
#将所有词库合并成一个词库(此处用到函数data.table的rbindlist函数)
dict.paths <- list.files(cidian.dir, pattern = ".txt$", full.names = T)
dict.list <- lapply(seq_along(dict.paths),function(i) fread(dict.paths[i], encoding = "UTF-8"))
dict <- rbindlist(dict.list)
# 去重
dict <- unique(dict, by = names(dict))
#将最后生成的词库导出成单一的txt文件,用于后续分词
write.table(dict, file = sprintf("%s/guba.use.dict.utf8", data.dir),
quote = F,
row.names = F,
col.names = F,
fileEncoding = "UTF-8")