跟小刀学习 lucene 分词的原理

来源:互联网 发布:网络诈骗按照什么罪 编辑:程序博客网 时间:2024/04/30 15:36
  • 今天我在学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]  类型:word2: [you]偏移量:[8--11]  类型:word1: [thank]偏移量:[12--17]  类型:word1: [you]偏移量:[18--21]  类型:word--------------1: [how]偏移量:[0--3]  类型:word1: [are]偏移量:[4--7]  类型:word1: [you]偏移量:[8--11]  类型:word1: [thank]偏移量:[12--17]  类型:word1: [you]偏移量:[18--21]  类型:word--------------1: [how]偏移量:[0--3]  类型:word1: [are]偏移量:[4--7]  类型:word1: [you]偏移量:[8--11]  类型:word1: [thank]偏移量:[12--17]  类型:word1: [you]偏移量:[18--21]  类型:word

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

1 0
原创粉丝点击