IKAnalyzer 分词

IK Analyzer 3.0特性

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

IK 分词算法理解

根据官方说法 IK 分词器采用"正向迭代最细粒度切分算法", 分析它的源代码,可以看到分词工具类 IKQueryParser 起至关重要的作用, 它对搜索关键词采用从最大词到最小词层层迭代检索方式切分。

比如搜索词:"人民大会堂",

若按最大词长切分,到词库中检索该搜索词中最大分割词, 即分割为:"人民大会堂"。

若按最细粒度切分,首先到词库中检索该搜索词中最大分割词, 即分割为:"人民大会堂",然后对"人民大会堂"切分为"人民大会"和"大会堂",以此类推。最后,"人民大会堂"切分为:"人民大会堂|人民大会|人民|民大|大会堂|大会|会堂"。

package org.apache.lucene.demo;

import java.io.StringReader;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Util {

    static final Logger logger = LoggerFactory.getLogger(Util.class);

    /**
     * 分词器分词
     *
     * @param text
     * @param analyzer
     * @throws Exception
     */
    private static String token(String text, boolean isMaxWordLength)
            throws Exception {
        try {
            java.util.List<String> list = new java.util.ArrayList<String>();
            org.wltea.analyzer.IKSegmentation ikSegmenter = new org.wltea.analyzer.IKSegmentation(new StringReader(text), isMaxWordLength);
            org.wltea.analyzer.Lexeme lexeme;
            while ((lexeme = ikSegmenter.next()) != null) {
                list.add(lexeme.getLexemeText());
            }
            return StringUtils.join(list, "|");
        } catch (Exception e) {
            throw e;
        }
    }

    public static void main(String[] args) throws Exception {
        String text = "希腊晋级16强不要奖金要基地 称是为人民而战 人民大会堂";
        // String text = "希腊总理:相信希腊人民希望留在欧元区";

        System.out.println(token(text, false));
        System.out.println(token(text, true));

    }
}

分词结果是:

希腊|晋级|16|强不|奖金|金|基地|称是|是为|为人民|为人|人民|民而|而战|人民大会堂|人民大会|人民|民大|大会堂|大会|会堂
希腊|晋级|16|强不|奖金|基地|称是|是为|为人民|民而|而战|人民大会堂

附录:IK分词处理过程

IK<IKAnalyzer-3.2.8>的整个分词处理过程首先,介绍一下IK的整个分词处理过程:

1. Lucene的分词基类是Analyzer,所以IK提供了Analyzer的一个实现类IKAnalyzer。首先,我们要实例化一个IKAnalyzer,它有一个构造方法接收一个参数isMaxWordLength,这个参数是标识IK是否采用最大词长分词,还是采用最细粒度切分两种分词算法。实际两种算法的实现,最大词长切分是对最细粒度切分的一种后续处理,是对最细粒度切分结果的过滤,选择出最长的分词结果。

2. IKAnalyzer类重写了Analyzer的tokenStream方法,这个方法接收两个参数,field name和输入流reader,其中filed name是Lucene的属性列,是对文本内容进行过分词处理和创建索引之后,索引对应的一个名称,类似数据库的列名。因为IK仅仅涉及分词处理,所以对field name没有进行任何处理,所以此处不做任何讨论。

3. tokenStream方法在Lucene对文本输入流reader进行分词处理时被调用,在IKAnalyzer的tokenStream方法里面仅仅实例化了一个IKTokenizer类,该类继承了Lucene的Tokenizer类。并重写了incrementToken方法,该方法的作用是处理文本输入流生成token,也就是Lucene的最小词元term,在IK里面叫做Lexeme。

4. 在IKtokenizer的构造方法里面实例化了IK里面最终要的分词类IKSegmentation,也称为主分词器。它的构造方法接收两个参数,reader和isMaxWordLength。

5. IKsegmentation的构造方法里面,主要做了三个工作,创建上下文对象Context,加载词典,创建子分词器。

6. Contex主要是存储分词结果集和记录分词处理的游标位置。

7. 词典是作为一个单例被创建的,主要有量词词典、主词典和停词词典。词典是被存储在字典片段类DictSegment 这个字典核心类里面的。DictSegment有一个静态的存储结构charMap,是公共词典表,用来存储所有汉字,key和value都是一个中文汉字,目前IK里面的charMap大概有7100多的键值对。另外,DictSegment还有两个最重要的数据结构,是用来存储字典树的,一个是DictSegment的数组childrenArray,另一个是key为单个汉字(每个词条的第一个汉字),value是DictSegment的HashMap childrenMap。这两个数据结构二者取其一,用来存储字典树。

8. 子分词器才是真正的分词类,IK里面有三个子分词器,量词分词器,CJK分词器(处理中文),停词分词器。主分词器IKSegmentation遍历这三个分词器对文本输入流进行分词处理。

9. IKTokenizer的incrementToken方法调用了IKSegmentation的next方法,next的作用是获得下一个分词结果。next在第一次被调用的时候,需要加载文本输入流,并将其读入buffer,此时便遍历子分词器,对buffer种的文本内容进行分词处理,然后把分词结果添加到context的lexemeSet中。

