1. 程式人生 > >基於lucene的案例開發:分詞器介紹

基於lucene的案例開發:分詞器介紹

      在lucene建立索引的過程中,資料資訊的處理是一個十分重要的過程,在這一過程中,主要的部分就是這一篇部落格的主題:分詞器。在下面簡單的demo中,介紹了7中比較常見的分詞技術,即:CJKAnalyzer、KeywordAnalyzer、SimpleAnalyzer、StopAnalyzer、WhitespaceAnalyzer、StandardAnalyzer、IKAnalyzer;自己可以通過註釋的形式一一驗證。源程式如下:

Analyzer分詞demo

 /**  
 *@Description:    分詞技術demo
 */ 
package com.lulei.lucene.study;  

import java.io.StringReader;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.cjk.CJKAnalyzer;
import org.apache.lucene.analysis.core.KeywordAnalyzer;
import org.apache.lucene.analysis.core.SimpleAnalyzer;
import org.apache.lucene.analysis.core.StopAnalyzer;
import org.apache.lucene.analysis.core.WhitespaceAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;
  
public class AnalyzerStudy {

	public static void main(String[] args) throws Exception {
		//需要處理的測試字串
		String str = "這是一個分詞器測試程式,希望大家繼續關注我的個人系列部落格:基於Lucene的案例開發,這裡加一點帶空格的標籤 LUCENE java 分詞器";
		Analyzer analyzer = null;
		//標準分詞器,如果用來處理中文,和ChineseAnalyzer有一樣的效果,這也許就是之後的版本棄用ChineseAnalyzer的一個原因
		analyzer = new StandardAnalyzer(Version.LUCENE_43);
		//第三方中文分詞器,有下面2中構造方法。
		analyzer = new IKAnalyzer();
		analyzer = new IKAnalyzer(false);
		analyzer = new IKAnalyzer(true);
		//空格分詞器,對字串不做如何處理
		analyzer = new WhitespaceAnalyzer(Version.LUCENE_43);
		//簡單分詞器,一段一段話進行分詞
		analyzer = new SimpleAnalyzer(Version.LUCENE_43);
		//二分法分詞器,這個分詞方式是正向退一分詞(二分法分詞),同一個字會和它的左邊和右邊組合成一個次,每個人出現兩次,除了首字和末字
		analyzer = new CJKAnalyzer(Version.LUCENE_43);
		//關鍵字分詞器,把處理的字串當作一個整體
		analyzer = new KeywordAnalyzer();
		//被忽略的詞分詞器
		analyzer = new StopAnalyzer(Version.LUCENE_43);
		
		//使用分詞器處理測試字串
		StringReader reader = new StringReader(str);
		TokenStream  tokenStream  = analyzer.tokenStream("", reader);
		tokenStream.reset();
		CharTermAttribute  term = tokenStream.getAttribute(CharTermAttribute.class);
		int l = 0;
		//輸出分詞器和處理結果
		System.out.println(analyzer.getClass());
		while(tokenStream.incrementToken()){  
			System.out.print(term.toString() + "|");
			l += term.toString().length();
			//如果一行輸出的字數大於30,就換行輸出
			if (l > 30) {
				System.out.println();
				l = 0;
			}
		} 
	}
}
注:上述程式對analyzer進行了9次賦值,自己可以通過一一註解的形式檢視每一種分詞技術的分詞效果。

分詞器介紹

       下面將會對這些分詞器做一些簡單的介紹,以及上述程式在該分詞器下的執行截圖:

StandardAnalyzer

       StandardAnalyzer標準分詞器,如果用來處理中文,和ChineseAnalyzer有一樣的效果,這也許就是之後的版本棄用ChineseAnalyzer的一個原因。用StandardAnalyzer處理英文效果還不錯,但是對中文的處理只是將其分成單個漢字,並不存在任何語義或詞性,如果實在沒有其他的分詞器,用StandardAnalyzer來處理中文還是可以的,上述事例使用StandardAnalyzer分詞技術的執行結果如下圖:



IKAnalyzer

      IKAnalyzer是基於Lucene的第三方中文分詞技術,該分詞技術基於現有的中文詞庫實現的,在構造Analyzer物件時有兩種構造方法,無參構造等同於new IKAnalyzer(false) ,在介紹true/false兩種引數下分詞器的不同之前先看看這兩種情況下的事例執行結果:

false執行結果如下圖:


true執行結果如下圖:


       從上述事例中,我們可以簡單的看出,false的情況下會對已分的詞進行再分,如果存在長度較小的詞元,也將其作為一個分詞結果。IKAnalyzer是一種比較常用的中文分詞技術,但是其分詞效果過於依賴字典,所以要使其達到更好的效果,需要不斷的升級自己的字典。

WhitespaceAnalyzer

      WhitespaceAnalyzer空格分詞,這個分詞技術就相當於按照空格簡單的切分字串,對形成的子串不做其他的操作,結果同string.split(" ")的結果類似。上述事例在WhitespaceAnalyzer分詞技術下的執行結果如下圖:


      這種分詞技術也許你會絕對沒有太大的作用,它對輸入的字串幾乎沒有做太多的處理,對語句的處理結果也不是太好,如果這樣想就錯了,下面就簡單的想一下這個問題,這篇部落格的標籤是 lucene、java、分詞器,那這三個詞在索引中又該如何的儲存,採用何種分詞技術呢?這裡不做任何解答,自己思考下,在以後的小說案例中會對標籤這個域提出具體的解決方案。

SimpleAnalyzer

      SimpleAnalyzer簡單分詞器,與其說是一段話進行分詞,不如說是一句話就是一個詞,遇到標點、空格等,就將其之前的內容當作一個詞。上述事例在SimpleAnalyzer分詞技術下的執行結果如下圖:


CJKAnalyzer

      CJKAnalyzer是二分法分詞器,這個分詞方式是正向退一分詞(二分法分詞),同一個字會和它的左邊和右邊組合成一個次,每個人出現兩次,除了首字和末字,也就是說會將任何兩個相鄰的漢字當作是一個詞,這種分詞技術會產生大量的無用片語。上述事例在CJKAnalyzer分詞技術下的執行結果如下圖:


KeywordAnalyzer

      KeywordAnalyzer關鍵字分詞器,把處理的字串當作一個整體,這個分詞器,在lucene之前的版本中或許還有點作用,但最近的幾個版本中,Lucene對域的型別做了細分,它的作用就不是太大了,不做在luke中,還是相當重要的。上述事例在KeywordAnalyzer分詞技術下的執行結果如下圖:


StopAnalyzer

      StopAnalyzer被忽略的詞分詞器,被忽略的詞就是在分詞結果中,被丟棄的字串,如標點、空格等。上述事例在StopAnalyzer分詞技術下的執行結果如下圖:


     上述的7種分詞技術都可以對中文做處理,對外文(非英語)的處理有以下幾種分詞技術:

BrazilianAnalyzer 巴西語言分詞 
CzechAnalyzer 捷克語言分詞
DutchAnalyzer 荷蘭語言分詞
FrenchAnalyzer 法國語言分詞
GermanAnalyzer 德國語言分詞
GreekAnalyzer 希臘語言分詞
RussianAnalyzer 俄羅斯語言分詞
ThaiAnalyzer 泰國語言分詞