为全文检索方案更新词库
在全文检索应用中,为了提高检索的准确性,我们时常需要定期去更新分词库,以
保证各种网络用语、火文(如“屌丝”、“高帅富”,“美富白”),能正确的被识别。
目前对中文分词比较好的插件主要有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|日|人民日报|人民日|人民|日报|十八大|十八|八大|特刊|刊发|激发|中国|前行|最大|大力|力量|一文|一|文|文中|写道|市场经济|市场|经济|冲击|余波|未了|全球化|全球|化|*化|*|化|信息化|信息|化|浪潮|又不|不期|叠加|分配|焦虑|环境|恐慌|拼爹|时代|屌丝|心态|极端|事件|群体|*|百姓|百|姓|社会|市场|*|关系|进入|敏感期|敏感|期|
开发人员可以根据自己项目的情况酌情处理。