開源中文分詞框架分詞效果對比smartcn與IKanalyzer

1、引言:java

  中文分詞一直是天然語言處理的一個痛處,早在08年的時候,就曾經有項目涉及到相關的應用(Lunce構建全文搜索引擎),那時的痛,沒想到5年後的今天依然存在,切分效果、擴展支持、業務應用等方面依然不甚理想。收費的版本不提了,緣由自沒必要言表,開源版本中,發現以前曾經活躍的版本,大多已經沒落(好幾年沒更新了),存活下來的寥寥無幾。我是一個守舊的人,評估版本的選擇有些保守,至少目前爲止,只看1.0正式版本以後的版本,0.XX的不在考慮範圍以內,用了一個週末的時間,對比了十多款的樣子,我的感受源於中科院ICTCLAS的smartcn和IKAnanlyzer效果仍是不錯的。apache

2、結果對比搜索引擎

2.1 原始文本spa

"lucene\分析器\使用\分詞器\和\過濾器\構成\一個\「管道」,文本\在\流經\這個\管道\後\成爲\能夠\進入\索引\的\最小單位,所以,一個\標準\的分析器有兩個部分組成,一個是分詞器tokenizer,它用於將文本按照規則切分爲一個個能夠進入索引的最小單位。另一個是TokenFilter,它主要做用是對切出來的詞進行進一步的處理(如去掉敏感詞、英文大小寫轉換、單複數處理)等。lucene中的Tokenstram方法首先建立一個tokenizer對象處理Reader對象中的流式文本,而後利用TokenFilter對輸出流進行過濾處理";
2.2 smartcncode

lucen\分析器\使用\分詞\器\和\過濾器\構成\一個\管道\文本\流經\這個\管道\後\成爲\能夠\進入\索引\最\小\單位\所以\一個\標準\分析器\有\兩\個\部分\組成\一個\分詞\器\token\它\用於\將\文本\按照\規則\切分\爲\一個\個\能夠\進入\索引\最\小\單位\另外\一個\tokenfilt\它\主要\做用\對\切\出來\詞\進行\進一步\處理\如\去掉\敏感\詞\英文\大小寫\轉換\單\複數\處理\等\lucen\中\tokenstram\方法\首先\建立\一\個\token\對象\處理\reader\對象\中\式\文本\而後\利用\tokenfilt\對\輸出\進行\過濾\處理\對象

2.3 IKanalyzerblog

lucene\分析器\分析\器使\使用\分詞器\分詞\器\和\過濾器\過濾\濾器\構成\一個\一\個\管道\文本\在\流經\這個\管道\後\成爲\能夠\進入\索引\的\最小\單位\所以\一個\一\個\標準\的\分析器\分析\器\有\兩個\兩\個\部分\分組\組成\一個是\一個\一\個\是\分詞器\分詞\器\tokenizer\它用\用於\將\文本\按照\規則\切分\切\分爲\一個個\一個\一\個個\個\個\能夠\進入\索引\的\最小\單位\另外\一個是\一個\一\個\是\tokenfilter\它\主要\做用\用是\對\切出來\切出\切\出來\的\詞\進行\行進\進一步\進一\一步\一\步\的\處理\如\去掉\敏感\詞\英文\大小寫\大小\小寫\轉換\單\複數\處理\等\lucene\中\的\tokenstram\方法\首先\建立\一個\一\個\tokenizer\對象\處理\reader\對象\中\的\流式\文本\而後\利用\tokenfilter\對\輸出\流進\進行\過濾\處理\索引

3、smartcn示例程序token

 1 package dictTest;
 2 
 3 import java.util.Iterator;
 4 
 5 import org.apache.lucene.analysis.TokenStream;
 6 import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
 7 import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
 8 import org.apache.lucene.analysis.util.CharArraySet;
 9 import org.apache.lucene.util.Version;
