IKAnalyzer 中文分词器

来源:互联网 发布:淘宝店铺怎么增加粉丝 编辑:程序博客网 时间:2024/04/29 23:03

相关阅读 http://blog.csdn.net/lijun7788/article/details/7719166

1.IK Analyzer 2012介绍

IK Analyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包。从200612月推出1.0版开始,IKAnalyzer已经推出了4个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。从3.0版本开始,IK发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。在2012版本中,IK实现了简单的分词歧义排除算法,标志着IK分词器从单纯的词典分词向模拟语义分词衍化。

1.1 IK Analyzer 2012结构设计

1.2 IK Analyzer 2012特性

  •   采用了特有的“正向迭代最细粒度切分算法“,支持细粒度和智能分词两种切分模式;

  •   在系统环境:Core2 i7 3.4G双核,4G内存,window 7 64位, Sun JDK 1.6_29 64

    位 普通 pc环境测试,IK2012具有160万字/秒(3000KB/S)的高速处理能力。

  •   2012版本的智能分词模式支持简单的分词排歧义处理和数量词合并输出。

  •   采用了多子处理器分析模式,支持:英文字母、数字、中文词汇等分词处理,兼容韩文、

    日文字符

  •   优化的词典存储,更小的内存占用。支持用户词典扩展定义。特别的,在2012版本,

      词典支持中文,英文,数字混合词语。

    1.3 分词效果示例

    IK Analyzer 2012 版本支持细粒度切分智能切分,以下是两种切分方式的演示样例。文本原文1:
    IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从200612月推出1.0版开始,IKAnalyzer已经推出了3个大版本。

    智能分词结果:
    ikanalyzer ||一个|开源||基于| java |语言|开发||轻量级||中文|分词|工具包|| 2006| 12|推出| 1.0|开始| ikanalyzer |已经||出了| 3||版本
    最细粒度分词结果:
    ikanalyzer ||一个|||开源||基于| java |语言|开发||轻量级

|量级||中文|分词|工具包|工具||| 2006 || 12 ||推出| 1.0 ||开始| ikanalyzer |已经|推出|出了| 3 |||版本
文本原文 2:
张三说的确实在理

智能分词结果:
张三|说的|确实|在理
最细粒度分词结果:
张三||说的|的确||确实|实在|在理
文本原文 3
公路局正在治理解放大道路面积水问题
智能分词结果:
公路局|正在|治理|解放|大道|路面|积水|问题
最细粒度分词结果:
公路局|公路|路局|正在|治理|理解|解放|放大|大道|道路|路面|面积|积水|问题
文本原文 4
据路透社报道,印度尼西亚社会事务部一官员星期二(29)表示,日惹市附近当地时间27日晨553分发生的里氏6.2级地震已经造成至少5427人死亡,20000余人受伤,近20万人无家可归。
智能分词结果:
|路透社|报道|印度尼西亚|社会|事务部||官员|星期二|29|表示||||附近|当地时间| 27|| 5| 53|发生||里氏| 6.2|

地震|已经|造成|至少| 5427|死亡| 20000 |余人|受伤|| 20 |万人|无家可归
最细粒度分词结果:
|路透社|路透||报道|印度尼西亚|印度||西亚|社会事务|社会|事务部|事务|||官员|星期二|星期|| 29 ||表示||||附近|当地时间|当地|时间| 27 ||| 5 || 53 |分发||发生||||里氏| 6.2 ||地震|已经|造成|至少| 5427 ||死亡| 20000 |余人|受伤|| 20 |万人|||无家可归

2.使用指南2.1下载地址

GoogleCode 开源项目 :http://code.google.com/p/ik-analyzer/GoogleCode下载:http://code.google.com/p/ik-analyzer/downloads/list

2.2 与相关项目的版本兼容

IK分词器版本

3.1.5GA

3.1.6GA

3.2.x

Lucene版本

兼容2.9.1及先前版本

兼容 2.9.1 及先前版本

兼容Lucene2.93.0版本不支持Lucene2.4及先前

Solr版本

solr1.3提供接口实现

对 solr1.3、solr1.4 提供接口实现

仅对solr1.4提供接口实现

3.1.3GA及先前版

兼容2.9.1及先前版本

没有solr接口

版本

2012

兼容Lucene3.3以上版本

solr1.4提供接口实现

2.3 安装部署

