2009-07-26

Ubuntu下使用Java调用IKAnalyzer中文分词程序失效的解决方法

Posted in Java, FreeBSD/Unix服务器 at 20:12 Author:仲远

标签:

IKAnalyzer基于lucene2.0版本API开发,实现了以词典分词为基础的正反向全切分算法,是Lucene Analyzer接口的实现。经过与mmseg4j-1.7.2、庖丁解牛等其它中文分词程序比较后发现,IKAnalyzer的中文分词效果好,程序调用简单。所以采用IKAnalyzer作为我们中文分词的程序。

调用IKAnalyzer来进行中文分词的代码十分简单:

  1. /**
  2. * 传入一个中文语句,返回一个List列表,列表中的每一个元素是一个String类型的分词之后的中文词组
  3. */
  4. public static ArrayList<String> testJe(String testString) throws Exception {
  5.         ArrayList<String> tokenList = 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/ ]
原文链接:

2 Comments »

  1. 张鹏 said,

    2009年July27日 at 0:12

    哈,师兄好。我用过类似的一个俄罗斯人写的sphinx搜索引擎,并将sphinx成功运用在晒晒网(www.shaishai.cc)。关于lucene我不太清楚,我唯一知道的是lucene php版的不太好。不过我的一个朋友告诉我,lucene和sphinx对于大数据效果都不太好(他没有给我具体规模)。
    我想知道这个IKAnalyzer是否也是需要建立索引的?并且是否需要建立主索引+增量索引来更新数据?

  2. 仲远 said,

    2009年July27日 at 10:28

    这两个开源的搜索引擎都是非常有名的搭建全文搜索引擎的项目,用它们来搭建一个普通网站的全文搜索应该是绰绰有余了。

    IKAnalyzer实际上是实现了lucene的一些api,来实现的中文分词功能,而并不是用来建立索引的。

    lucene和sphinx都自带了分词功能,其中sphinx的中文分词据说已经很好,而lucene的中文分词也许还需要依靠IKanalyzer这个外部程序来改善一下。

Leave a Comment

*
To prove you're a person (not a spam script), type the security text shown in the picture. Click here to regenerate some new text.
Click to hear an audio file of the anti-spam word