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/

http://blog.fens.me/wp-content/uploads/2016/07/jiebaR.png

前言

本文挖掘是数据挖掘中一个非常重要的部分,有非常广阔的使用场景,比如我们可以对新闻事件进行分析,了解国家大事;也可以对微博信息进行分析,通过社交舆情看看大家的关注点。通过文本挖掘找到文章中的隐藏信息,对文章的结构进行分析,判断是不是同一个作者写文章;同时可以对邮件分析,结合bayes算法判断哪些是垃圾邮件,哪些是有用的邮件。

本文挖掘的第一步,就是要进行分词,分词将直接影响文本挖掘的效果。R语言在分词方面有很好的支持,接下来就给大家介绍一个不错的R语言中文分词包“结巴分词”(jiebaR)。

目录

  1. jiebaR包介绍
  2. 5分钟上手
  3. 分词引擎
  4. 配置词典
  5. 停止词过滤
  6. 关键词提取

https://github.com/qinwf/jiebaR

本文所使用的系统环境

  • Win10 64bit
  • R: 3.2.3 x86_64-w64-mingw32/x64 b4bit

jiebaR包是在CRAN发布的标准库,安装起来非常简单,2条命令就可以了。

  1.    
  2.   ~ R
  3.   > install.packages("jiebaR")
  4.   > library("jiebaR")

如果想要安装开发版本,可以使用devtools来进行安装,devtools的介绍请参考文章:在巨人的肩膀前行 催化R包开发

  1.    
  2.   > library(devtools)
  3.   > install_github("qinwf/jiebaRD")
  4.   > install_github("qinwf/jiebaR")
  5.   > library("jiebaR")

开发版本安装,官方建议使用Linux系统 gcc >= 4.6 编译,Windows需要安装 Rtools。

quick.R文件。

  1.    
  2.   # <= 符号定义
  3.   `<=.qseg`<-function(qseg, code){
  4.   if(!exists("quick_worker",envir = .GlobalEnv ,inherits = F) ||
  5.   .GlobalEnv$quick_worker$PrivateVarible$timestamp != TIMESTAMP){
  6.    
  7.   if(exists("qseg",envir = .GlobalEnv,inherits = FALSE ) )
  8.   rm("qseg",envir = .GlobalEnv)
  9.    
  10.   modelpath = file.path(find.package("jiebaR"),"model","model.rda")
  11.   quickparam = readRDS(modelpath)
  12.    
  13.   if(quickparam$dict == "AUTO") quickparam$dict = DICTPATH
  14.   if(quickparam$hmm == "AUTO") quickparam$hmm = HMMPATH
  15.   if(quickparam$user == "AUTO") quickparam$user = USERPATH
  16.   if(quickparam$stop_word == "AUTO") quickparam$stop_word = STOPPATH
  17.   if(quickparam$idf == "AUTO") quickparam$idf = IDFPATH
  18.    
  19.   createquickworker(quickparam)
  20.   setactive()
  21.   }
  22.    
  23.   //..代码省略
  24.   }
  25.    
  26.   # [ 符号定义
  27.   `[.qseg`<- `<=.qseg`
  28.    

我们也可以直接对文本文件进行分词,在当前目录新建一个文本文件idea.txt。

  1.    
  2.   ~ notepad idea.txt
  3.    
  4.   R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大。
  5.    
  6.   R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器。随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长。现在已不仅仅是统计领域,教育,银行,电商,互联网….都在使用R语言。

当然,我们运行分词程序,会在当前目录生成一个新的分词结果的文件。

  1.    
  2.   > wk['./idea.txt']
  3.   [1] "./idea.segment.2016-07-20_23_25_34.txt"

