NLP: 使用Lucene的Kuromoji对日文进行分词

2016年08月24日 14656点热度 5人点赞 0条评论

原创声明:

  1. 本文为原创文章
  2. 如需转载需要在文章最开始显示本文原始链接
  3. 为了更好的阅读体验,请回源站查看文章。有任何修改、订正只会在源站体现

由于工作需要,本人需要对日文内容进行处理。其中分词是一个无法绕过的环节。

经过一段时间的调研,发现kuromoji应该是目前应用范围最为广泛的分词器了。

在kuromoji的使用上,可以使用集成到Lucene之中的类库,也可以使用独立的版本。

独立版本的使用,可以参考: http://rensanning.iteye.com/blog/2008575 。此文说得已经非常详细了,举得例子也非常清晰。

有两点可以补充一下:

  1. 当前kuromoji的最新版本已经到了0.9.0, 可以到maven中央库看一下:http://search.maven.org/#search%7Cga%7C1%7Ckuromoji
  2. 文中提到的lucene-gosen 搜索了一下,最新的更新是2012年。 看起来项目已经废弃了

 

本文着重介绍的是使用Lucene集成的kuromoji分词器的使用方法。 在使用上比单独的使用要麻烦不少。希望此文对必须使用Lucene自带分词器的同学有所帮助。

1.分词器的创建

默认分词器并没有太多需要解释的地方。 下面主要解释一下自行构造的分词器

  • 第一个参数: 读取用户词典。 后面会给一个参考方法。
  • 第二个参数: Mode.Search 表示是Search模式。 一共有3种模式:
    • Mode.Normal
      • 官方解释:Default mode
    • Mode.Search
      • 官方解释:Uses a heuristic to segment compound nouns (複合名詞) into their parts
    • Mode.Extend
      • 官方解释:Same as SEARCH, but emits unigram tokens for unknown terms
  • 第三个参数: 停用词词表
  • 第四个参数:需要过滤掉的词性
    • 官方例子可以到Lucene的unit test 之中查找。
    • 笔者实验之后,发现效果并不是很好,可能默认去掉的词性太多,对预测模型不太友好,因此喂了一个空的Set进去。 各位读者可以根据自己需要进行构造

 

2. 使用分词器进行分词

这部分的代码非常乱,逻辑也很复杂,完全没法跟独立的版本的使用方法相比。

下面的代码仅供参考,如果您有更好的版本,还请贴一下代码让我也学习一下:

 

这份代码笔者也不多解释了,笔者自己也没有完全的搞清楚。简单解释一下
“oa.startOffset() < lastOffset”

如果不进行这样的判断的话,就会出现重复的分词的情况。。。

 

 

由于数据保密需要,无法再次将所有的代码以及使用的数据公开出来,抱歉。

但是上面的代码是最核心的分词代码了。

 

3. 其他处理日文的代码

3.1 全角转半角

示例:

全角:1234ABCD

半角:1234ABCD

3.2 判断是否是日文字符

 

4. 总结

  1. 如果您有的选择,推荐选择不要与Lucene集成的版本,因为:
    1. 在使用上要复杂一些。
    2. 貌似无法调用Lemmatization、Reading功能
    3. 貌似无法切换自带词典。
    4. 哪位知道还请告知
  2. 就分词功能而言,Kuromoji可以自行构造分词器,包括增加用户词典、自行设置停用词与过滤掉部分词性的词。 同时设置好适应你自己的模型的分词模型,比如是默认的Normal还是Search or Extend
  3. Kuromoji的分词性能还没有测试,目测能满足大部分的性能要求。(笔者的环境上面2分钟进行了大概15W次分词。)

RangerWolf

保持饥渴的专注,追求最佳的品质

文章评论