Lucene 3.6.2入门(4) 中文分词器

package com.jadyer.lucene;  

import java.io.IOException;
import java.io.StringReader;  

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.SimpleAnalyzer;
import org.apache.lucene.analysis.StopAnalyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.WhitespaceAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
import org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute;
import org.apache.lucene.analysis.tokenattributes.TypeAttribute;
import org.apache.lucene.util.Version;  

import com.chenlb.mmseg4j.analysis.ComplexAnalyzer;
import com.chenlb.mmseg4j.analysis.MMSegAnalyzer;  

/**
 * 【Lucene3.6.2入门系列】第04节_中文分词器
 * @see ---------------------------------------------------------------------------------------

--------------------------------
 * @see Lucene3.5推荐的四大分词

器:SimpleAnalyzer,StopAnalyzer,WhitespaceAnalyzer,StandardAnalyzer
 * @see 这四大分词器有一个共同的抽象父类,此类有个方法public final TokenStream tokenStream(),即分

词的一个流
 * @see 假设有这样的文本"how are you thank you",实际它是以一个java.io.Reader传进分词器中
 * @see Lucene分词器处理完毕后,会把整个分词转换为TokenStream,这个TokenStream中就保存所有的分词信

息
 * @see TokenStream有两个实现类,分别为Tokenizer和TokenFilter
 * @see Tokenizer---->用于将一组数据划分为独立的语汇单元(即一个一个的单词)
 * @see TokenFilter-->过滤语汇单元
 * @see ---------------------------------------------------------------------------------------

--------------------------------
 * @see 分词流程
 * @see 1)将一组数据流java.io.Reader交给Tokenizer,由其将数据转换为一个个的语汇单元
 * @see 2)通过大量的TokenFilter对已经分好词的数据进行过滤操作,最后产生TokenStream
 * @see 3)通过TokenStream完成索引的存储
 * @see ---------------------------------------------------------------------------------------

--------------------------------
 * @see Tokenizer的一些子类
 * @see KeywordTokenizer-----不分词,传什么就索引什么
 * @see StandardTokenizer----标准分词,它有一些较智能的分词操作,诸如将'jadyer@yeah.net'中

的'yeah.net'当作一个分词流
 * @see CharTokenizer--------针对字符进行控制的,它还有两个子类WhitespaceTokenizer和

LetterTokenizer
 * @see WhitespaceTokenizer--使用空格进行分词,诸如将'Thank you,I am jadyer'会被分为4个词
 * @see LetterTokenizer------基于文本单词的分词,它会根据标点符号来分词,诸如将'Thank you,I am 

jadyer'会被分为5个词
 * @see LowerCaseTokenizer---它是LetterTokenizer的子类,它会将数据转为小写并分词
 * @see ---------------------------------------------------------------------------------------

--------------------------------
 * @see TokenFilter的一些子类
 * @see StopFilter--------它会停用一些语汇单元
 * @see LowerCaseFilter---将数据转换为小写
 * @see StandardFilter----对标准输出流做一些控制
 * @see PorterStemFilter--还原一些数据,比如将coming还原为come,将countries还原为country
 * @see ---------------------------------------------------------------------------------------

--------------------------------
 * @see eg:'how are you thank you'会被分词为'how','are','you','thank','you'合计5个语汇单元
 * @see 那么应该保存什么东西,才能使以后在需要还原数据时保证正确的还原呢???其实主要保存三个东西,

如下所示
 * @see CharTermAttribute(Lucene3.5以前叫

TermAttribute),OffsetAttribute,PositionIncrementAttribute
 * @see 1)CharTermAttribute-----------保存相应的词汇,这里保存的就

是'how','are','you','thank','you'
 * @see 2)OffsetAttribute-------------保存各词汇之间的偏移量(大致理解为顺序),比如'how'的首尾字母

偏移量为0和3,'are'为4和7,'thank'为12和17
 * @see 3)PositionIncrementAttribute--保存词与词之间的位置增量,比如'how'和'are'增量为

1,'are'和'you'之间的也是1,'you'和'thank'的也是1
 * @see                               但假设'are'是停用词(StopFilter的效果),那么'how'和'you'之间

的位置增量就变成了2
 * @see 当我们查找某一个元素时,Lucene会先通过位置增量来取这个元素,但如果两个词的位置增量相同,会

发生什么情况呢
 * @see 假设还有一个单词'this',它的位置增量和'how'是相同的,那么当我们在界面中搜索'this'时
 * @see 也会搜到'how are you thank you',这样就可以有效的做同义词了,目前非常流行的一个叫做WordNet

的东西,就可以做同义词的搜索
 * @see ---------------------------------------------------------------------------------------

--------------------------------
 * @see 中文分词器
 * @see Lucene默认提供的众多分词器完全不适用中文
 * @see 1)Paoding--庖丁解牛分词器,官网为http://code.google.com/p/paoding(貌似已托管在

http://git.oschina.net/zhzhenqin/paoding-analysis)
 * @see 2)MMSeg4j--据说它使用的是搜狗的词库,官网为https://code.google.com/p/mmseg4j(另外还有一个

https://code.google.com/p/jcseg)
 * @ses 3)IK-------https://code.google.com/p/ik-analyzer/
 * @see ---------------------------------------------------------------------------------------

--------------------------------
 * @see MMSeg4j的使用
 * @see 1)下载mmseg4j-1.8.5.zip并引入mmseg4j-all-1.8.5-with-dic.jar
 * @see 2)在需要指定分词器的位置编写new MMSegAnalyzer()即可
 * @see 注1)由于使用的mmseg4j-all-1.8.5-with-dic.jar中已自带了词典,故直接new MMSegAnalyzer()即可
 * @see 注2)若引入的是mmseg4j-all-1.8.5.jar,则应指明词典目录,如new MMSegAnalyzer

("D:\\Develop\\mmseg4j-1.8.5\\data")
 * @see     但若非要使用new MMSegAnalyzer(),则要将mmseg4j-1.8.5.zip自带的data目录拷入classpath下

即可
 * @see 总结:直接引入mmseg4j-all-1.8.5-with-dic.jar就行了
 * @see ---------------------------------------------------------------------------------------

--------------------------------
 * @create Aug 2, 2013 5:30:45 PM
 * @author 玄玉<http://blog.csdn.net/jadyer>
 */
