1. 程式人生 > >lucene的分詞器寶典

lucene的分詞器寶典

分詞器概念介紹:

Analyzer(分詞器)是把一段文字中的詞按某些規則取出,提供和以後查詢時使用的工具類,注意在建立索引時會用到分詞器,在使用字串搜尋時也會用到分詞器,這兩個地方要使用同一個分詞器,否則可能會搜尋不出結果

分詞器工作流程:

1, 切分關鍵詞

2, 去除停用詞

3, 對於英文單詞,所有字母轉為小寫(搜尋時不區分大小寫)

停用詞:

  有些詞在文字中出現的頻率非常高但是對文字所攜帶的資訊基本不產生影響,例如英文的“aantheof,或中文的的、了、著、是,以及各種標點符號等文字經過分詞之後,停用詞通常被過濾掉,不會被進行索引
這樣的詞稱為停用詞stop word)。在檢索的時候,使用者的查詢中如果含有停用詞,檢索系統也會將其過濾掉(因為使用者輸入的查詢字串也要進行分詞處理)。排除停用詞可以加快建立索引的速度,減小索引庫檔案的大小

常用的中文分詞器

  中文的分詞比較複雜,因為不是一個字就是一個詞,而且一個詞在另外一個地方就可能不是一個詞,如在帽子和服裝中,和服就不是一個詞。對於中文分詞,通常有三種方式:單字分詞、二分法分詞、詞典分詞。

單字分詞:就是按照中文一個字一個字地進行分詞。如:我們是中國人
效果:。(StandardAnalyzer就是這樣)。

  二分法分詞:按兩個字進行切分。如:我們是中國人,效果:我們們是是中中國國人。(CJKAnalyzer就是這樣)。

  詞庫分詞:按某種演算法構造詞,然後去匹配已建好的詞庫集合,如果匹配到就切分出來成為詞語。通常詞庫分詞被認為是最理想的中文分詞演算法。如:我們是中國人,效果為:我們中國人。(使用極易分詞的MMAnalyzer。可以使用極易分詞,或者是庖丁分詞分詞器、IKAnalyzer)。

中文分詞器使用IKAnalyzer,主頁:http://www.oschina.net/p/ikanalyzer

實現了以詞典為基礎的正反向全切分,以及正反向最大匹配切分兩種方法。

IKAnalyzer是第三方實現的分詞器,繼承自LuceneAnalyzer類,針對中文文字進行處理。具體的使用方式參見其文件。

注意:擴充套件的詞庫與停止詞檔案要是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 目錄)同 hibernatelog4j 等配置檔案相同。

3. IKAnalyzer.cfg.xml配置如下:

其中/mydict.dic用來配置擴充套件詞典, /ext_stopword.dic 用來配置停用詞典,配置後細粒度和最大詞拆分如下:

排序:

1. 相關度得分是在查詢時根據查詢條件實進計算出來的

2. 設定按指定的欄位排序.(注意,如果設定了指定的欄位排序. 相關度排序則無效)

 如果需要配置檔案或者 程式碼jar包的可以留言 我發給大家