跟小刀學習 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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章