跟小刀学习 lucene 分词的原理

  • 今天我在学lucene 的分词原理。由于工作很忙每天只有晚上的一点时间来学习。但是要学习的东西有很多很多。为了追求速度,所以有些东西只看一遍就不看了。所以在这里记下来方便以后查看
  • Analyzer包含两个核心组件,Tokenizer以及TokenFilter。两者的区别在于,前者在字符级别处理流,而后者则在词语级别处理流。Tokenizer是Analyzer的第一步,其构造函数接收一个Reader作为参数
  • lucene 分词首先通过tonkenier进行分词(有很多很多的tonkenier),然后交给tokenfilter 进行过滤 有些将停用词过滤,有些不会把停用词过滤掉。不同的分词器,tokenizer 不同。

这里写图片描述

TokenStream tokenStream = a.tokenStream("content",new StringReader(str));

这里写图片描述
- tokenStream 可以理解为一组流 里面有很多很多的token 每一个token是一个一个过滤出来的单词 我们可以通过 tokenStrem.incrementToken(); 取出来。在取来的同时我们查看他的分词信息

public void displayAllTokenInfo(String str,Analyzer a){
        try {
            TokenStream tokenStream = a.tokenStream("content",new StringReader(str));
            tokenStream.reset();
            CharTermAttribute cat = tokenStream.addAttribute(CharTermAttribute.class);//分出来的单词
            OffsetAttribute offset = tokenStream.addAttribute(OffsetAttribute.class);//分词的偏移量
            //位置增量
            PositionIncrementAttribute  posi= tokenStream.addAttribute(PositionIncrementAttribute.class);//分词的偏移量
            //默认分词的类别word 可以自定义自己的分词类别
            TypeAttribute  type= tokenStream.addAttribute(TypeAttribute.class);//分词的偏移量

            for(;tokenStream.incrementToken();){
                System.out.print(posi.getPositionIncrement()+": ");
                System.out.print("["+cat+"]"+"偏移量:"
                        + ""+"["+offset.startOffset()+"--"+offset.endOffset()+"]  类型:"+ type.type() +"\n");


            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }

这里我们把分词器传进入:进行测试
这里写图片描述

@Test
    public void testAllAnalyzer() {
        StandardAnalyzer standardAnalyzer = new StandardAnalyzer();
        StopAnalyzer stopAnalyzer = new StopAnalyzer();
        SimpleAnalyzer simpleAnalyzer = new SimpleAnalyzer();
        WhitespaceAnalyzer whitespaceAnalyzer = new WhitespaceAnalyzer();

        String content ="how are you thank you";
        LuceneAnalyzer l = new LuceneAnalyzer();
        l.displayAllTokenInfo(content, standardAnalyzer);
        System.out.println("--------------");
        l.displayAllTokenInfo(content, stopAnalyzer);
        System.out.println("--------------");
        l.displayAllTokenInfo(content, simpleAnalyzer);
        System.out.println("--------------");
        l.displayAllTokenInfo(content, whitespaceAnalyzer);
    }

输入结果如下:

1: [how]偏移量:[0--3]  类型:<ALPHANUM>
2: [you]偏移量:[8--11]  类型:<ALPHANUM>
1: [thank]偏移量:[12--17]  类型:<ALPHANUM>
1: [you]偏移量:[18--21]  类型:<ALPHANUM>
--------------
1: [how]偏移量:[0--3]  类型:word
2: [you]偏移量:[8--11]  类型:word
1: [thank]偏移量:[12--17]  类型:word
1: [you]偏移量:[18--21]  类型:word
--------------
1: [how]偏移量:[0--3]  类型:word
1: [are]偏移量:[4--7]  类型:word
1: [you]偏移量:[8--11]  类型:word
1: [thank]偏移量:[12--17]  类型:word
1: [you]偏移量:[18--21]  类型:word
--------------
1: [how]偏移量:[0--3]  类型:word
1: [are]偏移量:[4--7]  类型:word
1: [you]偏移量:[8--11]  类型:word
1: [thank]偏移量:[12--17]  类型:word
1: [you]偏移量:[18--21]  类型:word

我们还可以自己定义要停用的词,我会在以后的博客中写到,刚刚学习lucene 理解的不对的地方还请大家多多包涵,互相交流

发布了35 篇原创文章 · 获赞 13 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章