一、引言:
中文分詞一直是自然語(yǔ)言處理的一個(gè)痛處,早在08年的時(shí)候,就曾經(jīng)有項目涉及到相關(guān)的應用(Lunce構建全文搜索引擎),那時(shí)的痛,沒(méi)想到5年后的今天依然存在,切分效果、擴展支持、業(yè)務(wù)應用等方面依然不甚理想。收費的版本不提了,原因自不必言表,開(kāi)源版本中,發(fā)現之前曾經(jīng)活躍的版本,大多已經(jīng)沒(méi)落(好幾年沒(méi)更新了),存活下來(lái)的寥寥無(wú)幾。我是一個(gè)守舊的人,評估版本的選擇有些保守,至少目前為止,只看1.0正式版本之后的版本,0.XX的不在考慮范圍之內,用了一個(gè)周末的時(shí)間,對比了十多款的樣子,個(gè)人感覺(jué)源于中科院ICTCLAS的smartcn和IKAnanlyzer效果還是不錯的。
二、結果對比
2.1 原始文本
"lucene\分析器\使用\分詞器\和\過(guò)濾器\構成\一個(gè)\“管道”,文本\在\流經(jīng)\這個(gè)\管道\后\成為\可以\進(jìn)入\索引\的\最小單位,因此,一個(gè)\標準\的分析器有兩個(gè)部分組成,一個(gè)是分詞器tokenizer,它用于將文本按照規則切分為一個(gè)個(gè)可以進(jìn)入索引的最小單位。另外一個(gè)是TokenFilter,它主要作用是對切出來(lái)的詞進(jìn)行進(jìn)一步的處理(如去掉敏感詞、英文大小寫(xiě)轉換、單復數處理)等。lucene中的Tokenstram方法首先創(chuàng )建一個(gè)tokenizer對象處理Reader對象中的流式文本,然后利用TokenFilter對輸出流進(jìn)行過(guò)濾處理";
2.2 smartcn
lucen\分析器\使用\分詞\器\和\過(guò)濾器\構成\一個(gè)\管道\文本\流經(jīng)\這個(gè)\管道\后\成為\可以\進(jìn)入\索引\最\小\單位\因此\一個(gè)\標準\分析器\有\兩\個(gè)\部分\組成\一個(gè)\分詞\器\token\它\用于\將\文本\按照\規則\切分\為\一個(gè)\個(gè)\可以\進(jìn)入\索引\最\小\單位\另外\一個(gè)\tokenfilt\它\主要\作用\對\切\出來(lái)\詞\進(jìn)行\進(jìn)一步\處理\如\去掉\敏感\詞\英文\大小寫(xiě)\轉換\單\復數\處理\等\lucen\中\tokenstram\方法\首先\創(chuàng )建\一\個(gè)\token\對象\處理\reader\對象\中\式\文本\然后\利用\tokenfilt\對\輸出\進(jìn)行\過(guò)濾\處理\
2.3 IKanalyzer
lucene\分析器\分析\器使\使用\分詞器\分詞\器\和\過(guò)濾器\過(guò)濾\濾器\構成\一個(gè)\一\個(gè)\管道\文本\在\流經(jīng)\這個(gè)\管道\后\成為\可以\進(jìn)入\索引\的\最小\單位\因此\一個(gè)\一\個(gè)\標準\的\分析器\分析\器\有\兩個(gè)\兩\個(gè)\部分\分組\組成\一個(gè)是\一個(gè)\一\個(gè)\是\分詞器\分詞\器\tokenizer\它用\用于\將\文本\按照\規則\切分\切\分為\一個(gè)個(gè)\一個(gè)\一\個(gè)個(gè)\個(gè)\個(gè)\可以\進(jìn)入\索引\的\最小\單位\另外\一個(gè)是\一個(gè)\一\個(gè)\是\tokenfilter\它\主要\作用\用是\對\切出來(lái)\切出\切\出來(lái)\的\詞\進(jìn)行\行進(jìn)\進(jìn)一步\進(jìn)一\一步\一\步\的\處理\如\去掉\敏感\詞\英文\大小寫(xiě)\大小\小寫(xiě)\轉換\單\復數\處理\等\lucene\中\的\tokenstram\方法\首先\創(chuàng )建\一個(gè)\一\個(gè)\tokenizer\對象\處理\reader\對象\中\的\流式\文本\然后\利用\tokenfilter\對\輸出\流進(jìn)\進(jìn)行\過(guò)濾\處理\
三、smartcn示例程序
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分析器使用分詞器和過(guò)濾器構成一個(gè)“管道”,文本在流經(jīng)這個(gè)管道后成為可以進(jìn)入索引的最小單位,因此,一個(gè)標準的分析器有兩個(gè)部分組成,一個(gè)是分詞器tokenizer,它用于將文本按照規則切分為一個(gè)個(gè)可以進(jìn)入索引的最小單位。另外一個(gè)是TokenFilter,它主要作用是對切出來(lái)的詞進(jìn)行進(jìn)一步的處理(如去掉敏感詞、英文大小寫(xiě)轉換、單復數處理)等。lucene中的Tokenstram方法首先創(chuàng )建一個(gè)tokenizer對象處理Reader對象中的流式文本,然后利用TokenFilter對輸出流進(jìn)行過(guò)濾處理";17 //String text = "目前我已經(jīng)用了lucene4.0,雖然是alpha版,但是也是未來(lái)的第一步。但是IKAnalyzer不支持lucene4,如果作者在,是否有計劃對4支持?何時(shí)支持?";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 // 中英文混合分詞器(其他幾個(gè)分詞器對中文的分析都不行)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 }
四、IKanalyzer示例程序
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 stub13 Analyzer ik = new IKAnalyzer();14 try{15 String text = "lucene分析器使用分詞器和過(guò)濾器構成一個(gè)“管道”,文本在流經(jīng)這個(gè)管道后成為可以進(jìn)入索引的最小單位,因此,一個(gè)標準的分析器有兩個(gè)部分組成,一個(gè)是分詞器tokenizer,它用于將文本按照規則切分為一個(gè)個(gè)可以進(jìn)入索引的最小單位。另外一個(gè)是TokenFilter,它主要作用是對切出來(lái)的詞進(jìn)行進(jìn)一步的處理(如去掉敏感詞、英文大小寫(xiě)轉換、單復數處理)等。lucene中的Tokenstram方法首先創(chuàng )建一個(gè)tokenizer對象處理Reader對象中的流式文本,然后利用TokenFilter對輸出流進(jìn)行過(guò)濾處理";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 }
五、結論
1.二者分詞效果,相比其他已經(jīng)不錯,都值得肯定;
2.smartcn為L(cháng)ucene4.6版本自帶(之前版本也有),中文分詞不錯,英文分詞有問(wèn)題,Lucene分詞后變成了Luncn;
3.IKAnalyzer分詞后的碎片太多,可以和人工分析效果做對比;
4.從自定義詞庫的角度考慮,因為smartcn在Lucene4.6中的版本,目前不支持自定義詞庫,成為致命缺陷,只能放棄。
聯(lián)系客服