R语⾔——中⽂分词包jiebaR
,涵盖了R的思想,使⽤,⼯具,创新等的⼀系列要点,以我个⼈的学习和体验去诠释R的强⼤。
R语⾔作为统计学⼀门语⾔,⼀直在⼩众领域闪耀着光芒。直到⼤数据的爆发,R语⾔变成了⼀门炙⼿可热的数据分析的利器。随着越来越多的⼯程背景的⼈的加⼊,R语⾔的社区在迅速扩⼤成长。现在已不仅仅是统计领域,教育,银⾏,电商,互联⽹….都在使⽤R语⾔。
要成为有理想的极客,我们不能停留在语法上,要掌握牢固的数学,概率,统计知识,同时还要有创新精神,把R语⾔发挥到各个领域。让我们⼀起动起来吧,开始R的极客理想。
关于作者:
张丹(Conan), 程序员Java,R,PHP,Javascript
weibo:@Conan_Z
blog:
email: bsspirit@gmail
前⾔
本⽂挖掘是数据挖掘中⼀个⾮常重要的部分,有⾮常⼴阔的使⽤场景,⽐如我们可以对新闻事件进⾏分析,了解国家⼤事;也可以对微博信息进⾏分析,通过社交舆情看看⼤家的关注点。通过⽂本挖掘到⽂章中的隐藏信息,对⽂章的结构进⾏分析,判断是不是同⼀个作者写⽂章;同时可以对邮件分析,结合bayes算法判断哪些是垃圾邮件,哪些是有⽤的邮件。
本⽂挖掘的第⼀步,就是要进⾏分词,分词将直接影响⽂本挖掘的效果。R语⾔在分词⽅⾯有很好的⽀持,接下来就给⼤家介绍⼀个不错的R语⾔中⽂分词包“结巴分词”(jiebaR)。
⽬录
1. jiebaR包介绍
2. 5分钟上⼿
3. 分词引擎
4. 配置词典
5. 停⽌词过滤
6. 关键词提取
1. jiebaR包介绍
结巴分词(jiebaR),是⼀款⾼效的R语⾔中⽂分词包,底层使⽤的是C++,通过Rcpp进⾏调⽤很⾼效。结巴分词基于MIT协议,就是免费和开源的,感谢国⼈作者的给⼒⽀持,让R的可以⽅便的处理中⽂⽂
本。
本⽂所使⽤的系统环境
Win10 64bit
R: 3.2.3 x86_64-w64-mingw32/x64 b4bit
jiebaR包是在CRAN发布的标准库,安装起来⾮常简单,2条命令就可以了。
~ R
> install.packages("jiebaR")
> library("jiebaR")
如果想要安装开发版本,可以使⽤devtools来进⾏安装,devtools的介绍请参考⽂章:
> library(devtools)
> install_github("qinwf/jiebaRD")
> install_github("qinwf/jiebaR")
> library("jiebaR")
开发版本安装,官⽅建议使⽤Linux系统 gcc >= 4.6 编译,Windows需要安装 Rtools。
2. 5分钟上⼿
5分钟上⼿,直接看第⼀个例⼦吧,对⼀段⽂字进⾏分词。
> wk = worker()
> wk["我是《R的极客理想》图书作者"]
[1] "我是" "R"    "的"  "极客" "理想" "图书" "作者"
> wk["我是R语⾔的深度⽤户"]
[1] "我"  "是"  "R"    "语⾔" "的"  "深度" "⽤户"
很简单地,2⾏代码,就完成了中⽂分词。
jiebaR提供了3种分词语句的写法,例⼦上⾯的⽤[]符号的语法,还可以使⽤<=符合语法,或者使⽤segment()函数。虽然形式不同,但是分词效果是⼀样的。使⽤<=符号的语法,如下
> wk<='另⼀种符合的语法'
[1] "另"  "⼀种" "符合" "的"  "语法"
使⽤segment()函数的语法,如下
> segment( "segment()函数语句的写法" , wk )
[1] "segment" "函数"    "语句"    "的"      "写法"
如果你觉得很神奇,想了解如何⾃定义操作符的,可以检查项⽬的源代码。
# <= 符号定义
`<=.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`
我们也可以直接对⽂本⽂件进⾏分词,在当前⽬录新建⼀个⽂本⽂件。
~
R的极客理想系列⽂章,涵盖了R的思想,使⽤,⼯具,创新等的⼀系列要点,以我个⼈的学习和体验去诠释R的强⼤。
R语⾔作为统计学⼀门语⾔,⼀直在⼩众领域闪耀着光芒。直到⼤数据的爆发,R语⾔变成了⼀门炙⼿可热的数据分析的利器。随着越来越多的⼯程背景的⼈的加⼊,R
当然,我们运⾏分词程序,会在当前⽬录⽣成⼀个新的分词结果的⽂件。
> wk['./']
[1] "./idea.segment.2016-07-20_23_"
打开⽂件idea.segment.2016-07-20_23_,整个本⽂以空格进⾏分词。
~ notepad idea.segment.2016-07-20_23_
R 的极客理想系列⽂章涵盖了 R 的思想使⽤⼯具创新等的⼀系列要点以我个⼈的学习和体验去诠释 R 的强⼤ R 语⾔作为统计学⼀门语⾔⼀直在⼩
是不是很简单,5分钟实践就能完成分词的任务。
3. 分词引擎
在调⽤worker()函数时,我们实际是在加载jiebaR库的分词引擎。jiebaR库提供了7种分词引擎。
混合模型(MixSegment):是四个分词引擎⾥⾯分词效果较好的类,结它合使⽤最⼤概率法和隐式马尔科夫模型。
最⼤概率法(MPSegment) :负责根据Trie树构建有向⽆环图和进⾏动态规划算法,是分词算法的核⼼。
隐式马尔科夫模型(HMMSegment):是根据基于⼈民⽇报等语料库构建的HMM模型来进⾏分词,主要算法思路是根据(B,E,M,S)四个状态来代表每个字的隐藏状态。 HMM模型由dict/hmm_model.utf8提供。分词算法即viterbi算法。
索引模型(QuerySegment):先使⽤混合模型进⾏切词,再对于切出来的较长的词,枚举句⼦中所有可能成词的情况,出词库⾥存在。
标记模型(tag)
Simhash模型(simhash)
关键词模型(keywods)
如果你不太关⼼引擎的事,那么直接⽤官⽅推荐的混合模型(默认选择)就⾏了。查看worker()函数的定义。
worker(type = "mix", dict = DICTPATH, hmm = HMMPATH, user = USERPATH,
idf = IDFPATH, stop_word = STOPPATH, write = T, qmax = 20, topn = 5,
encoding = "UTF-8", detect = T, symbol = F, lines = 1e+05,
output = NULL, bylines = F, user_weight = "max")
参数列表:
type, 引擎类型
dict, 系统词典
hmm, HMM模型路径
user, ⽤户词典
idf, IDF词典
stop_word, 关键词⽤停⽌词库
write, 是否将⽂件分词结果写⼊⽂件,默认FALSE
qmax, 最⼤成词的字符数,默认20个字符
topn, 关键词数,默认5个
encoding, 输⼊⽂件的编码,默认UTF-8
detect, 是否编码检查,默认TRUE
symbol, 是否保留符号,默认FALSE
lines, 每次读取⽂件的最⼤⾏数,⽤于控制读取⽂件的长度。⼤⽂件则会分次读取。
output, 输出路径
bylines, 按⾏输出
user_weight, ⽤户权重
我们在调⽤worker()时,就加载了分词引擎,可以打印出来,查看分词的引擎的配置。
> wk = worker()
> wk
Worker Type:  Jieba Segment
Default Method  :  mix    # 混合模型
Detect Encoding :  TRUE    # 检查编码
Default Encoding:  UTF-8  # UTF-8
Keep Symbols    :  FALSE  # 不保留符号
Output Path    :          # 输出⽂件⽬录
Write File      :  TRUE    # 写⽂件
By Lines        :  FALSE  # 不⾏输出
Max Word Length :  20      # 最⼤单单词长度
Max Read Lines  :  1e+05  # 最⼤读⼊⽂件⾏数
Fixed Model Components:
$dict                      # 系统词典
[1] "D:/tool/R-3.2.3/library/jiebaRD/dict/jieba.dict.utf8"
$user                      # ⽤户词典
[1] "D:/tool/R-3.2.3/library/jiebaRD/dict/user.dict.utf8"
$hmm                      # 隐式马尔科夫模型模型
[1] "D:/tool/R-3.2.3/library/jiebaRD/dict/hmm_model.utf8"
$stop_word                # 停⽌词,⽆
NULL
$user_weight              # ⽤户词典权重
[1] "max"
$timestamp                # 时间戳
[1] 1469027302
$default $detect $encoding $symbol $output $write $lines $bylines can be reset.
如果我们想改变分词引擎的配置项,可以在调⽤worker()创建分词引擎时,也可以通过wk$XX来进⾏设置。如果想了解wk是什么类型的对象,我们通过pryr包的otype的函数来检查wk对象的类型。关于pryr包的详细使⽤,请参考⽂章
# 加载 pryr包
> library(pryr)
> otype(wk)  # ⾯向对象的类型检查
[1] "S3"
> class(wk)  # 查看class是属性
[1] "jiebar"  "segment" "jieba"
4. 配置词典
对于分词的结果好坏的关键因素是词典,jiebaR默认有配置标准的词典。对于我们的使⽤来说,不同⾏业或不同的⽂字类型,最好⽤专门的分词词典。在jiebaR中通过show_dictpath()函数可以查看默认的标准词典,可以通过上⼀⼩节介绍的配置项,来指定我们⾃⼰的词典。⽇常对话的常⽤词典,⽐如搜狗输⼊法的词库。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。