轉載請注明出處:[http://blog.csdn.net/xiaojimanman/article/details/42916755](http://blog.csdn.net/xiaojimanman/article/details/42916755)
在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 泰國語言分詞
- 前言
- 寫在開始之前
- lucene初始認知
- 索引數學模型
- 索引文件結構
- 創建索引
- 搜索索引
- 分詞器介紹
- Query查詢
- IndexSearcher中檢索方法
- 更新說明
- 案例初識
- JsonUtil & XmlUtil
- 基ClassUtil & CharsetUtil
- ParseUtil & ParseRequest
- 數據庫連接池
- 實現實時索引基本原理
- 實時索引管理類IndexManager
- 實時索引的檢索
- 實時索引的修改
- 查詢語句創建PackQuery
- 縱橫小說更新列表頁抓取
- 縱橫小說簡介頁采集
- 縱橫小說章節列表采集
- 縱橫小說閱讀頁采集
- 縱橫小說數據庫設計
- 縱橫小說數據庫操作
- 縱橫小說分布式采集