R专题区|中文分词入门之—jiebaR

Posted WiseRClub

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R专题区|中文分词入门之—jiebaR相关的知识,希望对你有一定的参考价值。

前言


     本文挖掘是数据挖掘领域的一个分支。研究表明,80%左右的电子化信息是以文本的形式存在的,所以文本挖掘被认为比数据挖掘具有更高的商业潜力,并且在很多场景都能广泛使用。比如我们可以分析新闻文本,了解时政;可以分析微博信息,了解社会舆论;也可以分析文章结构,发掘其中的隐藏信息,甚至判断文章作者是谁。

       在获得文本数据后,最关键的步骤就是对文本进行分词处理。今天要给大家介绍的是 R 中一个非常好用的中文分词包——jiebaR。

       jiebaR 是 Python“结巴分词”的 R 语言版本,支持四种分词模式:最大概率法(Maximum Probability),索引模型(QuerySegment),隐式马尔科夫模型(Hidden Markov Model),混合模型(MixSegment)。同时具有关键词提取,词性标注,文本 Simhash 相似度比较等功能。项目使用了 Rcpp 和 CppJieba 进行开发。值得一提的是,jiebaR 包的作者覃文锋是厦门大学公共卫生学院2011级本科生,我厦还真是人才辈出啊。

1