关键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, 语义单元的实际内容,即分词的结果

参考:

http://www.cnblogs.com/dennisit/archive/2013/04/07/3005847.html

http://interview.group.iteye.com/group/wiki/1899-ik-analyzer

IKAnalyzer 分词

时间: 2024-10-15 17:41:36

IKAnalyzer 分词的相关文章

Lucene使用IKAnalyzer分词实例 及 IKAnalyzer扩展词库

文章转载自:http://www.cnblogs.com/dennisit/archive/2013/04/07/3005847.html 方案一: 基于配置的词典扩充 项目结构图如下: IK分词器还支持通过配置IKAnalyzer.cfg.xml文件来扩充您的专有词典.谷歌拼音词库下载: http://ishare.iask.sina.com.cn/f/14446921.html?from=like在web项目的src目录下创建IKAnalyzer.cfg.xml文件,内容如下 <?xml v

Solr配置Ikanalyzer分词器

上一篇文章讲解在win系统中如何安装solr并创建一个名为test_core的Core,接下为text_core配置Ikanalyzer 分词器 1.打开text_core的instanceDir目录,并进入conf文件夹: 2.修改managed-schema文件,在里边添加如下配置: <fieldType name="text_ik" class="solr.TextField"> <analyzer type="index"

IKAnalyzer 分词流程粗览

没有开头语我会死啊~好的,IK是啥.怎么用相信看这篇文章的人都不需要我过多解释了,我也解释不好.下面开始正文: IK的官方结构图: 从上至下的来看: 最上层是我们不需要过度关心的,它们是一些Adapter供Lucene调用. IK Segmentation对应的主类应该是IKSegmenter,是IK工作的核心组件.提供了分词流程的控制. 词元处理子单元:多个不同算法的词元分词器,实现了对不同类型词元的识别. 词典:主要是给CJKSegmenter提供中文词识别能力的Dictionary封装,词

solr.Net课程三 solr5.5 IKAnalyzer分词配置

在使用IK之前同样也需要下载IK的jar包请点击下载,接下来我们对下载的文件进行配置 第一步:先将IKAnalyzer2012FF_u2.jar文件复制到tomcat目录webapps\solr5.5\WEB-INF\lib下 第二步:将IKAnalyzer.cfg.xml和stopword.dic复制到tomcat目录webapps\solr5.5\WEB-INF\classes下 第三步:修改D:\solr5.5\collection1\conf目录下managed-schema文件,在文件

IKanalyzer分词器分词并且统计词频

<dependency> <groupId>com.janeluo</groupId> <artifactId>ikanalyzer</artifactId> <version>2012_u6</version> </dependency> 首先引入 ikanalyzer相关jar包 /** * @Description: * @Author: lizhang * @CreateDate: 2018/7/31

Lucene使用IKAnalyzer分词

1.分析器    所有分析器最终继承的类都是Analyzer        1.1 默认标准分析器:StandardAnalyzer            在我们创建索引的时候,我们使用到了IndexWriterConfig对象,在我们创建索引的过程当中,会经历分析文档的步骤,就是分词的步骤,默认采用的标准分析器自动分词                                    1.1.1 查看分析器的分析效果 public static void main(String[] arg

IKAnalyzer分词工具不能处理完所有数据,中途中断

不知道为什么,本来1万条的数据在进行分词时候,只分了8千就结束了.试了另一批数据2万条的数据,可以完全分完. 后来把jar包的版本更换掉:将2013版的换成2012_u6版的,就可以正确分词了. 在进行更换jar包时,注意将无用的jar包Remove掉,否则会出现项目文件夹上面出现红色感叹号的情况! 2012jar包下载地址:http://lxw1234.com/archives/2015/07/422.htm 原文地址:https://www.cnblogs.com/slhs/p/907928

Solr6.5配置中文分词IKAnalyzer和拼音分词pinyinAnalyzer (二)

之前在 Solr6.5在Centos6上的安装与配置 (一) 一文中介绍了solr6.5的安装.这篇文章主要介绍创建Solr的Core并配置中文IKAnalyzer分词和拼音检索. 一.创建Core: 1.首先在solrhome(solrhome的路径和配置见Solr6.5在Centos6上的安装与配置 (一)中solr的web.xml)中创建mycore目录; [[email protected] down]# [[email protected] down]# mkdir /down/apa

Lucene使用IKAnalyzer中文分词笔记

本文主要讲解IKAnalyzer(以下简称'IK')在Lucene中的具体使用,关于Lucene和IK分词器的背景及其作用在这里就不再熬述.不得不感叹下Lucene版本变更的快速,如今最新已经到了4.9.0,相信任何技术的发展壮大都不可避免有这一过程.本文使用的是Lucene4.0,IKAnalyzer使用的是2012FF版. Lucene下载请移步官网,IK下载地址如下: http://code.google.com/p/ik-analyzer/downloads/list IK下载完成够拷贝