Lucene的中文分詞器IKAnalyzer




分詞器對英文的支持是非常好的。


  一般分詞經過的流程:


  1)切分關鍵詞


  2)去除停用詞


  3)把英文單詞轉為小寫


  但是老外寫的分詞器對中文分詞一般都是單字分詞,分詞的效果不好。


  國人林良益寫的IK Analyzer應該是最好的Lucene中文分詞器之一,而且隨著Lucene的版本更新而不斷更新,目前已更新到IK Analyzer 2012版本。


  IK Analyzer是一個開源的,基於java語言開發的輕量級的中文分詞工具包。到現在,IK發展為面向Java的公用分詞組件,獨立於Lucene項目,同時提供瞭對Lucene的默認優化實現。在2012版本中,IK實現瞭簡單的分詞歧義排除算法,標志著IK分詞器從單純的詞典分詞向模擬語義分詞衍化。


  在系統環境:Core2 i7 3.4G雙核,4G內存,window 7 64位, Sun JDK 1.6_29 64位 普通pc環境測試,IK2012具有160萬字/秒(3000KB/S)的高速處理能力。


  特別的,在2012版本,詞典支持中文,英文,數字混合詞語。


  IK Analyzer 2012版本的分詞效果示例:


  IK Analyzer2012版本支持 細粒度切分 和 智能切分。


  我們看兩個演示樣例:


  1)文本原文1:


  IKAnalyzer是一個開源的,基於java語言開發的輕量級的中文分詞工具包。從2006年12月推出1.0版本開始,IKAnalyzer已經推出瞭3個大版本。


  智能分詞結果:


  ikanalyzer | 是 | 一個 | 開源 | 的 | 基於 | java | 語言 | 開發 | 的 | 輕量級 | 的 | 中文 | 分詞 | 工具包 | 從 | 2006年 | 12月 | 推出 | 1.0版 | 開始 | ikanalyzer | 已經 | 推 | 出瞭 | 3個 | 大 | 版本


  最細粒度分詞結果:


  ikanalyzer | 是 | 一個 | 一 | 個 | 開源 | 的 | 基於 | java | 語言 | 開發 | 的 | 輕量級| 量級 | 的 | 中文 | 分詞 | 工具包 | 工具 | 包 | 從 | 2006 | 年 | 12 | 月 | 推出 | 1.0 | 版 | 開始 | ikanalyzer | 已經 | 推出 | 出瞭 | 3 | 個 | 大 | 版本


  2)文本原文2:


  張三說的確實在理。


  智能分詞結果:


  張三 | 說的 | 確實 | 在理


  最細粒度分詞結果:


  張三 | 三 | 說的 | 的確 | 的 | 確實 | 實在 | 在理


  IKAnalyzer的使用


  1)下載地址:


  GoogleCode開源項目:http://code.google.com/p/ik-analyzer/


  GoogleCode下載地址:http://code.google.com/p/ik-analyzer/downloads/list


  2)兼容性:


  IKAnalyzer 2012版本兼容Lucene3.3以上版本。


  3)安裝部署:


  十分簡單,隻需要將IKAnalyzer2012.jar引入項目中就可以瞭。對於"的"、"瞭"、"著"之類的停用詞,它有一個詞典stopword.dic。把stopword.dic和IKAnalyzer.cfg.xml復制到class根目錄就可以啟用停用詞功能和擴展自己的詞典。


  4)測試例子:


  新建一個Java Project,引入Lucene所需的jar文件和IKAnalyzer2012.jar文件,把stopword.dic和IKAnalyzer.cfg.xml復制到class根目錄,建立一個擴展詞典ext.dic和中文停用詞詞典chinese_stopword.dic。



  IKAnalyzer2012發佈包自帶的stopword.dic裡面存的是英文的停用詞。所以我們新建一個chinese_stopword.dic,用來存放中文停用詞。chinese_stopword.dic需要使用UTF-8編碼。詞典中,每個中文詞匯獨占一行。


  chinese_stopword.dic內容格式:



  IKAnalyzer.cfg.xml:


<?xml version="1.0" encoding="UTF-8"?>


<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">


<properties>


<comment>IK Analyzer 擴展配置</comment>


<!--用戶可以在這裡配置自己的擴展字典 -->


<entry key="ext_dict">ext.dic;</entry>


<!--用戶可以在這裡配置自己的擴展停止詞字典-->


<entry key="ext_stopwords">stopword.dic;chinese_stopword.dic</entry>


</properties>


可以配置多個詞典文件,文件使用";"號分隔。文件路徑為相對java包的起始根路徑。


  擴展詞典ext.dic需要為UTF-8編碼。


  ext.dic內容:



  我把"2012"作為一個詞,"歐洲杯四強賽"作為一個詞。


  測試分詞代碼:


package com.cndatacom.lucene.test;


import java.io.StringReader;


import org.apache.lucene.analysis.Analyzer;


import org.apache.lucene.analysis.TokenStream;


import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;


import org.junit.Test;


import org.wltea.analyzer.lucene.IKAnalyzer;


public class IKAnalyzerTest {


@Test


public void testIKAnalyzer() throws Exception {


String keyWord = "2012年歐洲杯四強賽";


IKAnalyzer analyzer = new IKAnalyzer();


//使用智能分詞


analyzer.setUseSmart(true);


//打印分詞結果


printAnalysisResult(analyzer,keyWord);


}


private void printAnalysisResult(Analyzer analyzer, String keyWord) throws Exception {


System.out.println("當前使用的分詞器:" + analyzer.getClass().getSimpleName());


TokenStream tokenStream = analyzer.tokenStream("content", new StringReader(keyWord));


tokenStream.addAttribute(CharTermAttribute.class);


while (tokenStream.incrementToken()) {


CharTermAttribute charTermAttribute = tokenStream.getAttribute(CharTermAttribute.class);


System.out.println(new String(charTermAttribute.buffer()));


}


}


}


打印出來的分詞結果:



  可以看到”2012“作為一個詞,“歐洲杯四強賽”也是作為一個詞,停用詞”年“已被過濾掉。

0 個評論

要回覆文章請先登錄註冊