IK Analyzer 安装包包含:

  1. IKAnalyzer中文分词器V2012使用手册》(即本文档)

  2. IKAnalyzer2012.jar(主jar包)

  3. IKAnalyzer.cfg.xml(分词器扩展配置文件)

  4. stopword.dic(停止词典)

  5. LICENSE.TXT ; NOTICE.TXT (apache版权申明)

它的安装部署十分简单,将 IKAnalyzer2012.jar部署于项目的lib目录中;IKAnalyzer.cfg.xmlstopword.dic文件放置在class根目录(对于web项目,通常是WEB-INF/classes目录,同hibernatelog4j等配置文件相同)下即可。

2.4 Lucene 用户快速入门

代码样例

IKAnalyzerDemo

/**

* IK中文分词 版本5.0
* IK Analyzer release 5.0*
*
*
*
*

Licensed to the Apache Software Foundation (ASF) under one or morecontributor license agreements. See the NOTICE file distributed withthis work for additional information regarding copyright ownership.The ASF licenses this file to You under the Apache License, Version

2.0

********** limitations under the License.*

(the "License"); you may not use this file except in compliance withthe License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software

distributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions and

*源代码由林良益(linliangyi2005@gmail.com)提供

*版权声明2012,乌龙茶工作室
* provided by Linliangyi and copyright 2012 by Oolong studio*
*
*/

packageorg.wltea.analyzer.sample;

importjava.io.IOException;

importorg.apache.lucene.analysis.Analyzer;
importorg.apache.lucene.document.Document;
importorg.apache.lucene.document.Field;
importorg.apache.lucene.index.CorruptIndexException;importorg.apache.lucene.index.IndexReader;

importorg.apache.lucene.index.IndexWriter;
importorg.apache.lucene.index.IndexWriterConfig;
importorg.apache.lucene.index.IndexWriterConfig.OpenMode;importorg.apache.lucene.queryParser.ParseException;importorg.apache.lucene.queryParser.QueryParser;
importorg.apache.lucene.search.IndexSearcher;
importorg.apache.lucene.search.Query;
importorg.apache.lucene.search.ScoreDoc;
importorg.apache.lucene.search.TopDocs;
importorg.apache.lucene.store.Directory;

importorg.apache.lucene.store.LockObtainFailedException;importorg.apache.lucene.store.RAMDirectory;
importorg.apache.lucene.util.Version;
importorg.wltea.analyzer.lucene.IKAnalyzer;

/**

* IKAnalyzer示例
* 2012-3-2
*
*
以下是结合Lucene3.4 API的写法*

*/

public classIKAnalyzerDemo {
public static voidmain(String[] args){

//Lucene Document的域名String fieldName = "text";

//检索内容
String text ="IK Analyzer是一个结合词典分词和文法分词的中文分词开源工

具包。它使用了全新的正向迭代最细粒度切分算法。";

//实例化IKAnalyzer分词器
Analyzer analyzer =newIKAnalyzer();

Directory directory =null;IndexWriter iwriter =null;IndexReader ireader =null;IndexSearcher isearcher =null;try{

//建立内存索引对象
directory =newRAMDirectory();

//配置IndexWriterConfig

IndexWriterConfig iwConfig =newIndexWriterConfig(Version.LUCENE_34, analyzer);

iwConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);iwriter = newIndexWriter(directory , iwConfig);//写入索引
Document doc =newDocument();

doc.add(newField("ID","10000", Field.Store.YES,Field.Index.NOT_ANALYZED));

doc.add(newField(fieldName, text, Field.Store.YES,Field.Index.ANALYZED));

iwriter.addDocument(doc);iwriter.close();

//搜索过程**********************************//实例化搜索器
ireader = IndexReader.open(directory);

isearcher = newIndexSearcher(ireader);

String keyword ="中文分词工具包";//使用QueryParser查询分析器构造Query对象
QueryParser qp =newQueryParser(Version.LUCENE_34,

fieldName, analyzer);qp.setDefaultOperator(QueryParser.AND_OPERATOR);Query query = qp.parse(keyword);

//搜索相似度最高的5条记录
TopDocs topDocs = isearcher.search(query , 5);System.out.println("命中:"+ topDocs.totalHits);//输出结果

ScoreDoc[] scoreDocs = topDocs.scoreDocs;for(inti = 0; i < topDocs.totalHits; i++){

Document targetDoc = isearcher.doc(scoreDocs[i].doc);

System.out.println("内容:"+ targetDoc.toString());}

} catch(CorruptIndexException e) {e.printStackTrace();

} catch(LockObtainFailedException e) {e.printStackTrace();

} catch(IOException e) {e.printStackTrace();

} catch(ParseException e) {e.printStackTrace();

} finally{
if(ireader !=null){

try{ireader.close();

} catch(IOException e) {e.printStackTrace();

}}

if(directory !=null){try{

directory.close();
}
catch(IOException e) {

              e.printStackTrace();           }

}}

}

}

