欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

为全文检索方案更新词库

程序员文章站 2022-05-17 18:58:42
...

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

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

目前对中文分词比较好的插件主要有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|日|人民日报|人民日|人民|日报|十八大|十八|八大|特刊|刊发|激发|中国|前行|最大|大力|力量|一文|一|文|文中|写道|市场经济|市场|经济|冲击|余波|未了|全球化|全球|化|*化|*|化|信息化|信息|化|浪潮|又不|不期|叠加|分配|焦虑|环境|恐慌|拼爹|时代|屌丝|心态|极端|事件|群体|*|百姓|百|姓|社会|市场|*|关系|进入|敏感期|敏感|期|

 

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