【轉載】Lucene學習筆記(八)--完

八、搜索引擎的中文問題:
大綱:
1. 中文分詞的一些常見問題
2. Lucene的StandardAnalyzer對中文的處理
3. CJKAnalyzer對中文的處理
4. 中科院的中文分詞工具

1. 中文分詞的問題:

1.1 分詞:指的就是將一個完整的句子換分爲一個個的分詞(Term)對象的過程。
這種分詞應當滿足某種語言規則,以便於爲其建立索引。

1.2 中文分詞與英文分詞的區別:

1.2.1 對於英語來說,分詞是一件很容易的事。空格就是它們天然的分隔符。

1.2.2 對於中文來說,無疑是一個很複雜的事情。中文是世界上最複雜的語言之一,
語義的變換和句型結構的不規整使得中文分詞一直以來都是一件頭疼的事。
如:對"中華人民共和國"這段文本進行分詞,可以分成"中華"、"人民"和"共和國"。
也可以分成"中"、"華人"、"民"、"共和國",很顯然第一種分法比較合理,但是怎樣實現合理的詞語切詞呢?

1.3 中文分詞的方法:共總結出三種方法。

1.3.1 單字切詞法:顧名思意,就是按照中文一個字一個字的進行分詞。
以這種方式切分出來的分詞再進入索引,稱之爲字索引。
如StandardAnalyzer分析器。

** 說明:很顯然這種方法很不合理,會嚴重影響創建索引和搜索的效率。

1.3.2 二分法:就是值每兩個字進行一次切分。如:"中華人民共和國"使用二分法切詞,
結果爲:"中華/華人/人民/民共/共和/和國"
如CJKAnalyzer分析器。

** 說明:這種方式完全不考慮詞義、語境,機械的對語句進行處理。
相對第一種方法雖然進步很多,可以跟理想的需求相比還是不足。

1.3.3 詞庫分詞法:就是用一個寂靜建立好的詞的集合(按照某種算法創建的集合)去匹配目標,
當目標文檔中遇到集合中已經存在的詞時,就將之切分出來。例如詞庫中已經存在了"天涯若比鄰"這個詞,
那麼目標文本中如果有"天涯若比鄰"這段文本,那麼分詞器就不會對這段話切分,而是把它作爲一個分詞保存到索引。

** 具體:詞庫分詞法:包括極易分詞和庖丁分詞。這兩個基本一樣。
下邊我們使用極易分詞MMAnalyzer分析器進行舉例。

** 說明:一直以來,詞庫分詞被認爲是最理想的一種中文分詞方式。

** 注意:很顯然,詞庫的創建便成了"詞庫分詞法"的關鍵。
通常詞庫的創建要統計大量的內容,然後根據各種詞出現的頻率、概率再來進行篩選,最終決定什麼詞應該放入詞庫。
另外,一個更加高級的詞庫還加入了語義和詞性的標註,
甚至還有不同詞的權重,使用這樣的詞庫進行分詞的效果應該非常理想。

2. Lucene對中文的處理

2.1 查看不同分析器的分詞效果:

2.1.1 使用StandardAnalyzer對中文分詞:

例子:
StringReader reader = new StringReader("中華人民共和國");
Analyzer analyzer = new StandardAnalyzer();
//得到TokenSream流對象:其實TokenSream抽象類的子類Tokenizer就是封裝了一下Reader對象
TokenStream tokenStream = analyzer.tokenStream(reader);
//得到分詞和過濾後的一個分詞
Token token = tokenSream.next();
while(token != null){
//輸出分詞信息
System.out.println(token.termText());
//繼續獲得分詞
token = tokenStream.next();
}

** 結果是單字分詞效果:








2.1.2 使用SimpleAnalyzer對中文分詞:

例子:同上只需修改Analyzer analyzer = new SimpleAnalyzer();

** 結果是沒有對中文做任何處理:原樣輸出"中華人民共和國"

2.1.3 使用WhitespaceAnalyzer對中文分詞:它只對空格進行分詞,所以如果有空格它就分詞,沒有空格就不會分詞。

例子:我們將文本中加入一個空格"中華人民 共和國"

** 結果是:如果沒有空格那麼還是原樣輸出。

中華人民
共和國

2.2 使用CJKAnalyzer對中文處理:在Lucene的非標準包中包含一個CJKAnalyzer。
這是Lucene的作者專門爲中文、韓文和日文開發的一個分詞工具。

** 注意:這個CJKAnalyzer需要開發者自己下載。

例子:只需將上面代碼中改動一處Analyzer analyzer = new CJKAnalyzer();

** 結果:
中華
華人
人民
民共
共和
和國

** 說明:CJKAnalyzer使用了二分法進行分詞,它的tokenStream方法如下
public final TokenSream tokenSream(){
//使用了CJKTokenizer分詞器和StopFilter過濾器
return new StopFilter(new CJKTokenizer(reader), stopTable);
}

2.3 使用極易分詞MMAnalyzer分析器進行對中文處理:

** 注意:該MMAnalyzer也是需要開發者下載後才能使用的(將下載得到的je.jar加入到項目lib即可).