jiebaR的安装


      官网(https://jiebar.qinwf.com)提供了两种安装方法: jiebaR是发布在CRAN的标准库,通过CRAN安装稳定版非常简单:


install.packages("jiebaR")

library(jiebaR)


       还可以通过GitHub安装开发版,官方建议使用Linux系统 gcc >= 4.9 编译,Windows 下需要安装 Rtools :


library(devtools)
install_github("qinwf/jiebaRD")
install_github("qinwf/jiebaR")
library(jiebaR)

2

简单分词

R专题区|中文分词入门之—jiebaR

       在加载包的时候并没有启动任何分词引擎,首先我们可以通过函数worker() 初始化分词引擎,非常简单,一行代码就可以实现:


seg1 <- worker()


       然后就可以对文本进行分词。这里可以使用 segment() 函数,也可直接使用 <= 符号或[]符号:


test1 <- "我们来对这句话进行分词"
segment(test1, seg1)

## [1] "我们" "来"   "对"   "这句" "话"   "进行" "分词"

seg1 <= test1

## [1] "我们" "来"   "对"   "这句" "话"   "进行" "分词"

seg1[test1]

## [1] "我们" "来"   "对"   "这句" "话"   "进行" "分词"


       前面我们提到,jiebaR 支持4种分词模式,并且可以同时初始化多个不同模式的分词器。worker() 函数默认使用混合模型,下面我们来初始化第二个引擎:


seg2 <- worker(type = "mp")  

#该引擎设置为最大概率法模型

seg2 <= test1

## [1] "我们" "来"   "对"   "这"   "句"   "话"   "进行" "分词"


        我们可以输入已加载的引擎来查看其配置:


seg1

## Worker Type:  Jieba Segment
##
## Default Method  :  mix
## Detect Encoding :  TRUE
## Default Encoding:  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:/Program Files/R-3.3.2/library/jiebaRD/dict/jieba.dict.utf8"
##
## $user
## [1] "D:/Program Files/R-3.3.2/library/jiebaRD/dict/user.dict.utf8"
##
## $hmm
## [1] "D:/Program Files/R-3.3.2/library/jiebaRD/dict/hmm_model.utf8"
##
## $stop_word
## NULL
##
## $user_weight
## [1] "max"
##
## $timestamp
## [1] 1486397549
##
## $default $detect $encoding $symbol $output $write $lines $bylines can be reset.


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,是否按行输出,默认FALSE

• user_weight,用户权重,默认"max"

3

文件分词

R专题区|中文分词入门之—jiebaR


       jiebaR 也支持对文本文件进行分词,首先我们在当前目录下创建一个 txt 文件 WISE R CLUB.txt:

R专题区|中文分词入门之—jiebaR

       对文件进行分词,会在当前目录下生成一个分词结果的文件:

seg1 <= "WISE R CLUB.txt"

## [1] "WISE R CLUB.segment.2017-02-06_11_12_33.txt"

R专题区|中文分词入门之—jiebaR

       我们在之前提到,worker 中含有许多参数,我们可以通过修改这些参数来获得我们想要的结果。


(1)词性标注

       jiebaR 的词性标注采用ictclas的标记法。可以在 worker 中加入 tag 参数来进行词性标注:

tag <- worker("tag")
tag <= "WISE R CLUB是厦门大学王亚南经济研究院与经济学院学生自发组织的数据科学学习交流平台。"

##        eng          x        eng          v         nt         nr
##     "WISE"        "R"     "CLUB"       "是" "厦门大学"   "王亚南"
##          n          n          p          n          n          n
##     "经济"   "研究院"       "与"     "经济"     "学院"     "学生"
##          v          v         uj          n          n          v
##     "自发"     "组织"       "的"     "数据"     "科学"     "学习"
##          n
## "交流平台"


       一些常用的词性代码:

代码

名称

释义

a

形容词

英语形容词adjective的第1个字母

ad

副形词

直接作状语的形容词。形容词代码a和副词代码d并在一起

c

连词

英语连词conjunction的第1个字母

i

成语

英语成语idiom的第1个字母

n

名词

英语名词noun的第1个字母

nr

人名

名词代码n"(ren)"的声母并在一起

ns

地名

名词代码n和处所词代码s并在一起

p

介词

英语介词prepositional的第1个字母

uj

结构助词的


v

动词

英语动词verb的第一个字母

x

非语素字

非语素字只是一个符号,字母x通常用于代表未知数、符号


(2)过滤停用词

       停用词是由英文单词 stopword 翻译过来的,原来在英语里面会遇到很多 a,the,or 等使用频率很高的字或词,常为冠词、介词、副词或连词等,中文中也有很多,比如“的”、“地”、“它”、“你”、“我”等在统计词频时我们通常会将其过滤。

       在jiebaR里我们可以通过添加 stop_word 文件过滤停用词。首先新建一个 stopword.txt 文件。

R专题区|中文分词入门之—jiebaR


       加载分词引擎并配置停用词文件:

seg <- worker(stop_word = "stopword.txt")
seg <= "WISE R CLUB.txt"

## [1] "WISE R CLUB.segment.2017-02-06_11_12_37.txt"

R专题区|中文分词入门之—jiebaR

       可以看到 stopword 文件里设置的停用词都被过滤了。


(3)提取关键词


       jiebaR 包的关键词提取使用了 TF-IDF 算法。其中TF(Term Frequency)代表词频,IDF(Inverse Document Frequency)代表逆文档频率。滤除停用词后,出现频率高的词可能会反映文章的重点,这就是关键词。然后再通过IDF算出每个词的权重,不常见词出现的频率越高,权重越大。TF-IDF 的计算公式为:

TF-IDF = TF * IDF

       计算每个词的 TD-IDF 值,结果从大到小排下来就是文本关键词的排序。

       我们对 WISE R CLUB .txt 提取关键词,先初始化一个关键词引擎:

keys <- worker(type = 'keywords', topn = 3)  #topn代表提取出的关键词数目

       然后提取文件的关键词:

segment <- seg["WISE R CLUB.txt"]

keys <= segment

## found on 'WISE R CLUB.segment.2017-02-06_11_12_40.txt'

##    18.4905    16.1376    13.9007
##     "语言"     "课程"    "专题研讨"


(4)配置词典

       分词结果很大程度上依赖于配置的词典。jiebaR 包中包含默认的词典如下:


dir(show_dictpath())

## [1] "D:/Program Files/R-3.3.2/library/jiebaRD/dict"

##  [1] "backup.rda"      "hmm_model.utf8"  "hmm_model.zip" 
##  [4] "idf.utf8"        "idf.zip"         "jieba.dict.utf8"
##  [7] "jieba.dict.zip"  "model.rda"       "README.md"     
## [10] "stop_words.utf8" "user.dict.utf8"


       也可以自定义一个用户词典,首先设置一个词典文件,wise.utf8:

R专题区|中文分词入门之—jiebaR

       使用自定义的词典再对 WISE R CLUB.txt 文件进行分词,看看与之前的结果有什么不同:

seg <- worker(user = 'wise.utf8')
seg <= "WISE R CLUB.txt"

## [1] "WISE R CLUB.segment.2017-02-06_11_12_43.txt"

R专题区|中文分词入门之—jiebaR

R专题区|中文分词入门之—jiebaR


 

       在实际应用中,我们还可以将输入法的词典文件配置到分词词库中。本包的作者开发了一个 cidian 包,可以将搜狗输入法的二进制词典文件转换成文本文件,然后替换 jiebaRD 目录下的 user.dict.utf8 就可以将默认用户词典修改为搜狗输入法的词典。具体操作很简单,这里就不赘述了,有兴趣的同学可以下载 cidian 包试一下。

总结Summary

jiebaR 包基础功能和用法总结


      jiebaR 包应该是目前在中文分词方面最易上手的工具,相比于 Rwordseg 包还需要 rJava 支持,jiebaR的安装也更简单,可以说对初学者是非常友好的一款分词工具包。本文只是简单介绍了的 jiebaR 包的一些基本用法,关于这个包需要学习的还有很多哦。这里要再次感谢覃文锋学长对此包的开发和维护,关于 jiebaR 包的详细内容和具体细节也可以参见:

官网:https://jiebar.qinwf.com

GitHub:https://github.com/qinwf/jiebaR



编辑:李衍



欢迎热爱数据科学的盆友们投稿

稿件投至787868940@qq.com



以上是关于R专题区|中文分词入门之—jiebaR的主要内容,如果未能解决你的问题,请参考以下文章

R语言中文分词包jiebaR

如何用R语言做中文分词

R语言jiebaR包文本中文分词及词云制作上机练习

R语言中文分词包jiebaR

jiebaR 中文分词详解

如何用R进行中文分词?