public class HelloChineseAnalyzer {
    /**
     * 查看分词信息
     * @see TokenStream还有两个属性,分别为FlagsAttribute和PayloadAttribute,都是开发时用的
     * @see FlagsAttribute----标注位属性
     * @see PayloadAttribute--做负载的属性,用来检测是否已超过负载,超过则可以决定是否停止搜索等等
     * @param txt        待分词的字符串
     * @param analyzer   所使用的分词器
     * @param displayAll 是否显示所有的分词信息
     */
    public static void displayTokenInfo(String txt, Analyzer analyzer, boolean displayAll){
        //第一个参数没有任何意义,可以随便传一个值,它只是为了显示分词
        //这里就是使用指定的分词器将'txt'分词,分词后会产生一个TokenStream(可将分词后的每个单词理

解为一个Token)
        TokenStream stream = analyzer.tokenStream("此参数无意义", new StringReader(txt));
        //用于查看每一个语汇单元的信息,即分词的每一个元素
        //这里创建的属性会被添加到TokenStream流中,并随着TokenStream而增加(此属性就是用来装载每个

Token的,即分词后的每个单词)
        //当调用TokenStream.incrementToken()时,就会指向到这个单词流中的第一个单词,即此属性代表的

就是分词后的第一个单词
        //可以形象的理解成一只碗,用来盛放TokenStream中每个单词的碗,每调用一次incrementToken()后,

