標籤:txt 增量 nts cep lucene分詞 standard tac 不同的 lock
分詞器的核心類:
Analyzer:分詞器
TokenStream:分詞器做優點理之後得到的一個流。這個流中儲存了分詞的各種資訊,能夠通過TokenStream有效擷取到分詞單元。
下面是把檔案流轉換成分詞流(TokenStream)的過程
首先,通過Tokenizer來進行分詞,不同分詞器有著不同的Tokenzier,Tokenzier分完詞後,通過TokenFilter對已經分好詞的資料進行過濾,比方停止詞。過濾完之後,把全部的資料群組合成一個TokenStream;下面這圖就是把一個reader轉換成TokenStream:
這個TokenStream中存有一些屬性,這些屬性會來標識這個分詞流的元素。
在這個流裡 有非常多屬性。
以下截了lucene4.10.1原始碼中的圖:
當中有3個重要的屬性,CharTermAttribute(儲存相印的詞彙),OffsetAttribute(儲存各個詞彙的位移量)。PositionIncrementAttribute(儲存各個詞與詞之間的位置增量,假設為0。能夠做同義字搜尋)。
是由這3個屬性來控制這些分詞資訊
Tokenzier主要負責接收Reader。將Reader進行分詞操作。有例如以下一些實作類別
TokenFilter 將分詞的出來的單元,進行各種各樣的過濾。
代碼例如以下:
<span style="font-size:14px;">package hhc;import java.io.IOException;import java.io.StringReader;import org.apache.lucene.analysis.Analyzer;import org.apache.lucene.analysis.TokenStream;import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;import org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute;import org.apache.lucene.analysis.tokenattributes.TypeAttribute;public class AnalyzerUtil {/** * 輸出字元分詞資訊 * * @param str * @param a */public static void displayAllToken(String str, Analyzer a) {try {// 全部的分詞器都必須含有分詞流TokenStream stream = a.tokenStream("content", new StringReader(str));// 放回一個TokenStream;/** * 建立一個屬性,這個屬性會加入到流裡。隨著這個TokenStream流添加 * 這個屬性中儲存中全部的分詞資訊 */CharTermAttribute cta=stream.addAttribute(CharTermAttribute.class);//位置增量的屬性,儲存詞之間的距離PositionIncrementAttribute pia = stream.addAttribute(PositionIncrementAttribute.class);//儲存每一個詞直接的位移量OffsetAttribute oa = stream.addAttribute(OffsetAttribute.class);//使用的每一個分詞器直接的類型資訊TypeAttribute ta = stream.addAttribute(TypeAttribute.class);for (; stream.incrementToken();) {System.out.print(pia.getPositionIncrement()+":");System.out.print(cta+":["+oa.startOffset()+"-"+oa.endOffset()+"]-->"+ta.type()+"\n");}System.out.println();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}</span>
測試:
<span style="font-size:14px;">@Testpublic void hhcTest(){Analyzer a1 =new StandardAnalyzer(Version.LUCENE_35);Analyzer a2 =new StopAnalyzer(Version.LUCENE_35);Analyzer a3 =new SimpleAnalyzer(Version.LUCENE_35);Analyzer a4 =new WhitespaceAnalyzer(Version.LUCENE_35);String txt ="how are you think you";AnalyzerUtil.displayAllToken(txt, a1);AnalyzerUtil.displayAllToken(txt, a2);AnalyzerUtil.displayAllToken(txt, a3);AnalyzerUtil.displayAllToken(txt, a4);}</span>
lucene分詞器中的Analyzer,TokenStream, Tokenizer, TokenFilter