Lucene的中文分詞器IKAnalyzer

分詞器對英文的支持是很是好的。java

通常分詞通過的流程:算法

1)切分關鍵詞apache

2)去除停用詞工具

3)把英文單詞轉爲小寫測試

可是老外寫的分詞器對中文分詞通常都是單字分詞,分詞的效果很差。優化

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

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)的高速處理能力。code

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

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:

複製代碼

1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">  
 3 <properties>  
 4     <comment>IK Analyzer 擴展配置</comment>
 5     <!--用戶能夠在這裏配置本身的擴展字典 -->
 6     <entry key="ext_dict">ext.dic;</entry> 
 7 
 8     <!--用戶能夠在這裏配置本身的擴展中止詞字典-->
 9     <entry key="ext_stopwords">stopword.dic;chinese_stopword.dic</entry> 
10     
11 </properties>

複製代碼

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

擴展詞典ext.dic須要爲UTF-8編碼。

ext.dic內容:

我把"2012"做爲一個詞,"歐洲盃四強賽"做爲一個詞。

測試分詞代碼:

1 package com.cndatacom.lucene.test;
 2 
 3 import java.io.StringReader;
 4 
 5 import org.apache.lucene.analysis.Analyzer;
 6 import org.apache.lucene.analysis.TokenStream;
 7 import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
 8 import org.junit.Test;
 9 import org.wltea.analyzer.lucene.IKAnalyzer;
10 
11 
12 /**
13  * IKAnalyzer 分詞器測試
14  * @author Luxh
15  */
16 public class IKAnalyzerTest {
17     
18     @Test
19     public void testIKAnalyzer() throws Exception {
20         
21         String keyWord = "2012年歐洲盃四強賽";
22         
23         IKAnalyzer analyzer = new IKAnalyzer();
24         
25         //使用智能分詞
26         analyzer.setUseSmart(true);
27         
28         //打印分詞結果
29         printAnalysisResult(analyzer,keyWord);
30         
31     }
32     
33     /**
34      * 打印出給定分詞器的分詞結果
35      * @param analyzer 分詞器
36      * @param keyWord 關鍵詞
37      * @throws Exception
38      */
39     private void printAnalysisResult(Analyzer analyzer, String keyWord) throws Exception {
40         System.out.println("當前使用的分詞器:" + analyzer.getClass().getSimpleName());
41         TokenStream tokenStream = analyzer.tokenStream("content", new StringReader(keyWord));
42         tokenStream.addAttribute(CharTermAttribute.class);
43         while (tokenStream.incrementToken()) {
44             CharTermAttribute charTermAttribute = tokenStream.getAttribute(CharTermAttribute.class);
45             System.out.println(new String(charTermAttribute.buffer()));
46         }
47     }
48 }

複製代碼

打印出來的分詞結果:

能夠看到」2012「做爲一個詞,「歐洲盃四強賽」也是做爲一個詞,停用詞」年「已被過濾掉。

相關文章
相關標籤/搜索