执行结果:

命中:1
内容:Document<stored/uncompressed,indexed,tokenized<text:IK Analyzer是一个结合词典分词和文法分词的中文分词开源工具包。它使用了全新的正向迭代最细粒度切分算法。>>

2.5 关键API说明
(注:本文档只列出常用的、主要的API说明,有可能因为版本变更而与实际代码产生不

一致情况,因此最准确的说明请参看Java API DOC)

org.wltea.analyzer.lucene.IKAnalyzer

说明:IK分词器的主类,是IK分词器的Lucene Analyzer类实现。该类使用方法请参考 “代码样例”章节

  •   public IKAnalyzer()

        说明:构造函数,默认实现最细粒度切分算法
  •   public IKAnalyzer(boolean useSmart)

    说明:构造函数参数1:booleanuseSmart,当为true时,分词器采用智能切分 ;当为false时,分词器进行最细粒度切分。

    org.wltea.analyzer.core.IKSegmenter
    说明: 这是 IK分词器的核心类。它是独立于LuceneJava分词器实现。当您需要

Lucene以外的环境中单独使用IK中文分词 组件时,IKSegmenter正是您要找的。public IKSegmenter(Reader input , boolean useSmart)
说明:IK主分词器构造函数
参数
1:Reader input ,字符输入读取

参数 2 : boolean useSmart ,是否采用智能切分策略。true使用智能切分,false使用最细粒度切分。
public IKSegmentation(Reader input , Configuration cfg)
说明:IK主分词器新构造函数

参数 1:Reader input ,字符输入读取
参数
2:Configuration cfg ,分词器配置。用户可以定制自己的Configuration类,来改变词典配置。
public synchronized Lexeme next()throws IOException说明:读取分词器切分出的下一个语义单元,如果返回null,表示分词器已经结束。返回值:Lexeme语义单元对象,即相当于Lucene的词元对象Token

org.wltea.analyzer.core.Lexeme

说明: 这是 IK分词器的语义单元对象,相当于Lucene中的Token词元对象。由于IK被设计为独立于LuceneJava分词器实现,因此它需要Lexeme来代表分词的结果。
public int getBeginPosition()

    说明:获取语义单元的起始字符在文本中的位置

返回值:int, 语义单元相对于文本的绝对起始位置

  •   public int getEndPosition()

        说明:获取语义单元的结束字符的下一个位置

    返回值:int, 语义单元相对于文本的绝对终止位置的下一个字符位置

  •   public int getLength()

        说明:获取语义单元包含字符串的长度

    返回值:int, 语义单元长度= getEndPositiongetBeginPosition

  •   public String getLexemeText()

    说明:获取语义单元包含字符串内容
    返回值:
    String, 语义单元的实际内容,即分词的结果

    2.6 IKQueryPaserIK简单搜索表达式说明

    在 IK2012 版本之前,由于分词器没有处理歧义分词的能力,才使用了 IKQueryParser来解决搜索时的歧义冲突问题。随着 2012 版本的推出,用户已经不再需要使用IKQueryParser 来解决这样的问题。直接使用 Lucene 的 QueryParser 即可。

    3.词表扩展

    目前,IK分词器自带的主词典拥有27万左右的汉语单词量。由于作者个人的精力有限,并没有对搜集到的词库进行全范围的筛选、清理。此外,对于分词组件应用场景所涉及的领域的不同,也需要各类专业词库的支持。为此,IK分词器提供了对词典的扩展支持。

    IK分词器3.1.3以上版本,同时提供了对用户自定义的停止词(过滤词)的扩展支持。

3.1 基于API的词典扩充

IK 分词器支持使用API编程模型扩充您的词典和停止词典。如果您的个性化词典是存储于数据库中,这个方式应该对您适用。API如下:
org.wltea.analyzer.dic.Dictionary

说明: IK分词器的词典对象。它负责中文词汇的加载,内存管理和匹配检索。

  •   public static Dictionary initial(Configuration cfg)

    说明:初始化字典实例。字典采用单例模式,一旦初始化,实例就固定.PS:注意该方法只能调用一次。
    参数 1:Configuration cfg, 词典路径配置
    返回值:
    Dictionary IK 词典单例

  •   public static Dictionary getSingleton()说明:获取初始化完毕的字典单例返回值:Dictionary IK 词典单例

  •   public void addWords(Collection<String> words)说明:加载用户扩展的词汇列表到IK的主词典中,增加分词器的可识别词语。参数1:Collection<String> words, 扩展的词汇列表
    返回值:无

  •   public void disableWords(Collection<String> words)说明:屏蔽词典中的词元
    参数
    1:Collection<String> words, 待删除的词列表返回值:无

