rmmseg-cpp使用记录,rails的一个分词gem

总结了使用rmmseg-cpp分词中遇到的问题

Posted by Start Bootstrap on June 12, 2017

rmmseg-cpp中文分词的gem有自己的一套词典,但是我们在使用时还是会有一些关键词分不出来(例如: “李彦宏”分词后变成 “李” “彦” “宏”)所以我们要建立自己的分词词库

1.:words 类型 (词库)

#格式: 
4 独一无二
2 百度
3 李彦宏

2.:chars 类型 (字库)

#格式: 
0 
223 
13 

其中,开头的数字代表的是这个字出现的次数,然后是一个空格,最后是我们想要添加的字

了解了这两种类型的词库的格式,我们就可以自己添加词库了。 没加入词库之前我们对 “啦啦啦啦啦啦啦” 字符串进行分词,结果为:

=> {"啦"=>[18, 21]}

然后我们新建一个词库my_words.dic,然后把gem包原有的词库复制进去,在里边写入:

4 啦啦啦啦

然后再新建一个字库my_chars.dic,然后把gem包原有的字库复制进去,不用再添加东西 然后在分词函数前边引入这个词典:

RMMSeg::Dictionary.dictionaries = [[:chars, "my_chars.dic"],
[:words, "my_words.dic"]]

然后我们对”啦啦啦啦啦啦啦” 字符串进行分词,结果为:

=> {"啦啦啦啦"=>[0, 12], "啦"=>[12, 15], "啦啦"=>[15, 21]}

这样就可以分出我们认为比较重要的词了 但是如果我们加入的词多于4个字的时候,例如我们在字库中加入:

5 般若波罗蜜

然后我们对 “般若波罗蜜哄嘛咪嘛咪哄” 字符串进行分词,结果为:

=> {"般"=>[0, 3], "若"=>[3, 6], "波"=>[6, 9], "罗"=>[9, 12], "蜜"=>[12, 15], "哄"=>[30, 33], "嘛"=>[24, 27], "咪"=>[27, 30]}

并没有生效 关于英文分词: 经过测试,在字库和词库中加入英文单词,例如 在字库或词库中加入:

6 Visvim
#然后对 "sdfasfasfsafsfsVisvimadsfasfasfasasfa" #进行分词,结果为:
=> {"sdfasfasfsafsfsVisvimadsfasfasfasasfa"=>[0, 37]}
#和不添加的时候分词效果一样。
#但是在以下情况中,英文分词能够分出来:
"This is a word Visvim" => {"This"=>[0, 4], "is"=>[5, 7], "a"=>[8, 9], "word"=>[10, 14], "Visvim"=>[15, 21]}
"This is a word \"Visvim\"" => {"This"=>[0, 4], "is"=>[5, 7], "a"=>[8, 9], "word"=>[10, 14], "Visvim"=>[16, 22]}
"This is a word|Visvim" => {"This"=>[0, 4], "is"=>[5, 7], "a"=>[8, 9], "word"=>[10, 14], "Visvim"=>[15, 21]}
"This is a word@Visvim" => {"This"=>[0, 4], "is"=>[5, 7], "a"=>[8, 9], "word"=>[10, 14], "Visvim"=>[15, 21]}
"这是一个单词Visvim这是一个单词" => {"这是"=>[24, 30], "一个"=>[30, 36], "单词"=>[36, 42], "Visvim"=>[18, 24]}

我们可以看出,当两个英文单词中间有空格或者符号或者中文的时候,这个分词器会把英文单词分出来,所以大部分情况我们不用担心

结论:

RMMSeg::Dictionary.dictionaries = [[:chars, "my_chars.dic"],
[:words, "my_words.dic"]]
  1. 当使用这种方法加载自定义的字词库的时候,Rmmseg-cpp不会再使用自带的字词库,所以我们要确保自定义的字词库已经包含了Rmmseg-cpp自带的字词库
  2. Rmmseg-cpp的字词库不支持英文
  3. 加的词最大长度为四个字,多于四个字分词不会生效
  4. 当英文单词之间有空格、符号、中文的时候,分词器会把英文单词分出来

附:通过修改源码可以改变分词的最大词长 在.rvm/gems/ruby-2.3.0/gems/rmmseg-cpp-0.2.9/ext/rmmseg目录下的algor.h文件的第49行 通过修改max_word_length的返回值来决定最大词长,默认是4