打开文件idea.segment.2016-07-20_23_25_34.txt,整个本文以空格进行分词。

  1.    
  2.   ~ notepad idea.segment.2016-07-20_23_25_34.txt
  3.    
  4.   R 的 极客 理想 系列 文章 涵盖 了 R 的 思想 使用 工具 创新 等 的 一系列 要点 以 我 个人 的 学习 和 体验 去 诠释 R 的 强大 R 语言 作为 统计学 一门 语言 一直 在 小众 领域 闪耀着 光芒 直到 大 数据 的 爆发 R 语言 变成 了 一门 炙手可热 的 数据分析 的 利器 随着 越来越 多 的 工程 背景 的 人 的 加入 R 语言 的 社区 在 迅速 扩大 成长 现在 已 不仅仅 是 统计 领域 教育 银行 电商 互联网 都 在 使用 R 语言

是不是很简单,5分钟实践就能完成分词的任务。

撬动R内核的高级工具包pryr

  1.    
  2.   # 加载 pryr包
  3.   > library(pryr)
  4.   > otype(wk) # 面向对象的类型检查
  5.   [1] "S3"
  6.    
  7.   > class(wk) # 查看class是属性
  8.   [1] "jiebar" "segment" "jieba"

jiebaR-cut

在实际使用中,jiebaR默认提供的用户词典只有5个单词,太简单了,肯定是不够用的。我们可以用搜狗词典,来丰富用户自己的词库。接下来,让我们配置搜狗词典。你需要安装一个搜狗输入法,具体的安装过程不再解释。

我安装的是搜狗五笔输入法,找到搜狗的安装目录,并找到词典文件。我的搜狗词典,在下面的安装位置。

  1.    
  2.   C:\Program Files (x86)\SogouWBInput\2.1.0.1288\scd\17960.scel

把17960.scel文件复制到自己的项目目录里,用文本编辑器打开文件,发现是二进制的。那么我需要用工具进行转换,把二进制的词典转成我们可以使用的文本文件。jiebaR包的作者,同时开发了一个cidian项目,可以转换搜狗的词典,那么我们只需要安装cidian包即可。

安装cidian项目

  1.    
  2.   > install.packages("devtools")
  3.   > install.packages("stringi")
  4.   > install.packages("pbapply")
  5.   > install.packages("Rcpp")
  6.   > install.packages("RcppProgress")
  7.   > library(devtools)
  8.   > install_github("qinwf/cidian")
  9.   > 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,正常情况下就能顺利安装

转换二进制词典到文本文件。

  1.    
  2.   # 转换
  3.   > decode_scel(scel = "./17960.scel",cpp = TRUE)
  4.   output file: ./17960.scel_2016-07-21_00_22_11.dict
  5.    
  6.   # 查看生成的词典文件
  7.   > scan(file="./17960.scel_2016-07-21_00_22_11.dict",
  8.   + what=character(),nlines=50,sep='\n',
  9.   + encoding='utf-8',fileEncoding='utf-8')
  10.   Read 50 items
  11.   [1] "阿坝州 n" "阿百川 n" "阿班 n"
  12.   [4] "阿宾 n" "阿波菲斯 n" "阿不都热希提 n"
  13.   [7] "阿不都西库尔 n" "阿不力克木 n" "阿尔姆格伦 n"
  14.   [10] "阿尔沙文 n" "阿肥星 n" "阿菲正传 n"
  15.   [13] "阿密特 n" "阿穆 n" "阿穆隆 n"
  16.   [16] "阿帕鲁萨镇 n" "阿披实 n" "阿衰 n"
  17.   [19] "阿霞 n" "艾奥瓦 n" "爱不疚 n"
  18.   [22] "爱的错位 n" "爱得得体 n" "爱的火焰 n"
  19.   [25] "爱的流刑地 n" "爱得起 n" "埃夫隆 n"
  20.   [28] "爱搞网 n" "爱国红心 n" "爱呼 n"
  21.   [31] "爱就宅一起 n" "埃克希儿 n" "爱没有错 n"
  22.   [34] "埃蒙斯 n" "爱奴新传 n" "爱起点 n"
  23.   [37] "爱情的牙齿 n" "爱情海滨 n" "爱情节 n"
  24.   [40] "爱情美的样子 n" "爱情无限谱 n" "爱情占线 n"
  25.   [43] "爱情转移 n" "爱情左灯右行 n" "爱上你是一个错 n"
  26.   [46] "矮哨兵 n" "爱是妥协 n" "爱似水仙 n"
  27.   [49] "爱太痛 n" "爱无界 n"