3.2 基于配置的词典扩充

IK 分词器还支持通过配置IKAnalyzer.cfg.xml文件来扩充您的专有词典以及停止词典(过滤词典)。

1. 部署IKAnalyzer.cfg.xml
IKAnalyzer.cfg.xml 部署在代码根目录下(对于web项目,通常是

WEB-INF/classes 目录)同hibernatelog4j等配置文件相同。2.词典文件的编辑与部署

分词器的词典文件格式是无 BOMUTF-8编码的中文文本文件,文件扩展名不限。词典中,每个中文词汇独立占一行,使用\r\nDOS方式换行。(注,如果您不了解什么是无BOMUTF-8格式, 请保证您的词典使用UTF-8存储,并在文件的头部添加一空行)。您可以参考分词器源码org.wltea.analyzer.dic包下的.dic文件。

词典文件应部署在 Java的资源路径下,即ClassLoader能够加载的路径中。(推

荐同IKAnalyzer.cfg.xml放在一起)

3. IKAnalyzer.cfg.xml 文件的配置

<?xmlversion="1.0"encoding="UTF-8"?>
<!
DOCTYPEpropertiesSYSTEM"http://java.sun.com/dtd/properties.dtd"><properties>

<comment>IK Analyzer 扩展配置</comment><!--用户可以在这里配置自己的扩展字典--><entrykey="ext_dict">/mydict.dic;

/com/mycompany/dic/mydict2.dic;</entry>

<!--用户可以在这里配置自己的扩展停止词字典-->
<entrykey="ext_stopwords">/ext_stopword.dic</entry>

</properties>在配置文件中,用户可一次配置多个词典文件。文件名使用“;”号分隔。文件路径为

相对 java包的起始根路径。

3.3 使用自定义的Configuration类改变词典配置

IK 分词器使用org.wltea.analyzer.cfg.Configuration接口来提供扩展字典的配置信息,在特定情况下,用户可以根据需要,实现该接口类,定制自己的字典配置。以下是接口方法说明:
org.wltea.analyzer.cfg.Configuration

  •   public String getMainDictionary()说明:获取主字典路径,注意该路径是相对与当前系统类加载器ClassLoader的路径。
    返回值:主字典路径字符串

  •   public String getQuantifierDicionary ()说明:获取量词字典路径,注意该路径是相对与当前系统类加载器ClassLoader的路径。
    返回值:量词典路径字符串

  •   public List<String> getExtDictionarys() ()说明:获取扩展字典路径列表,可一次返回多个扩展词典。注意该路径是相对与当前系统类加载器ClassLoader的路径。
    返回值:扩展典路径字符串列表

  •   public List<String> getExtStopWordDictionarys () ()说明:获取停止词(stopword)字典路径列表,可一次返回多个停止词词典。注意该路径是相对与当前系统类加载器ClassLoader的路径。返回值:停止词词典路径字符串列表

4.针对solr的分词器应用扩展
IK 分词器3.2.0以上版本从API层面提供了对solrBaseTokenizerFactory接口的

扩展实现。

4.1 solr TokenizerFactory接口实现

org.wltea.analyzer.solr.IKTokenizerFactory
说明:该类继承与 solrBaseTokenizerFactory,是IK分词器对solr项目BaseTokenizerFactory接口的扩展实现。属性:useSmart。该属性决定分词器是否采用智能切分。

4.2 solr1.4 配置样例使用IKAnalyzer的配置

<schemaname="example"version="1.1">......

<fieldTypename="text"class="solr.TextField">
<
analyzerclass="org.wltea.analyzer.lucene.IKAnalyzer"/>

  </fieldType>

......

</schema>

使用IKTokenizerFactory的配置

<fieldTypename="text"class="solr.TextField"><analyzertype="index">

<tokenizerclass="org.wltea.analyzer.solr.IKTokenizerFactory"useSmart="false"/>

......

</analyzer>
<
analyzertype="query">

<tokenizerclass="org.wltea.analyzer.solr.IKTokenizerFactory"useSmart="false"/>

......

    </analyzer></fieldType>


0 0
原创粉丝点击