參考:http://grunt1223.iteye.com/blog/969197
?
Analyzer,或者說文本分析的過程, 實質上是將輸入文本轉化為文本特征向量的過程 。這里所說的文本特征,可以是詞或者是短語。它主要包括以下四個步驟:?
1、分詞,將文本解析為單詞或短語
2、歸一化,將文本轉化為小寫
3、停用詞處理,去除一些常用的、無意義的詞
4、提取詞干,解決單復數、時態語態等問題
?
?
?
Lucene Analyzer包含兩個核心組件,Tokenizer以及TokenFilter。兩者的區別在于,前者在字符級別處理流,而后者則在詞語級別處理流。Tokenizer是Analyzer的第一步,其構造函數接收一個Reader作為參數,而TokenFilter則是一個類似攔截器的東東,其參數可以使TokenStream、Tokenizer,甚至是另一個TokenFilter。整個Lucene Analyzer的過程如下圖所示:
?
?
?
上圖中的一些名詞的解釋如下表所示:?
類 | 說明 |
Token | 表示文中出現的一個詞,它包含了詞在文本中的位置信息 |
Analyzer | 將文本轉化為TokenStream的工具 |
TokenStream | 文本符號的流 |
Tokenizer | 在字符級別處理輸入符號流 |
TokenFilter | 在字符級別處理輸入符號流,其輸入可以是TokenStream、Tokenizer或者TokenFilter |
?
lucene分詞自定義
? ? ? ?TokenStream繼承關系圖如下:
?
StopAnalyzer,StandardAnalyze,WhitespaceAnalyzer,SimpleAnalyzer,KeyWordAnalyzer都繼承自父類Analyzer。
?
因此只要實現父類的虛方法tokenStream 就可以實現分析。
分詞的切分算法由繼承自父類Tokenizer的方法
public final boolean incrementToken() throws IOException 來實現。
因此自定義繼承類Tokenizer并實現其incrementToken算法就可以實現自定義的分詞。
?
?
//自定義禁用分詞器 public class UserDefinedAnalyzer extends Analyzer{ //定義禁用詞集合 private Set stops; //無參構造器使用默認的禁用詞分詞器 public UserDefinedAnalyzer (){ stops = StopAnalyzer.ENGLISH_STOP_WORDS_SET; } /** * 傳一個禁用詞數組 * @param sws */ public UserDefinedAnalyzer (String[] sws){ //使用stopFilter創建禁用詞集合 stops=StopFilter.makeStopSet(Version.LUCENE_35,sws,true); //將默認的禁用詞添加進集合 stops.addAll(StopAnalyzer.ENGLISH_STOP_WORDS_SET); } /** * 自定義分詞器 */ @Override public TokenStream tokenStream(String str, Reader reader) { //讀取原始Reader數據的一定是Tokenizer類,這里使用的是LetterTokenizer return new StopFilter(Version.LUCENE_35, new LowerCaseFilter(Version.LUCENE_35, new LetterTokenizer(Version.LUCENE_35, reader)),stops); } public static void displayToken(String str,Analyzer a) { try { TokenStream stream = a.tokenStream("content",new StringReader(str)); //創建一個屬性,這個屬性會添加流中,隨著這個TokenStream增加 CharTermAttribute cta = stream.addAttribute(CharTermAttribute.class); while(stream.incrementToken()) { System.out.print("["+cta+"]"); } System.out.println(); } catch (IOException e) { e.printStackTrace(); } } }
?
?
測試類
?
public class Test { public static void main(String[] args) { Analyzer a1=new UserDefinedAnalyzer(new String[]{"my","name"}); //Analyzer a1=new UserDefinedAnalyzer(); String str="my name is paul"; UserDefinedAnalyzer.displayToken(str, a1); } }
??
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
