lucene的分詞器寶典
分詞器概念介紹:
Analyzer類(分詞器)就是把一段文字中的詞按某些規則取出,提供和以後查詢時使用的工具類,注意在建立索引時會用到分詞器,在使用字串搜尋時也會用到分詞器,這兩個地方要使用同一個分詞器,否則可能會搜尋不出結果
分詞器工作流程:
1, 切分關鍵詞
2, 去除停用詞
3, 對於英文單詞,把所有字母轉為小寫(搜尋時不區分大小寫)
停用詞:
有些詞在文字中出現的頻率非常高,但是對文字所攜帶的資訊基本不產生影響,例如英文的“a、an、the、of”,或中文的“的、了、著、是”,以及各種標點符號等。文字經過分詞之後,停用詞通常被過濾掉,不會被進行索引 ,這樣的詞稱為停用詞(stop word)。在檢索的時候,使用者的查詢中如果含有停用詞,檢索系統也會將其過濾掉(因為使用者輸入的查詢字串也要進行分詞處理)。排除停用詞可以加快建立索引的速度,減小索引庫檔案的大小。
常用的中文分詞器
中文的分詞比較複雜,因為不是一個字就是一個詞,而且一個詞在另外一個地方就可能不是一個詞,如在“帽子和服裝”中,“和服”就不是一個詞。對於中文分詞,通常有三種方式:單字分詞、二分法分詞、詞典分詞。
單字分詞:就是按照中文一個字一個字地進行分詞。如:“我們是中國人”,
效果:“我”、“們”、“是”、“中”、“國”、“人”。(StandardAnalyzer就是這樣)。
二分法分詞:按兩個字進行切分。如:“我們是中國人”,效果:“我們”、“們是”、“是中”、“中國”、“國人”。(CJKAnalyzer就是這樣)。
詞庫分詞:按某種演算法構造詞,然後去匹配已建好的詞庫集合,如果匹配到就切分出來成為詞語。通常詞庫分詞被認為是最理想的中文分詞演算法。如:“我們是中國人”,效果為:“我們”、“中國人”。(使用極易分詞的MMAnalyzer。可以使用“極易分詞”,或者是“庖丁分詞”分詞器、IKAnalyzer)。
中文分詞器使用IKAnalyzer,主頁:http://www.oschina.net/p/ikanalyzer。
實現了以詞典為基礎的正反向全切分,以及正反向最大匹配切分兩種方法。
注意:擴充套件的詞庫與停止詞檔案要是UTF-8的編碼,並且在要檔案頭部加一空行。
各種分詞器測試
需要新增 lucene-analyzers-3.0.0.jar
// 不同的分詞器,中文程式碼測試 public void testAnalyzer(Analyzer analyzer, String text) throws Exception { System.out.println("當前使用的分詞器:" + analyzer.getClass().getSimpleName()); TokenStream tokenStream = analyzer.tokenStream("content", new StringReader(text)); tokenStream.addAttribute(TermAttribute.class); while (tokenStream.incrementToken()) { TermAttribute termAttribute = tokenStream.getAttribute(TermAttribute.class); System.out.println(termAttribute.term()); } System.out.println(); } 測試程式碼如下: @Test public void testAnalyzer()throws Exception{ helloWorld.testAnalyzer(new SimpleAnalyzer(),"釣魚島是中國的"); helloWorld.testAnalyzer(new StandardAnalyzer(Version.LUCENE_30),"釣魚島是中國的"); helloWorld.testAnalyzer(new CJKAnalyzer(Version.LUCENE_30),"釣魚島是中國的"); }
測試結果
IK Analyzer 3.X介紹
IK Analyzer 是一個開源的,基於 java詫言開發的輕量級的中文分詞工具包。從 2006年 12 月推出 1.0 版開始, IKAnalyzer 已經推出了 3 個大版本。最初,它是以開源專案Luence 為應用主體的,結合詞典分詞和文法分析演算法的中文分片語件。新版本的 IK Analyzer 3.X 則發展為面吐 Java 的公用分片語件,獨立於 Lucene 專案,同時提供了對Lucene的預設優化實現。
GoogleCode開源專案 :http://code.google.com/p/ik-analyzer/
GoogleCode SVN下載:http://ik-analyzer.googlecode.com/svn/trunk/
IK Analyzer 3.X的使用
@Test public void testAnalyzer()throws Exception{ // false 細粒度切分 helloWorld.testAnalyzer(new IKAnalyzer(false),"釣魚島是中國的"); // true 最大詞長切分 helloWorld.testAnalyzer(new IKAnalyzer(true),"釣魚島是中國的"); }
基於配置的詞典擴充
1. IK 分詞器還支援通過配置 IKAnalyzer.cfg.xml 檔案來擴充您的與有詞典以及停止詞典(過濾詞典) UTF-8格式
2. 部署IKAnalyzer.cfg.xml ,IKAnalyzer.cfg.xml 部 署 在 代 碼 根 目 錄 下 ( 對 於 web 項 目,通 常 是WEB-INF/classes 目錄)同 hibernate、log4j 等配置檔案相同。
3. IKAnalyzer.cfg.xml配置如下:
其中/mydict.dic用來配置擴充套件詞典, 而/ext_stopword.dic 用來配置停用詞典,配置後細粒度和最大詞拆分如下:
排序:
1. 相關度得分是在查詢時根據查詢條件實進計算出來的
2. 設定按指定的欄位排序.(注意,如果設定了指定的欄位排序. 相關度排序則無效)
如果需要配置檔案或者 程式碼jar包的可以留言 我發給大家