Ubuntu下使用Java調用IKAnalyzer中文分詞程序失效的解決方法

IKAnalyzer基於lucene2.0版本API開發,實現了以詞典分詞爲基礎的正反向全切分算法,是Lucene Analyzer接口的實現。經過與mmseg4j-1.7.2、庖丁解牛等其它中文分詞程序比較後發現,IKAnalyzer的中文分詞效果好,程序調用簡單。所以採用IKAnalyzer作爲我們中文分詞的程序。

調用IKAnalyzer來進行中文分詞的代碼十分簡單:

  1. /**
  2. * 傳入一箇中文語句,返回一個List列表,列表中的每一個元素是一個String類型的分詞之後的中文詞組
  3. */
  4. public static ArrayList<StringtestJe(StringtestString) throws Exception {
  5.         ArrayList<StringtokenList =new ArrayList<String>();
  6.         Analyzer analyzer = new IK_CAnalyzer();       
  7.        
  8.         Reader r = new StringReader(testString);
  9.         TokenStream ts = (TokenStream)analyzer.tokenStream(""r);
  10.         Token t;
  11.         while ((t = ts.next()) != null) {
  12.             tokenList.add(t.termText());
  13.              System.out.println(t.termText());
  14.         }
  15.         return tokenList;
  16.     }

這段代碼如果是在Windows下使用Eclipse來執行,或許能夠很好地進行中文分詞,但是當你把程序放在Linux下,例如Ubuntu下運行時,可能就會發現這個Java中文分詞程序突然“失效”了。這是由於IKAnalyzer1.4採用了GBK的本地編碼來存儲字典,而linux環境,例如Ubuntu默認字符編碼是UTF-8,這就會常常造成在Linux和Unix環境下字典載入亂碼,從而使分詞失敗。

解決辦法有2個:
1、將字典目錄下的dic文件,在Windows環境下使用jdk的nativetoascii.exe將格式從GBK轉化成UTF-8;
2、修改Dictionary類中所有的字典load方法,將InputStreamReader中的編碼修改爲“UTF-8”;

其中第一個解決辦法最爲簡單,具體步驟如下:1、對着IKAnalyzer1.4.jar點擊右鍵,將IKAnalyzer1.4.jar解壓到本地,進入org\mira\lucene\analysis\dict目錄下,發現有4個文件,用文本編輯器打開,然後用UTF-8格式“另存爲”來進行重新存儲,覆蓋原來的文件;
2、將解壓的文件重新使用zip格式進行壓縮。需要注意的是,最頂層目錄應該是org和META-INF;
3、將後綴名zip改爲jar即可。

然後使用新的jar替換原來的IKAnalyzer1.4.jar即可在Ubuntu下正常使用這個Java中文分詞程序了。

另外,如果你打算使用Ubuntu的Cron來定時執行這個java中文分詞程序,可能又會發現中文分詞程序失效,這是因爲Linux下的Cron環境變量可能與普通用戶登錄進去之後的環境變量不太一樣,因此還是由於默認的字符集不同,造成了程序無法正常進行中文分詞。解決辦法如下,在腳本中顯式地指明字符集爲UTF-8:

  1. #! /bin/bash
  2. . /home/wangzhongyuan/.profile
  3. LANG=zh_CN.UTF-8
  4. LC_ALL=zh_CN.UTF-8
  5. export LANG LC_ALL

然後就可以在腳本中在調用java程序,就能夠使用Ubuntu的Cron來定時執行這個中文分詞程序了。

本文可以自由轉載,轉載時請保留全文並註明出處:
轉載自仲子說 [ http://www.wangzhongyuan.com/ ]
原文鏈接:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章