这个碗就会盛放流中的下一个单词
        CharTermAttribute cta = stream.addAttribute(CharTermAttribute.class);
        //用于查看位置增量(指的是语汇单元之间的距离,可理解为元素与元素之间的空格,即间隔的单元数) 

        PositionIncrementAttribute pia = stream.addAttribute(PositionIncrementAttribute.class);
        //用于查看每个语汇单元的偏移量
        // http://www.bianceng.cn
        OffsetAttribute oa = stream.addAttribute(OffsetAttribute.class);
        //用于查看使用的分词器的类型信息
        TypeAttribute ta = stream.addAttribute(TypeAttribute.class);
        try {
            if(displayAll){
                //等价于while(stream.incrementToken())
                for(; stream.incrementToken() ;){
                    System.out.println(ta.type() + " " + pia.getPositionIncrement() + " 

["+oa.startOffset()+"-"+oa.endOffset()+"] ["+cta+"]");
                }
            }else{
                System.out.println();
                while(stream.incrementToken()){
                    System.out.print("[" + cta + "]");
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }  

    /**
     * 测试一下中文分词的效果
     * @author 玄玉<http://blog.csdn.net/jadyer>
     */
    public static void main(String[] args) {
        String txt = "我来自中国黑龙江省哈尔滨市巴彦县兴隆镇";
        displayTokenInfo(txt, new StandardAnalyzer(Version.LUCENE_36), false);
        displayTokenInfo(txt, new StopAnalyzer(Version.LUCENE_36), false);
        displayTokenInfo(txt, new SimpleAnalyzer(Version.LUCENE_36), false);
        displayTokenInfo(txt, new WhitespaceAnalyzer(Version.LUCENE_36), false);
        displayTokenInfo(txt, new MMSegAnalyzer(), false); //等价于new 

com.chenlb.mmseg4j.analysis.MaxWordAnalyzer()
        displayTokenInfo(txt, new com.chenlb.mmseg4j.analysis.SimpleAnalyzer(), false);
        displayTokenInfo(txt, new ComplexAnalyzer(), false);
    }
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索lucene
, 分词
, 分词器
, 单词
, import
, ik analyzer分词器
, 中科院分词器
, mmseg4j
, classifier paoding
, jcseg java 中文分词
, incrementtoken
, tokenstream
, 一个
see
lucene 中文分词、lucene 中文分词器、lucene6.0 中文分词器、lucene 6.0 中文分词、lucene6 中文分词器,以便于您获取更多的相关知识。

时间: 2024-11-03 01:49:55

Lucene 3.6.2入门(4) 中文分词器的相关文章

Solr配置中文分词器IKAnalyzer及增删改查调用

一.配置IKAnalyzer中文分词器 Solr 版本5.2.1 IKAnalyzer2012_u6.jar报错 ,用IKAnalyzer2012_FF_hf1.jar 替换可解决 解决lucene4.0与IKAnalyzer的冲突.解决Exception in thread "main" java.lang.VerifyError: class org.wltea.analyzer.lucene.IKAnalyzer overrides final method tokenStrea

1、solr包结构介绍,solrCore的安装配置,solr部署到Tomcat,多solrCore配置,配置中文分词器,界面功能介绍,Schema.xml的基本使用,数据导入

一.下载solr,下载地址是:http://archive.apache.org/dist/lucene/solr/,选择自己想要的solr的版本,本项目使用的版本是4.10.3 二.如果想下载Lucene,下载地址是: https://mirrors.tuna.tsinghua.edu.cn/apache/lucene/java/ 三.其中solr-4.10.3的包结构如下: bin solr的脚本 contrib solr为了增强自身的功能,所添加的扩展依赖包 dist Solr  buil

11大Java开源中文分词器的使用方法和分词效果对比

本文的目标有两个: 1.学会使用11大Java开源中文分词器 2.对比分析11大Java开源中文分词器的分词效果 本文给出了11大Java开源中文分词的使用方法以及分词结果对比代码,至于效果哪个好,那要用的人结合自己的应用场景自己来判断. 11大Java开源中文分词器,不同的分词器有不同的用法,定义的接口也不一样,我们先定义一个统一的接口: 从上面的定义我们知道,在Java中,同样的方法名称和参数,但是返回值不同,这种情况不可以使用重载. 这两个方法的区别在于返回值,每一个分词器都可能有多种分词

如何在Elasticsearch中安装中文分词器(IK+pinyin)

如果直接使用Elasticsearch的朋友在处理中文内容的搜索时,肯定会遇到很尴尬的问题--中文词语被分成了一个一个的汉字,当用Kibana作图的时候,按照term来分组,结果一个汉字被分成了一组. 这是因为使用了Elasticsearch中默认的标准分词器,这个分词器在处理中文的时候会把中文单词切分成一个一个的汉字,因此引入中文的分词器就能解决这个问题. 本篇文章按照下面的内容进行描述: 分词器的作用 安装IK 简单的测试 模拟测试 安装elasticsearch-analysis-piny

中文分词器

1.IKAnalyzer IK Analyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包.可与lucene配合使用. IK Analyzer是一个结合词典分词和文法分词的中文分词开源工具包.它使用了全新的正向迭代最细粒度切分算法. 项目地址:http://www.oschina.net/p/ikanalyzer/ 下载页面:http://git.oschina.net/wltea/IK-Analyzer-2012FF central repository中似乎没有. 示例代码

solr5.3.1 集成IK中文分词器

参考文章:http://www.cnblogs.com/sword-successful/p/5604541.html 转载文章:http://www.cnblogs.com/pazsolr/p/5796813.html 1.下载IK分词器包. 链接:http://pan.baidu.com/s/1i4D0fZJ 密码:bcen 2.解压并把IKAnalyzer5.3.1.jar .IK-Analyzer-extra-5.3.1.jar拷贝到tomcat/webapps/solr/WEB-INF

Lucene 3.6.2入门(14) SolrJ操作索引和搜索文档以及整合中文分词

package com.jadyer.solrj; import java.util.ArrayList; import java.util.List; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServer; import org.apache.solr.client.solrj.SolrServerException; import org.apache.sol

Lucene 3.6.2入门(15) SolrJ高亮

package com.jadyer.solrj; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServer; import org.apache.solr.client.solrj.SolrServerException;

Lucene 3.6.2入门(11) 高亮

package com.jadyer.lucene; import java.io.File; import java.io.IOException; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexReader; i