10 
11 public class SmartChineseAnalyzerTest {
12 
13     public static void main(String[] args) {
14         try {
15             // 要處理的文本
16             String text = "lucene分析器使用分詞器和過濾器構成一個「管道」,文本在流經這個管道後成爲能夠進入索引的最小單位,所以,一個標準的分析器有兩個部分組成,一個是分詞器tokenizer,它用於將文本按照規則切分爲一個個能夠進入索引的最小單位。另一個是TokenFilter,它主要做用是對切出來的詞進行進一步的處理(如去掉敏感詞、英文大小寫轉換、單複數處理)等。lucene中的Tokenstram方法首先建立一個tokenizer對象處理Reader對象中的流式文本,而後利用TokenFilter對輸出流進行過濾處理";
17             //String text = "目前我已經用了lucene4.0,雖然是alpha版,可是也是將來的第一步。可是IKAnalyzer不支持lucene4,若是做者在,是否有計劃對4支持?什麼時候支持?";
18             // 自定義停用詞
19             String[] self_stop_words = { "的", "在","了", "呢", ",", "0", ":", ",", "是", "流" };
20             CharArraySet cas = new CharArraySet(Version.LUCENE_46, 0, true);
21             for (int i = 0; i < self_stop_words.length; i++) {
22                 cas.add(self_stop_words[i]);
23             }
24 
25             // 加入系統默認停用詞
26             Iterator<Object> itor = SmartChineseAnalyzer.getDefaultStopSet().iterator();
27             while (itor.hasNext()) {
28                 cas.add(itor.next());
29             }
30             
31 
32             // 中英文混合分詞器(其餘幾個分詞器對中文的分析都不行)
33             SmartChineseAnalyzer sca = new SmartChineseAnalyzer(Version.LUCENE_46, cas);
34 
35             TokenStream ts = sca.tokenStream("field", text);
36             CharTermAttribute ch = ts.addAttribute(CharTermAttribute.class);
37 
38             ts.reset();
39             while (ts.incrementToken()) {
40                 System.out.print(ch.toString()+"\\");
41             }
42             ts.end();
43             ts.close();
44         } catch (Exception ex) {
45             ex.printStackTrace();
46         }
47     }
48 
49 }

4、IKanalyzer示例程序rem

 1 package dictTest;
 2 
 3 import org.wltea.analyzer.*;
 4 import org.apache.lucene.analysis.Analyzer;
 5 import org.apache.lucene.analysis.TokenStream;
 6 import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
 7 import org.wltea.analyzer.lucene.*;
 8 
 9 public class IKAnalyzerTest {
10 
11     public static void main(String[] args) {
12         // TODO Auto-generated method stub
13         Analyzer ik  = new IKAnalyzer();
14         try{
15             String text = "lucene分析器使用分詞器和過濾器構成一個「管道」,文本在流經這個管道後成爲能夠進入索引的最小單位,所以,一個標準的分析器有兩個部分組成,一個是分詞器tokenizer,它用於將文本按照規則切分爲一個個能夠進入索引的最小單位。另一個是TokenFilter,它主要做用是對切出來的詞進行進一步的處理(如去掉敏感詞、英文大小寫轉換、單複數處理)等。lucene中的Tokenstram方法首先建立一個tokenizer對象處理Reader對象中的流式文本,而後利用TokenFilter對輸出流進行過濾處理";
16             TokenStream ts = ik.tokenStream("field", text);
17             
18             CharTermAttribute ch = ts.addAttribute(CharTermAttribute.class);
19 
20             ts.reset();
21             while (ts.incrementToken()) {
22                 //System.out.println(ch.toString());
23                 System.out.print(ch.toString() + "\\");
24             }
25             ts.end();
26             ts.close();
27             
28         } catch (Exception ex) {
29             ex.printStackTrace();
30         }    
31         
32     }
33 }

5、結論

1.兩者分詞效果,相比其餘已經不錯,都值得確定;

2.smartcn爲Lucene4.6版本自帶(以前版本也有),中文分詞不錯,英文分詞有問題,Lucene分詞後變成了Luncn;

3.IKAnalyzer分詞後的碎片太多,能夠和人工分析效果作對比;

4.從自定義詞庫的角度考慮,由於smartcn在Lucene4.6中的版本,目前不支持自定義詞庫,成爲致命缺陷,只能放棄。

相關文章
相關標籤/搜索