[Lucene] Lucene 4.10 显示分词结果

主要参考: http://www.cnblogs.com/dennisit/p/3258664.html

原文写得非常好,非常详细。但是版本有一些老了,以其中的displayToken()中跟displayAllTokenInfo()已经需要修改。否则无法在最新的4.10上工作。

在最新的版本之中,需要:

(1)在stream的incrementToken之前增加一个reset的动作:

(2)(我使用JapaneseAnalyzer测试的结果) 这样显示的结果,会出现重复:

比如:

写道
原文:日本経済新聞でモバゲーの記事を読んだ
======日文=======StandardAnalyzer======分词=======
["日本","日本経済新聞","経済","新聞","モバゲ","記事","読む"]

我对改方法进行了修改,通过offset进行判定是否略过。

修改之后的displayAllTokenInfo():

public static void displayAllTokenInfo(String str,Analyzer a){
    try {
        TokenStream stream = a.tokenStream("content",new StringReader(str));
        //位置增量的属性,存储语汇单元之间的距离
        PositionIncrementAttribute pis=stream.addAttribute(PositionIncrementAttribute.class);
        //每个语汇单元的位置偏移量
        OffsetAttribute oa=stream.addAttribute(OffsetAttribute.class);
        //存储每一个语汇单元的信息(分词单元信息)
        CharTermAttribute cta=stream.addAttribute(CharTermAttribute.class);
        //使用的分词器的类型信息
        TypeAttribute ta=stream.addAttribute(TypeAttribute.class);
        stream.reset();
        int lastOffset = -1;
        while(stream.incrementToken()) {
        	if(oa.startOffset() < lastOffset) continue;
        	lastOffset = oa.endOffset();
//                System.out.print("增量:"+pis.getPositionIncrement()+":");
//                System.out.print("分词:"+cta+"位置:["+oa.startOffset()+"~"+oa.endOffset()+"]->类型:"+ta.type()+"\n");
        	System.out.print("["+cta+"]");
        }
        System.out.println();
        stream.end();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

相关推荐