为全文检索方案更新词库

exitzhang 2013-01-11

在全文检索应用中,为了提高检索的准确性,我们时常需要定期去更新分词库,以

保证各种网络用语、火文(如“屌丝”、“高帅富”,“美富白”),能正确的被识别。

目前对中文分词比较好的插件主要有ik-analyzer、mmseg、庖丁等。ik是目前使用比较广泛,而且作者刚对其进行了更新,目前已经能支持简单的分词歧义排除算法,详细情况请参见ik的开发网站。本文将以ik来测试新添加的分词。

下面我们开始更新词库:

1.从http://pinyin.sogou.com/dict/下载选择scel格式的细胞词库

2.下载深蓝词库转换工具,将scel词库转化为无拼音纯汉字格式的txt文件

3.用ultraedit将txt文件保存为无bomutf-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>IKAnalyzer扩展配置</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|日|人民日报|人民日|人民|日报|十八大|十八|八大|特刊|刊发|激发|中国|前行|最大|大力|力量|一文|一|文|文中|写道|市场经济|市场|经济|冲击|余波|未了|全球化|全球|化|民主化|民主|化|信息化|信息|化|浪潮|又不|不期|叠加|分配|焦虑|环境|恐慌|拼爹|时代|屌丝|心态|极端|事件|群体|抗议|百姓|百|姓|社会|市场|政府|关系|进入|敏感期|敏感|期|

开发人员可以根据自己项目的情况酌情处理。

相关推荐