接下来,直接把搜狗词典配置到我们的分词库中,就可以直接使用了。把搜狗词典文件改名,从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内容。

  1.    
  2.   > scan(file="D:/tool/R-3.2.3/library/jiebaRD/dict/idf.utf8",
  3.   + what=character(),nlines=50,sep='\n',
  4.   + encoding='utf-8',fileEncoding='utf-8')
  5.   Read 50 items
  6.   [1] "劳动防护 13.900677652" "生化学 13.900677652"
  7.   [3] "奥萨贝尔 13.900677652" "考察队员 13.900677652"
  8.   [5] "岗上 11.5027823792" "倒车档 12.2912397395"
  9.   [7] "编译 9.21854642485" "蝶泳 11.1926274509"
  10.   [9] "外委 11.8212361103" "故作高深 11.9547675029"
  11.   [11] "尉遂成 13.2075304714" "心源性 11.1926274509"
  12.   [13] "现役军人 10.642581114" "杜勃留 13.2075304714"
  13.   [15] "包天笑 13.900677652" "贾政陪 13.2075304714"
  14.   [17] "托尔湾 13.900677652" "多瓦 12.5143832909"
  15.   [19] "多瓣 13.900677652" "巴斯特尔 11.598092559"
  16.   [21] "刘皇帝 12.8020653633" "亚历山德罗夫 13.2075304714"
  17.   [23] "社会公众 8.90346537821" "五百份 12.8020653633"
  18.   [25] "两点阈 12.5143832909" "多瓶 13.900677652"
  19.   [27] "冰天 12.2912397395" "库布齐 11.598092559"
  20.   [29] "龙川县 12.8020653633" "银燕 11.9547675029"
  21.   [31] "历史风貌 11.8212361103" "信仰主义 13.2075304714"
  22.   [33] "好色 10.0088573539" "款款而行 12.5143832909"
  23.   [35] "凳子 8.36728816325" "二部 9.93038573842"
  24.   [37] "卢巴 12.1089181827" "五百五 13.2075304714"
  25.   [39] "畅叙 11.598092559" "吴栅子 13.2075304714"
  26.   [41] "智力竞赛 13.900677652" "库邦 13.2075304714"
  27.   [43] "非正义 11.3357282945" "编订 10.2897597393"
  28.   [45] "悲号 12.8020653633" "陈庄搭 13.2075304714"
  29.   [47] "二郎 9.62401153296" "电光石火 11.8212361103"
  30.   [49] "抢球 11.9547675029" "南澳大利亚 10.9562386728"

idf.utf8文件每一行有2列,第一列是词项,第二列为权重。然后,我通过计算文档的词频(TF),与语料库的IDF值相乘,就可以得到TF-IDF值,从而提取文档的关键词。

比如,我们对下面的文本内容进行关键词的提取。

  1.    
  2.   > wk = worker()
  3.   > segment<-wk["R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大。"]
  4.    
  5.   # 计算词频
  6.   > freq(segment)
  7.   char freq
  8.   1 创新 1
  9.   2 了 1
  10.   3 文章 1
  11.   4 强大 1
  12.   5 R 3
  13.   6 个人 1
  14.   7 的 5
  15.   8 诠释 1
  16.   9 和 1
  17.   10 一系列 1
  18.   11 使用 1
  19.   12 以 1
  20.   13 等 1
  21.   14 极客 1
  22.   15 理想 1
  23.   16 思想 1
  24.   17 涵盖 1
  25.   18 系列 1
  26.   19 去 1
  27.   20 我 1
  28.   21 工具 1
  29.   22 学习 1
  30.   23 体验 1
  31.   24 要点 1
  32.    
  33.   # 取TF-IDF的前5的关键词
  34.   > keys = worker("keywords",topn=5)
  35.    
  36.   # 计算关键词
  37.   > vector_keywords(segment,keys)
  38.   11.7392 8.97342 8.23425 8.2137 7.43298
  39.   "极客" "诠释" "要点" "涵盖" "体验"

使用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")