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分钟上手
- 分词引擎
- 配置词典
- 停止词过滤
- 关键词提取
结巴分词(jiebaR),是一款高效的R语言中文分词包,底层使用的是C++,通过Rcpp进行调用很高效。结巴分词基于MIT协议,就是免费和开源的,感谢国人作者的给力支持,让R的可以方便的处理中文文本。
官方Github的地址:https://github.com/qinwf/jiebaR
本文所使用的系统环境
- Win10 64bit
- R: 3.2.3 x86_64-w64-mingw32/x64 b4bit
jiebaR包是在CRAN发布的标准库,安装起来非常简单,2条命令就可以了。
如果想要安装开发版本,可以使用devtools来进行安装,devtools的介绍请参考文章:在巨人的肩膀前行 催化R包开发
开发版本安装,官方建议使用Linux系统 gcc >= 4.6 编译,Windows需要安装 Rtools。
5分钟上手,直接看第一个例子吧,对一段文字进行分词。
很简单地,2行代码,就完成了中文分词。
jiebaR提供了3种分词语句的写法,例子上面的用[]符号的语法,还可以使用<=符合语法,或者使用segment()函数。虽然形式不同,但是分词效果是一样的。使用<=符号的语法,如下
使用segment()函数的语法,如下
如果你觉得很神奇,想了解如何自定义操作符的,可以检查项目的源代码quick.R文件。
我们也可以直接对文本文件进行分词,在当前目录新建一个文本文件idea.txt。
当然,我们运行分词程序,会在当前目录生成一个新的分词结果的文件。
打开文件idea.segment.2016-07-20_23_25_34.txt,整个本文以空格进行分词。
是不是很简单,5分钟实践就能完成分词的任务。
在调用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()函数的定义。
参数列表:
- 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()时,就加载了分词引擎,可以打印出来,查看分词的引擎的配置。
如果我们想改变分词引擎的配置项,可以在调用worker()创建分词引擎时,也可以通过wk$XX来进行设置。如果想了解wk是什么类型的对象,我们通过pryr包的otype的函数来检查wk对象的类型。关于pryr包的详细使用,请参考文章撬动R内核的高级工具包pryr
对于分词的结果好坏的关键因素是词典,jiebaR默认有配置标准的词典。对于我们的使用来说,不同行业或不同的文字类型,最好用专门的分词词典。在jiebaR中通过show_dictpath()函数可以查看默认的标准词典,可以通过上一小节介绍的配置项,来指定我们自己的词典。日常对话的常用词典,比如搜狗输入法的词库。
看到词典目录中,包括了多个文件。
- jieba.dict.utf8, 系统词典文件,最大概率法,utf8编码的
- hmm_model.utf8, 系统词典文件,隐式马尔科夫模型,utf8编码的
- user.dict.utf8, 用户词典文件,utf8编码的
- stop_words.utf8,停止词文件,utf8编码的
- idf.utf8,IDF语料库,utf8编码的
- jieba.dict.zip,jieba.dict.utf8的压缩包
- hmm_model.zip,hmm_model.utf8的压缩包
- idf.zip,idf.utf8的压缩包
- backup.rda,无注释
- model.rda,无注释
- README.md,说明文件
打开系统词典文件jieba.dict.utf8,并打印前50行。
我们发现系统词典每一行都有三列,并以空格分割,第一列为词项,第二列为词频,第三列为词性标记。
打开用户词典文件user.dict.utf8,并打印前50行。
用户词典第一行有二列,,第一列为词项,第二列为词性标记,没有词频的列。用户词典默认词频为系统词库中的最大词频。
jiebaR包关于词典词性标记,采用ictclas的标记方法。ICTCLAS 汉语词性标注集。
下面我们自定义一个用户词典,来试试效果。编写词典文件,user.utf8。
使用我们的自定义的用户词典,对刚才的文本再进行分词。
对比2次产生的分词结果,idea.segment.2016-07-20_23_25_34.txt 和 idea.segment.2016-07-21_11_14_24.txt。
在实际使用中,jiebaR默认提供的用户词典只有5个单词,太简单了,肯定是不够用的。我们可以用搜狗词典,来丰富用户自己的词库。接下来,让我们配置搜狗词典。你需要安装一个搜狗输入法,具体的安装过程不再解释。
我安装的是搜狗五笔输入法,找到搜狗的安装目录,并找到词典文件。我的搜狗词典,在下面的安装位置。
把17960.scel文件复制到自己的项目目录里,用文本编辑器打开文件,发现是二进制的。那么我需要用工具进行转换,把二进制的词典转成我们可以使用的文本文件。jiebaR包的作者,同时开发了一个cidian项目,可以转换搜狗的词典,那么我们只需要安装cidian包即可。
安装cidian项目
转换二进制词典到文本文件。
接下来,直接把搜狗词典配置到我们的分词库中,就可以直接使用了。把搜狗词典文件改名,从17960.scel_2016-07-21_00_22_11.dict到user.dict.utf8,然后替换D: oolR-3.2.3libraryjiebaRDdict目录下面的user.dict.utf8。这样默认的用户词典,就是搜狗词典了。很酷吧!
停止词就是分词过程中,我们不需要作为结果的词,像英文的语句中有很多的a,the,or,and等,中文语言中也有很多,比如 的,地,得,我,你,他。这些词因为使用频率过高,会大量出现在一段文本中,对于分词后的结果,在统计词频的时候会增加很多的噪音,所以我们通常都会将这些词进行过滤。
在jiebaR中,过滤停止词有2种方法,一种是通过配置stop_word文件,另一种是使用filter_segment()函数。
首先我们先来看,通过配置stop_word文件的方法。新建一个stop_word.txt文件。
加载分词引擎,并配置停止词过滤。
上面的文本,我们把"我是"通过停止词进行了过滤。如果还想过滤“作者”一词,可以动态的调用filter_segment()函数。
关键词提取是文本处理非常重要的一个环节,一个经典算法是TF-IDF算法。其中,TF(Term Frequency)代表词频,IDF(Inverse document Frequency)表示逆文档频率。如果某个词在文章中多次出现,而且不是停止词,那么它很可能就反应了这段文章的特性,这就是我们要找的关键词。再通过IDF来算出每个词的权重,不常见的词出现的频率越高,则权重越大。计算TF-IDF的公式为:
对文档中每个词计算TF-IDF的值,把结果从大到小排序,就得到了这篇文档的关键性排序列表。关于IF-IDF的解释,参考了文章TF-IDF与余弦相似性的应用(一):自动提取关键词。
jiebaR包的关键词提取提取的实现,也是使用了TF-IDF的算法。在安装目录中的idf.utf8文件,为IDF的语料库。查看idf.utf8内容。
idf.utf8文件每一行有2列,第一列是词项,第二列为权重。然后,我通过计算文档的词频(TF),与语料库的IDF值相乘,就可以得到TF-IDF值,从而提取文档的关键词。
比如,我们对下面的文本内容进行关键词的提取。
使用jiebaR包处理分词确实简单,几行的代码就能实现分词的各种算法操作。有了这个工具,我们就可以文档中,发现各种语言规则进行文本挖掘了。下篇文章让我们挖掘一下上市公司的公告吧,说不定能发现什么市场规则。
本文只是抛砖引玉地介绍了jiebaR包的使用方法,详细使用操作,请参考包作者的官方介绍。再次感谢jiebaR作者@qinwenfeng,为R语言在中文分词中提供了一套非常不错的工具包!
以上就是本篇文章【R语言——中文分词包jiebaR】的全部内容了,欢迎阅览 ! 文章地址:http://dfvalve.xrbh.cn/quote/1370.html 行业 资讯 企业新闻 行情 企业黄页 同类资讯 网站地图 返回首页 迅博思语资讯移动站 http://keant.xrbh.cn/ , 查看更多