如何在基于Lucene的中文分词器中添加自定义词典(如Paoding、mmseg4j、IK Analyzer)
2013-07-08 21:54:29| 分类: 计算机 |字号 订阅
(1)首先自定义一个XXX.dic的文件,以utf-8保存;
(2)将自定义词添加到dic/division下的XXX.dic中;
(3)删除.compile文件夹
有时候我们自定义词典的时候,发现不起作用,那么我们需要查看分词模式。
most-words:最大词量分词方式,此模式对应的词典编译类为MostWordsModeDictionariesCompiler
max-word-length:按词在词典中的原序来进行编译,基本不再做其他处理,此模式对应的词典编译类为SortingDictionariesCompiler
most-words是默认的分词模式。为了解决不起作用的问题,我们更改分词模式,步骤如下:
(1)找到你工程中引入的paoding-analysis.jar,将其打开,你会看到这样的一个配置文件paoding-analyzer.properties,打开内容如下:
#PaodingAnlyzer Mode, "most-words", "max-word-length", "class:com.xxx.MyTokenCollectorImpl"...
#paoding.analyzer.mode=most-words
#paoding.analyzer.dictionaries.compiler=net.paoding.analysis.analyzer.impl.MostWordsModeDictionariesCompiler
#paoding.analyzer.mode=max-word-length
#paoding.analyzer.dictionaries.compiler=net.paoding.analysis.analyzer.impl.SortingDictionariesCompiler
我们需要做的就是去掉最后一行的注释,即去掉#,文件内容变为:
#PaodingAnlyzer Mode, "most-words", "max-word-length", "class:com.xxx.MyTokenCollectorImpl"...
#paoding.analyzer.mode=most-words
#paoding.analyzer.dictionaries.compiler=net.paoding.analysis.analyzer.impl.MostWordsModeDictionariesCompiler
#paoding.analyzer.mode=max-word-length
paoding.analyzer.dictionaries.compiler=net.paoding.analysis.analyzer.impl.SortingDictionariesCompiler
删掉.compile文件
未添加自定义词典之前,分词效果如下:
普洱|市|孟连|连县|赴|华南|理工|大|大学|进行|产学研|合作|洽谈|
然后我将“普洱市”和“孟连县”加入自定义词典XXX.dic,分词效果如下:
普洱|普洱市|孟连|连县|孟连县|赴|华南|理工|大|大学|理工大学|华南理工大学|进行|产学研|合作|洽谈|
通过上面结果的对比,可以发现,添加的自定义词都分出来了,满足了我的需求,同时发现,Sort模式是在most模式的基础上,在按照字典中的词,再来一遍分词,所以分词的结果数也多很多。
2. 使用mmseg4j自定义词典
参考文章:http://blog.chenlb.com/2009/04/chinese-segment-mmseg4j-dictionary-format.html#postcomment
在mmseg4j中自定义词典相对简单,目前mmseg4j的词库存放在data目录中,包括 chars.dic、units.dic、words.dic,并且强制使用 UTF-8 编码。
下面一一解说下词库的格式。
1、 chars.dic,是单个字,和对应的频率,一行一对,字在全面,频率在后面,中间用空格分开。这个文件的信息是 complex 模式要用到的。在最后一条过虑规则中使用了频率信息。从 1.5 版后已经把它打包进 jar 里,一般不用关心它。不过可以在词库目录下放一个同名文件覆盖它。
2、 units.dic,是单位的字,如:分、秒、年。这一文件是我在 mmseg4j 1.6 后加入的,也是一行一条。主要是在数字后面的单位信息切分好,不与words.dic中的词有混淆。同时也打包进 jar 里,目前还是试行,如果不喜欢它,可以用空的文件放到词库目录下覆盖它。
3、words.dic,是核心的词库文件,一行一条,不需要其它任何数据(如词长)。1.0 版是用 rmmseg(ruby 的 mmseg 实现) 的词库。1.5版后 mmseg4j 改用 sogou 词库,可以 http://www.sogou.com/labs/dl/w.html 找到下载。然后我把它去了频率等信息,并转为 UTF-8 编码。
4、 wordsXXX.dic,是自定义词库文件(其实是 mmseg4j 可以从多个文件读取词)。这功能是 1.6 版加入的。它的格式与 words.dic 一样,只不过 XXX 部分是如您自己写的名字,如:源码包里的 data/words-my.dic。注意:自定义词库文件名必需是 "words" 为前缀和 ".dic" 为后缀。
mmseg4j 默认从当前目录下的 data 目录读取上面的文件。当然也可以指定别的目录,如:new ComplexAnalyzer("./my_dic")。
所以如果想自己定义词典,直接讲词加到wordsXXX.dic里面即可。如果加了自定义的词,要用 simple 或 complex 分词模式是检验它是否有效。因为目前 max-word 模式分出来的词长不会超过2。
未添加自定义词典之前,分词效果如下:
SimplexAnalyzer分词结果是:普|洱|市|孟|连|县|赴|华南理工大学|进行|产|学|研|合作|洽谈|。
ComplexAnalyzer分词结果是:普|洱|市|孟|连|县|赴|华南理工大学|进行|产|学|研|合作|洽谈|。
MaxWordAnalyzer分词结果是:普|洱|市|孟|连|县|赴|华南|理工|大学|进行|产|学|研|合作|洽谈|。
然后我将“普洱市”和“孟连县”加入自定义词典words-my.dic,分词效果如下:
SimplexAnalyzer分词效果为:普洱市|孟连县|赴|华南理工大学|进行|产|学|研|合作|洽谈|。
ComplexAnalyzer分词效果为:普洱市|孟连县|赴|华南理工大学|进行|产|学|研|合作|洽谈|。
MaxWordAnalyzer分词效果为:普|洱|市|孟|连|县|赴|华南|理工|大学|进行|产|学|研|合作|洽谈|。
3. 使用IK Analyzer自定义词典
IK Analyzer 可以加载扩展停止词典,也可以自定义词典,配置过程也很简单,将自己定义的词写入到文档中,存储为XXX.dic格式,例如ext.dic,放在与stopword.dic同一个目录下,打开IKAnalyzer.cfg.xml,内容如下:
将自定义词典在配置文件里面写入即可。