• IK Analyzer 3.0 中文分词器 转载


    http://linliangyi2007.iteye.com/blog/429960


    发布IK Analyzer 3.0 中文分词器

    最新:IKAnalyzer3.2.3稳定版已经发布,支持Lucene3.0和solr1.4
    链接:http://www.iteye.com/topic/667095

    lucene 2.9以前用户请使用 IKAnalyzer V3.1.6GAhttp://linliangyi2007.iteye.com/blog/512577

    IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始, IKAnalyzer已经推出了3个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。新版本的IK Analyzer 3.0则发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。

    1.1 IK Analyzer 3.0结构设计


    1.2 IK Analyzer 3.0特性
    • 采用了特有的“正向迭代最细粒度切分算法“,具有80万字/秒的高速处理能力
    • 采用了多子处理器分析模式,支持:英文字母(IP地址、Email、URL)、数字(日期,常用中文数量词,罗马数字,科学计数法),中文词汇(姓名、地名处理)等分词处理。
    • 优化的词典存储,更小的内存占用。支持用户词典扩展定义
    • 针对Lucene全文检索优化的查询分析器IKQueryParser(作者吐血推荐);采用歧义分析算法优化查询关键字的搜索排列组合,能极大的提高Lucene检索的命中率。


    1.3 分词效果示例

    文本原文1:
    IK-Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始, IKAnalyzer已经推出了3个大版本。
    分词结果:
    ik-analyzer | 是 | 一个 | 一 | 个 | 开源 | 的 | 基于 | java | 语言 | 开发 |  的 | 轻量级 | 量级 | 的 | 中文 | 分词 | 工具包 | 工具 |  从  | 2006 | 年 | 12 | 月 | 推出 | 1.0  | 版 | 开始 | ikanalyzer | 已经 |  推出 | 出了 |  3  |  个大 |  个 | 版本

    文本原文2:
    永和服装饰品有限公司
    分词结果:
    永和 | 和服 | 服装 | 装饰品 | 装饰 | 饰品 | 有限 |  公司

    文本原文3:
    作者博客:linliangyi2007.iteye.com   电子邮件:linliangyi2005@gmail.com
    分词结果:
    作者 | 博客 |  linliangyi2007.iteye.com |  2007 |  电子邮件 |  电子 |  邮件 |  地址 |  linliangyi2005@gmail.com |  2005

    2.使用指南

    2.1下载地址
    GoogleCode开源项目 :http://code.google.com/p/ik-analyzer/
    GoogleCode SVN下载:http://ik-analyzer.googlecode.com/svn/trunk/

    2.2安装部署
    IK Analyzer安装包包含:
    1. 《IKAnalyzer中文分词器V3.0使用手册》(即本文档)
    2. IKAnalyzer3.0GA.jar
    3. IKAnalyzer.cfg.xml
    它的安装部署十分简单,将IKAnalyzer3.0GA.jar部署于项目的lib目录中;IKAnalyzer.cfg.xml文件放置在代 码根目录(对于web项目,通常是WEB-INF/classes目录,同hibernate、log4j等配置文件相同)下即可。


    2.3 Lucene用户快速入门

    代码样例
    Java代码  收藏代码
    1. /** 
    2.  * IK Analyzer Demo 
    3.  * @param args 
    4.  */  
    5. import java.io.IOException;  
    6.   
    7. import org.apache.lucene.analysis.Analyzer;  
    8. import org.apache.lucene.document.Document;  
    9. import org.apache.lucene.document.Field;  
    10. import org.apache.lucene.index.CorruptIndexException;  
    11. import org.apache.lucene.index.IndexWriter;  
    12. import org.apache.lucene.search.IndexSearcher;  
    13. import org.apache.lucene.search.Query;  
    14. import org.apache.lucene.search.ScoreDoc;  
    15. import org.apache.lucene.search.TopDocs;  
    16. import org.apache.lucene.store.Directory;  
    17. import org.apache.lucene.store.LockObtainFailedException;  
    18. import org.apache.lucene.store.RAMDirectory;  
    19. //引用IKAnalyzer3.0的类  
    20. import org.wltea.analyzer.lucene.IKAnalyzer;  
    21. import org.wltea.analyzer.lucene.IKQueryParser;  
    22. import org.wltea.analyzer.lucene.IKSimilarity;  
    23.   
    24. /** 
    25.  * @author linly 
    26.  * 
    27.  */  
    28. public class IKAnalyzerDemo {  
    29.       
    30.     public static void main(String[] args){  
    31.         //Lucene Document的域名  
    32.         String fieldName = "text";  
    33.          //检索内容  
    34.         String text = "IK Analyzer是一个结合词典分词和文法分词的中文分词开源工具包。它使用了全新的正向迭代最细粒度切分算法。";  
    35.           
    36.         //实例化IKAnalyzer分词器  
    37.         Analyzer analyzer = new IKAnalyzer();  
    38.        
    39.           
    40.         Directory directory = null;  
    41.         IndexWriter iwriter = null;  
    42.         IndexSearcher isearcher = null;  
    43.         try {  
    44.             //建立内存索引对象  
    45.             directory = new RAMDirectory();    
    46.             iwriter = new IndexWriter(directory, analyzer, true , IndexWriter.MaxFieldLength.LIMITED);  
    47.             Document doc = new Document();  
    48.             doc.add(new Field(fieldName, text, Field.Store.YES, Field.Index.ANALYZED));  
    49.             iwriter.addDocument(doc);  
    50.             iwriter.close();  
    51.               
    52.             //实例化搜索器     
    53.             isearcher = new IndexSearcher(directory);             
    54.             //在索引器中使用IKSimilarity相似度评估器  
    55.             isearcher.setSimilarity(new IKSimilarity());  
    56.               
    57.             String keyword = "中文分词工具包";  
    58.               
    59.             //使用IKQueryParser查询分析器构造Query对象  
    60.             Query query = IKQueryParser.parse(fieldName, keyword);  
    61.               
    62.             //搜索相似度最高的5条记录  
    63.             TopDocs topDocs = isearcher.search(query , 5);  
    64.             System.out.println("命中:" + topDocs.totalHits);  
    65.             //输出结果  
    66.             ScoreDoc[] scoreDocs = topDocs.scoreDocs;  
    67.             for (int i = 0; i < topDocs.totalHits; i++){  
    68.                 Document targetDoc = isearcher.doc(scoreDocs[i].doc);  
    69.                 System.out.println("内容:" + targetDoc.toString());  
    70.             }             
    71.               
    72.         } catch (CorruptIndexException e) {  
    73.             e.printStackTrace();  
    74.         } catch (LockObtainFailedException e) {  
    75.             e.printStackTrace();  
    76.         } catch (IOException e) {  
    77.             e.printStackTrace();  
    78.         } finally{  
    79.             if(isearcher != null){  
    80.                 try {  
    81.                     isearcher.close();  
    82.                 } catch (IOException e) {  
    83.                     e.printStackTrace();  
    84.                 }  
    85.             }  
    86.             if(directory != null){  
    87.                 try {  
    88.                     directory.close();  
    89.                 } catch (IOException e) {  
    90.                     e.printStackTrace();  
    91.                 }  
    92.             }  
    93.         }  
    94.     }  
    95. }  

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



    2.4 关键API说明

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

     类org.wltea.analyzer.lucene.IKQueryParser
     public static Query parse(String field , String query) throws IOException
    说明:单条件,单Field查询分析
    参数1 :String field,  查询的目标域名称
    参数2 :String query , 查询的关键字
    返回值:构造一个单条件,单Field查询器

     public static Query parseMultiField(String[] fields , String query) throws IOException
    说明:多Field,单条件查询分析
    参数1 :String[] fields,  多个查询的目标域名称的数组
    参数2 :String query , 查询的关键字
    返回值:构造一个多Field,单条件的查询器

     public static Query parseMultiField(String[] fields , String query ,  BooleanClause.Occur[] flags) throws IOException
    说明:多Field,单条件,多Occur查询分析
    参数1 :String[] fields,  多个查询的目标域名称的数组
    参数2 :String query , 查询的关键字
    参数3 :BooleanClause.Occur[] flags , 查询条件的组合方式(Or/And)
    返回值:构造一个多Field,单条件,多Occur的查询器

     public static Query parseMultiField(String[] fields , String[] queries) throws IOException
    说明:多Field,多条件查询分析
    参数1 :String[] fields,  多个查询的目标域名称的数组
    参数2 :String[] queries , 对应多个查询域的关键字数组
    返回值:构造一个多Field,多条件的查询器

     public static Query parseMultiField(String[] fields , String[] queries , BooleanClause.Occur[] flags) throws IOException
    说明:多Field,多条件,多Occur查询
    参数1 :String[] fields,  多个查询的目标域名称的数组
    参数2 :String[] queries , 对应多个查询域的关键字数组
    参数3 :BooleanClause.Occur[] flags , 查询条件的组合方式(Or/And)
    返回值:构造一个多Field, 多条件, 多Occur的查询器

     类org.wltea.analyzer.lucene.IKSimilarity
    说明: IKAnalyzer 的相似度评估器。该类重载了DefaultSimilarity的coord方法,提高词元命中个数在相似度比较中的权重影响,即,当有多个词元得到匹配时,文档的相似度将提高。
    该类使用方法请参考 “代码样例”章节

     类org.wltea.analyzer.IKSegmentation
    说明: 这是IK分词器的核心类。它是真正意义上的分词器实现。IKAnalyzer的3.0版本有别于之前的版本,它是一个可以独立于Lucene的Java分 词器实现。当您需要在Lucene以外的环境中单独使用IK中文分词 组件时,IKSegmentation正是您要找的。
     public Lexeme next() throws IOException
    说明:读取分词器切分出的下一个语义单元,如果返回null,表示分词器已经结束。
    返回值:Lexeme 语义单元对象,即相当于Lucene的词元对象Token

     类org.wltea.analyzer.Lexeme
    说明: 这是IK分词器的语义单元对象,相当于Lucene中的Token词元对象。由于3.0版本被设计为独立于Lucene的Java分词器实现,因此它需要Lexeme来代表分词的结果。
     public int getBeginPosition()
    说明:获取语义单元的起始字符在文本中的位置
    返回值:int , 语义单元相对于文本的绝对起始位置

     public int getEndPosition()
    说明:获取语义单元的结束字符的下一个位置
    返回值:int , 语义单元相对于文本的绝对终止位置的下一个字符位置

     public int getLength()
    说明:获取语义单元包含字符串的长度
    返回值:int , 语义单元长度 = getEndPosition – getBeginPosition

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


    3.词表扩展

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

    基于API的词典扩充
    IK分词器支持使用API编程模型扩充您的词典。如果您的词典是存储与数据库中,这个方式应该对您适用。API如下:

     类org.wltea.analyzer.dic.Dictionary
    说明: IK分词器的词典对象。它负责中文词汇的加载,内存管理和匹配检索。
     public static void loadExtendWords(List<String> extWords)
    说明:加载用户扩展的词汇列表到IK的主词典中,增加分词器的可识别词语。
    参数1:List<String> extWords , 扩展的词汇列表
    返回值:无

    3.2基于配置的词典扩充
    IK分词器还支持通过配置IKAnalyzer.cfg.xml文件来扩充您的专有词典。

    1. 部署IKAnalyzer.cfg.xml
    IKAnalyzer.cfg.xml部署在代码根目录下(对于web项目,通常是WEB-INF/classes目录)同hibernate、log4j等配置文件相同。

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

    词典文件应部署在Java的资源路径下,即ClassLoader能够加载的路径中。(推荐同IKAnalyzer.cfg.xml放在一起)


    3. IKAnalyzer.cfg.xml文件的配置
    Xml代码  收藏代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">    
    3. <properties>    
    4.     <comment>IK Analyzer 扩展配置</comment>  
    5.     <!--用户可以在这里配置自己的扩展字典-->  
    6.     <entry key="ext_dict">/mydict.dic ; /mypack/mydict2.dic ; /com/mycompany/dic/mydict3.dic ;</entry>   
    7. </properties>  

    在配置文件中,用户可一次配置多个词典文件。文件名使用“;”号分隔。文件路径为相对java包的起始根路径。

    (全文终)


    下载 :IKAnalyzer3.1.1稳定版完整包.rar

    更多详细请参看《IKAnalyzer中文分词器V3.1.1使用手册.pdf》

  • 相关阅读:
    Java基本类型和引用类型 分类: Java 2015-08-04 14:51 6人阅读 评论(0) 收藏
    串口通信校验方式(even,odd,space,mark) 分类: 开发工具 2015-07-31 16:01 5人阅读 评论(0) 收藏
    学习SerialPort的笔记 分类: 开发工具 2015-07-31 15:51 5人阅读 评论(0) 收藏
    Java操作串口 分类: Java 2015-07-30 23:18 11人阅读 评论(0) 收藏
    JAVA Swt初识 分类: Java 2015-07-30 10:51 22人阅读 评论(0) 收藏
    用Java Swing编写简单的测试小工具界面(源码) 分类: Java 2015-07-30 10:49 23人阅读 评论(0) 收藏
    Java串口助手(程序源码) 分类: Java 2015-07-30 10:13 16人阅读 评论(0) 收藏
    Android使用蓝牙与PC端进行通信 分类: Android 2015-07-30 09:45 15人阅读 评论(0) 收藏
    Android当无线鼠标,通过蓝牙与pc通信,pc端用java写 分类: Android 2015-07-30 09:24 18人阅读 评论(0) 收藏
    Struts2注解
  • 原文地址:https://www.cnblogs.com/lexus/p/2195532.html
Copyright © 2020-2023  润新知