在全文检索应用中,为了提高检索的准确性,我们时常需要定期去更新分词库,以
保证各种网络用语、火文(如“屌丝”、“高帅富”,“美富白”),能正确的被识别。
目前对中文分词比较好的插件主要有ik-analyzer、mmseg、庖丁等。ik是目前使用比较广泛,而且作者刚对其进行了更新,目前已经能支持简单的分词歧义排除算法,详细情况请参见ik的开发网站。本文将以ik来测试新添加的分词。
下面我们开始更新词库:
1.从http://pinyin.sogou.com/dict/下载选择scel格式的细胞词库
2.下载深蓝词库转换工具,将scel词库转化为无拼音纯汉字格式的txt文件
3.用ultraedit将txt文件保存为无bom utf-8格式的文本
这样我们已经将词库准备完毕了,接下来我们用ik来测试新词库的准确性。
首先在ik网站上下载IKAnalyzer2012_u6.zip文件,需要说明的是u6是支持lucene3.6的,IKAnalyzer 2012FF_hf1.zip 是支持lucene4的。
1.创建一个app java工程。
2.创建一个java类ParticipleTest,并加入IKAnalyzer2012_u6.jar、lucene-core-3.6.2.jar两个jar包。
- import java.io.IOException;
- import java.io.StringReader;
- import org.apache.lucene.analysis.Analyzer;
- import org.apache.lucene.analysis.TokenStream;
- import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
- import org.wltea.analyzer.lucene.IKAnalyzer;
- public class ParticipleTest {
- /**
- * @param args
- * @throws IOException
- */
- public static void main(String[] args) throws IOException {
- // TODO Auto-generated method stub
- String keyWord = "11月3日,《人民日报》十八大特刊刊发《激发中国前行的最大力量》一文,文中写道:“市场经济的冲击余波未了,全球化、民主化、信息化的浪潮又不期叠加。分配焦虑、环境恐慌,拼爹时代、屌丝心态,极端事件、" +
- "群体抗议,百姓、社会、市场、政府的关系进入‘敏感期’。”";
- IKAnalyzer analyzer = new IKAnalyzer();
- //使用智能分词
- analyzer.setUseSmart(true);
- //打印分词结果
- printAnalysisResult(analyzer,keyWord);
- }
- /**
- * 打印出给定分词器的分词结果
- * @param analyzer 分词器
- * @param keyWord 关键词
- * @throws Exception
- */
- private static void printAnalysisResult(Analyzer analyzer, String keyWord) {
- System.out.println("当前使用的分词器:" + analyzer.getClass().getSimpleName());
- TokenStream tokenStream = analyzer.tokenStream("content", new StringReader(keyWord));
- tokenStream.addAttribute(CharTermAttribute.class);
- StringBuffer buffer=new StringBuffer();
- try {
- while (tokenStream.incrementToken()) {
- CharTermAttribute charTermAttribute = tokenStream.getAttribute(CharTermAttribute.class);
- buffer.append(charTermAttribute.toString()).append("|");
- }
- System.out.println(buffer.toString());
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
3.将IKAnalyzer.cfg.xml、chinese_stopword.dic、stopword.dic、myext.dic放到src目录中。
4.修改IKAnalyzer.cfg.xml文件:
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典-->
<entry key="ext_dict">myext.dic;</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">stopword.dic;chinese_stopword.dic</entry>
</properties>
4.在myext.dic中添加“屌丝”,如下
屌丝
拼爹
5.运行结果比对
未更新词库的情况下:
11月|3日|人民日报|十|八大|特刊|刊发|激发|中国|前行|最大|力量|一文|文中|写道|市场经济|冲击|余波|未了|全球化|民主化|信息化|浪潮|又|不期|叠加|分配|焦虑|环境|恐慌|拼|爹|时代|屌|丝|心态|极端|事件|群体|抗议|百姓|社会|市场|政府|关系|进入|敏感期|
更新完词库后:
11月|3日|人民日报|十八大|特刊|刊发|激发|中国|前行|最大|力量|一文|文中|写道|市场经济|冲击|余波|未了|全球化|民主化|信息化|浪潮|又|不期|叠加|分配|焦虑|环境|恐慌|拼爹|时代|屌丝|心态|极端|事件|群体|抗议|百姓|社会|市场|政府|关系|进入|敏感期|
这说明我们更新的词库已经起作用了。
另外需要说明的是,
//使用智能分词
analyzer.setUseSmart(true);
如果值为false的情况下是最细粒分词
运行结果如下:
11|月|3|日|人民日报|人民日|人民|日报|十八大|十八|八大|特刊|刊发|激发|中国|前行|最大|大力|力量|一文|一|文|文中|写道|市场经济|市场|经济|冲击|余波|未了|全球化|全球|化|民主化|民主|化|信息化|信息|化|浪潮|又不|不期|叠加|分配|焦虑|环境|恐慌|拼爹|时代|屌丝|心态|极端|事件|群体|抗议|百姓|百|姓|社会|市场|政府|关系|进入|敏感期|敏感|期|
开发人员可以根据自己项目的情况酌情处理。