例子:Analyzer analyzer = new MMAnalyzer();
我們將文本改爲:"我們中國人"

** 結果:
我們
中國人

** 說明:MMAnalyzer使用的是詞庫分詞法。使用方法同上

3. 中文分詞工具 ICTCLAS :中國科學院計算機研究所在多年研究基礎上,
耗時一年研製出了
基於多層隱馬模型的漢語詞法分析系統ICTCLAS(Institute of Computing Technology, Chinese Lexical Analysis System),
該系統的功能包括中文分、詞性標註、未登陸詞識別等。

** 使用方法:原版的ICTCLAS工具是用C語言編寫的。有些程序員爲了Java和C#等其他語言中也可以使用,就編寫了相應的版本。
這裏我們當然是選用的Java版本。

例子:
//創建ICTCLAS分析器對象
ICTCLAS ictclas = ICTCLAS.getInstance();
String text = "喬丹是一位偉大的籃球運動員";
//進行分詞,並且打印:注意這裏和Lucene中常用的方法不同
System.out.println(ictclas.paragraphProcess(text));

** 結果:
喬丹



偉大

籃球
運動員




九、Lucene搜索的高亮顯示Highlighter :可以截取一段文本,並讓與關鍵字匹配的文字高亮顯示。
其實高亮的實現是通過找到文本後,在文本前、後加上css樣式實現的。
如:加上<font color="red">匹配上的文字</font>

** 注意:高亮的對象是Document文檔中Field中保存的文本,所以只有搜索得到Document後才能進行高亮操作。

例子:
1.準備高亮器

//創建高亮器對象:需要一些輔助類對象作爲參數
Formatter formatter = new SimpleHTMLFormatter("<font color='red'>", "</font>");//被高亮文本前後加的標籤前後綴
Scorer scorer = new QueryScorer(query);//創建一個Scorer對象,傳入一個Lucene的條件對象Query
//正式創建高亮器對象
Highlighter highlighter = new Highlighter(formatter, scorer);
//設置被高亮的文本返回的摘要的文本大小
Fragmenter fragmenter = new SimpleFragmenter(50);//默認是50個字符
//讓大小生效
highlighter.setTextFragmenter(fragmenter);

2.使用高亮器

/*
使用高亮器對Document中指定的Field中包含搜索關鍵字的文本進行高亮
傳入分析器對象、傳入被高亮的內容存在與哪個Field字段、和該字段的內容
高亮器通過它的機制對該內容進行分析和高亮,然後返回一個摘要(默認是100個字符,這裏是50個,因爲上邊已經自定義)

注意:如果指定的字段中沒有找到與搜索關鍵字匹配的要高亮的文字,那麼該方法返回空值
*/
String resume = highlighter.getBestFragment(analyzer, "content", doc.get("content"));
if(resume != null){
//如果resume不爲空,那麼把高亮後的文本在保存到對應的Field中進行返回
doc.getField("content").setValue(resume);
}


十、Lucene SandBox :Lucene之所以成功與第三方開發者的支持也是密不可分的。
SandBox就是專門用於存儲這些第三方開發者開發的代碼的一個代碼倉庫。

** 說明:SandBox就是建立的一個CVS代碼倉庫,用來存放支持Lucene的代碼。

** SandBox中的主要內容:
SandBox分類 基本介紹

分析器 使用於各種語言的分析器
Ant 完成批處理任務
數據庫 伯克裏數據庫目錄的實現
高亮顯示 完成高亮顯示
JavaScript腳本 適用於web瀏覽器的查詢構造和驗證
Lucli 在命令行與索引交互的接口

1. Lucene索引工具箱----Luke :是Lucene的一個索引瀏覽器,作者是Andrzej Bialeckj。
Luke是一個使用Java開發的桌面應用程序,它可以非常細緻的顯示Lucene所建立的索引文件的內部結構,
以幫助開發者更好的監控和管理索引文件。

** 安裝方法:
1.1 從官網下載Luke的源代碼包
1.2 解壓壓縮包
1.3 用Eclipse導入工程
1.4 在org.getopt.luke.plugins包中找到Luke.java文件,然後運行就行了

2. Lucene索引監視器----Limo :全稱是"Lucene Index Monitir",作者是Julien Nioche
使用limo可以在Web形式下瀏覽Lucene索引文件的狀態信息。如:索引是否已經被鎖定、索引文件的最後修改日期和索引中文檔的數量。

** 安裝方法:
2.1 官網下載包war文件
2.2 將war包放到tomcat的webapps中,改名limo
2.3 啓動tomcat,瀏覽器中輸入http://localhost:8080/limo/

3. Lucene命令行接口----LUCLI :全稱Lucene Command-Line Interface,作者是Dror Matalon
是一個可以通過使用命令行操作索引信息的第三方工具。

** 安裝方法:
3.1 官網下載LUCLI工具包
3.2 解壓,使用Eclipse導入工程
3.3 在lucli中找到Lucli.java文件,然後運行



** 總結:至此Lucene筆記結束,其間如有不當或明顯表達錯誤的地方希望大家多多指教,本人不盡感激。

發佈了101 篇原創文章 · 獲贊 26 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章