【文本分析】利用jiebaR进行中文分词

【文本分析】利用jiebaR进行中文分词

说在前面

中文分词(Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词。分词是文本分析中的关键步骤,只有分词准确,才能生成正确的词频矩阵,对一篇文章或是以部小说进行合适的统计分析,得出许多有趣的结论。

然而,相对于英文来说,由于中文的一句话内词与词之间并没有清晰的空格划分,所以很多人就研究了许多算法解决这一问题。在诸多的开源包中,jieba是我目前碰到的效果最好,最易用的中文分词工具今天我们就主要介绍其在R语言的API接口:jiebaR。

1. 分词

jiebaR提供了可以通过函数worker()来初始化分词引擎,使用函数segment()进行分词。其提供了四种分词模式,分别基于以下算法(摘自官方文档):

最大概率法(MPSegment),负责根据Trie树构建有向无环图和进行动态规划算法,是分词算法的核心。

隐式马尔科夫模型(HMMSegment)是根据基于人民日报等语料库构建的HMM模型来进行分词,主要算法思路是根据(B,E,M,S)四个状态来代表每个字的隐藏状态。 HMM模型由dict/hmm_model.utf8提供。分词算法即viterbi算法。

混合模型(MixSegment)是四个分词引擎里面分词效果较好的类,结它合使用最大概率法和隐式马尔科夫模型。

索引模型(QuerySegment)先使用混合模型进行切词,再对于切出来的较长的词,枚举句子中所有可能成词的情况,找出词库里存在。

而具体R语言实现例子如下:


library(jiebaR)

mixseg <- worker() #worker()函数是用来初始化分词引擎的,默认为混合模型。
text <- "我们来一起学习数据科学"
segment(text, mixseg) #segment函数可以进行分词,返回的是一个向量。
[1] "我们" "来"   "一起" "学习" "数据" "科学"

还有另外一些写法,可以代替segment函数:
mixseg[text]
[1] "我们" "来"   "一起" "学习" "数据" "科学"
mixseg<=text
[1] "我们" "来"   "一起" "学习" "数据" "科学"

#当然还可以直接对一个文件进行分词,比如:
segment('D:/test.txt', mixseg) 

可以看到,分词的效果还是不错的。worker()函数是jiebaR里最为核心的函数,我们可以设置其众多参数:

cc2 = worker(type  = "mix", dict = "dict/jieba.dict.utf8",
                 hmm   = "dict/hmm_model.utf8",  
                 user  = "dict/test.dict.utf8",
                 symbol = F
                 ) 

这段代码展示了其中比较关键的一些参数,其中type是算法类型,dict是字典来源,如果不设置就会使用jiebaR默认的字典,同样的hmm路径和user路径也一样。symbol选项是F表示不保留标点。此外,还可以设置停词字典,更多详细具体的设置可以在R语言里用?worker()查看。

2. 标注词性

可以使用 <=.tagger 或者 tag 来进行分词和词性标注,词性标注使用混合模型模型分词,标注采用和 ictclas 兼容的标记法。

words = "我爱北京天安门"
tagger = worker("tag")
tagger <= words

#返回结果:
     r        v       ns       ns 
    "我"     "爱"   "北京" "天安门"

3. 提取关键词

关键词提取所使用逆向文件频率(IDF)文本语料库可以切换成自定义语料库的路径,使用方法与分词类似。topn参数为关键词的个数。

keys = worker("keywords", topn = 1)
keys <= "我爱北京天安门"
  8.9954 
"天安门"

返回结果之所以是天安门而没有“北京”和“”我”等词是因为这些词的相对词频不高,在行文中太过常见。topn表示的是返回关键词的个数,8.9954就是相对词频值。

我们也可以对古龙《多情剑客无情剑》第一章进行关键词提取,结果如下:

keys = worker("keywords", topn = 4)
keys <= gulong

 516.525   264.77  247.599  234.873 
"李寻欢"   "诸葛"   "白蛇"   "少年" 

4. simhash计算

对中文文档计算出对应的simhash值。simhash是谷歌用来进行文本去重的算法,现在广泛应用在文本处理中。Simhash引擎先进行分词和关键词提取,后计算Simhash值和海明距离,官方例子如下:

words = "hello world!"
simhasher = worker("simhash",topn=2)
simhasher <= "江州市长江大桥参加了长江大桥的通车仪式"
$simhash
[1] "12882166450308878002"

$keyword
   22.3853    8.69667 
"长江大桥"     "江州"
distance(words, "江州市长江大桥参加了长江大桥的通车仪式",simhasher)
$distance
[1] "23"

$lhs
11.7392 11.7392 
"hello" "world" 

$rhs
   22.3853    8.69667 
"长江大桥"     "江州"

说在后面

关于机器学习的内容还未结束,请持续关注该专栏的后续文章。

更多内容请关注我的专栏:R Language and Data Mining

或者关注我的知乎账号:温如

编辑于 2017-01-14 20:13