- 今天我在學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 理解的不對的地方還請大家多多包涵,互相交流