`
linliangyi2007
  • 浏览: 1003761 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

lucene开源中文分词器 IKAnalyzer2.0.2 共享及源码发布

阅读更多
最新版IKAnalyzer 3.0已发布,详细请浏览:http://linliangyi2007.iteye.com/blog/429960

客户词典扩展API,补充说明:
类 : org.mira.lucene.analysis.dict.Dictionary
方法 :public static void loadExtendWords(List wordList)
(PS:实际上该API一直存在于v2.0.2,都怪俺没做好API文档,自己汗一下 )

使用说明:
IKAnalyzer基于lucene2.0版本API开发,实现了以词典分词为基础的正反向全切分算法,是Lucene Analyzer接口的实现,代码使用例子如下:
import org.mira.lucene.analysis.IK_CAnalyzer <------- 引用类
import .....

public class IKAnalyzerTest extends TestCase {

   RAMDirectory directory;
   private IndexSearcher searcher;

   public void setUp() throws Exception {

     directory = new RAMDirectory();
     IndexWriter writer = new IndexWriter(directory,
                      new IK_CAnalyzer(), <------- 实例化类
                          true);

     Document doc = new Document();
     doc.add(Field.Keyword("title", "中文分词测试"));
     doc.add(Field.Text("description", "Illidium Space Modulator"));
     writer.addDocument(doc);
     writer.close();
     searcher = new IndexSearcher(directory);
  }

  public void testTermQuery() throws Exception {
    Query query = new TermQuery(new Term("title", "中文分词"));
    Hits hits = searcher.search(query);
    assertEquals(1, hits.length());
  }
}


分词效果测试,命令行如下:
java -classpath IKAnalyzer.jar;lucene-core-2.0.0.jar org.mira.lucene.analysis.IK_CAnalyzer 中华人民共和国香港特别行政区

性能与特性:
1. 正向全切分算法,42万汉字字符/每秒的处理能力(IBM ThinkPad 酷睿I 1.6G 1G内存 WinXP)
2. 对数量词、地名、路名的优化处理
3. 对未知词汇采用自识别结合二元切分算法,确保搜索召回率

V 2.0.2 修订 Bata版对二元切分的缺陷

正向全切分分词器:org.mira.lucene.analysis.IK_CAnalyzer(适合建索引时使用)

正向最大全切分分词器:org.mira.lucene.analysis.MIK_CAnalyzer(适合用户输入检索时使用)

下面演示“正向最大全切分分词器”效果:

例子:中华人民共和国香港特别行政区
0 - 7 = 中华人民共和国
7 - 14 = 香港特别行政区


例子:据路透社报道,印度尼西亚社会事务部一官员星期二(29日)表示,日惹市附近当地时间27日晨5时53分发

生的里氏6.2级地震已经造成至少5427人死亡?,20000余人受伤,近20万人无家可归。
1 - 4 = 路透社
4 - 6 = 报道
7 - 12 = 印度尼西亚
12 - 14 = 社会
14 - 17 = 事务部
17 - 18 = 一
18 - 20 = 官员
20 - 23 = 星期二
24 - 27 = 29日
28 - 30 = 表示
31 - 34 = 日惹市
34 - 36 = 附近
36 - 40 = 当地时间
40 - 43 = 27日
43 - 44 = 晨
44 - 46 = 5时
46 - 49 = 53分
48 - 50 = 分发
49 - 51 = 发生
52 - 54 = 里氏
54 - 58 = 6.2级
58 - 60 = 地震
60 - 62 = 已经
62 - 64 = 造成
64 - 66 = 至少
66 - 71 = 5427人
71 - 73 = 死亡
74 - 79 = 20000
79 - 81 = 余人
81 - 83 = 受伤
84 - 85 = 近
85 - 89 = 20万人
89 - 93 = 无家可归

一年后才发现没有上传jar包,汗到火星鸟!!
25
1
分享到:
评论
74 楼 我的沉默你不懂 2012-03-07  
您好!请问词典文件可以是utf16的吗?如何能让IK支持UTF-16【小头】编码的词典扩展呢?
73 楼 chennaid2 2011-09-06  
谢谢 您 正缺这方面的学习资料;
另外想咨询您 IK_CAnalyzer和IKAnalyzer的区别???
72 楼 laizhiming1989 2009-08-26  
  
71 楼 linliangyi2007 2009-04-07  
herrapfel 写道

linliangyi2007 写道
herrapfel 写道
我把字典都转换成&amp;amp;nbsp; \u661f 这种格式后,在WINDOWS下测试不能分词,比如说,测试中文是 "\u4E2D\u56FD\u4EBA\u52A0\u6CB9" 输出还是:&amp;amp;nbsp; =====je analyzer====中国人加油没有进行任何分词请问该如何解决????你试试直接写中文吧你的java开发环境是什么编码的?UTF-8还是GBK?


中文也是一样的

ECLIPSE的编译环境原来是GBK,我刚改成UTF-8是了一下,同样也是不分词的.


你把读取字典的编码修改一下吧,尝试不用编码的读取,或者使用iso-8859-1,目前的症状更像你的字典没有载入成功
70 楼 herrapfel 2009-04-07  
linliangyi2007 写道

herrapfel 写道
我把字典都转换成&amp;nbsp; \u661f 这种格式后,在WINDOWS下测试不能分词,比如说,测试中文是 "\u4E2D\u56FD\u4EBA\u52A0\u6CB9" 输出还是:&amp;nbsp; =====je analyzer====中国人加油没有进行任何分词请问该如何解决????你试试直接写中文吧你的java开发环境是什么编码的?UTF-8还是GBK?


中文也是一样的

ECLIPSE的编译环境原来是GBK,我刚改成UTF-8是了一下,同样也是不分词的.
69 楼 linliangyi2007 2009-04-07  
herrapfel 写道

我把字典都转换成&nbsp; \u661f 这种格式后,在WINDOWS下测试不能分词,比如说,测试中文是 "\u4E2D\u56FD\u4EBA\u52A0\u6CB9"

输出还是:&nbsp;

=====je analyzer====
中国人加油


没有进行任何分词

请问该如何解决????


你试试直接写中文吧
你的java开发环境是什么编码的?UTF-8还是GBK?
68 楼 herrapfel 2009-04-07  
我把字典都转换成  \u661f 这种格式后,在WINDOWS下测试不能分词,比如说,测试中文是 "\u4E2D\u56FD\u4EBA\u52A0\u6CB9"

输出还是: 

=====je analyzer====
中国人加油


没有进行任何分词

请问该如何解决????
67 楼 linliangyi2007 2009-04-07  
herrapfel 写道


请教两个问题:

1.new String( str.getBytes("gbk"),"utf-8"); 这种方式可以转成 \u661f\ 这种格式的UTF-8吗?

2.另外如果我将字典里的文字写成 &amp;#x636e;这种UTF-8的话,需要修改哪个类才能让分词的时候不出现这种分词结果.

2 - 3 = x
3 - 6 = 636
6 - 7 = e
10 - 11 = x
11 - 12 = 8
12 - 15 = def



1.字符窜可以转成UTF-8编码,但编码本身是不会被输出的。
2.那个是分词器对数字和字母的切分算法,跟词典没有关系,修改词典是没有用的。IK2.0.2版本是将字母和数字进行切分了
66 楼 herrapfel 2009-04-07  
linliangyi2007 写道

herrapfel 写道
linliangyi2007 写道herrapfel 写道linliangyi2007 写道herrapfel 写道linliangyi2007 写道herrapfel 写道是否可以解释一下,已经在XP的ECLIPSE下测试通过的代码,为什么在UNIX ,分词就不成功呢,谢谢.请赐教.这块可能是IK在字典上的处理不妥。IK采用了GBK的本地编码来存储字典,这个常常会造成在Linux和Unix环境下字典载入乱码,从而使的分词失败有什么办法可以解决吗? 1.获取IK的源码2.将字典目录下的dic文件,在Windows环境下使用jdk的nativetoascii.exe将格式从GBK转化成UTF-83.修改Dictionary类中所有的字典load方法,将InputStreamReader中的编码修改为“UTF-8”dic文件都转成了这种内容的\u4e00\u5c0f\u5f04\u4e00\u90fd\u9547\u4e01\u4ed4\u5df7\u4e03\u661f\u4e95Dictionary类中所有的字典load方法,将InputStreamReader中的编码也修改为了UTF-8,但是通过public static String transJe(String testString,String c1,String c2) {String result = "";try { Analyzer analyzer = new MIK_CAnalyzer(); Reader r = new StringReader(testString); TokenStream ts = (TokenStream)analyzer.tokenStream("", r); System.out.println("=====je analyzer===="); Token t;while ((t = ts.next()) != null) {result += t.termText()+",";}}catch(Exception e){e.printStackTrace();}return result;} 你先试着在windows下面看看能不能分词。windows下在eclipse里是可以正常分词的那就是你在unix下读取的待分词的文字,其编码不是UTF-8的了,需要进行转换


请教两个问题:

1.new String( str.getBytes("gbk"),"utf-8"); 这种方式可以转成 \u661f\ 这种格式的UTF-8吗?

2.另外如果我将字典里的文字写成 &#x636e;这种UTF-8的话,需要修改哪个类才能让分词的时候不出现这种分词结果.

2 - 3 = x
3 - 6 = 636
6 - 7 = e
10 - 11 = x
11 - 12 = 8
12 - 15 = def
65 楼 linliangyi2007 2009-04-04  
herrapfel 写道

linliangyi2007 写道
herrapfel 写道
linliangyi2007 写道herrapfel 写道linliangyi2007 写道herrapfel 写道是否可以解释一下,已经在XP的ECLIPSE下测试通过的代码,为什么在UNIX ,分词就不成功呢,谢谢.请赐教.这块可能是IK在字典上的处理不妥。IK采用了GBK的本地编码来存储字典,这个常常会造成在Linux和Unix环境下字典载入乱码,从而使的分词失败有什么办法可以解决吗? 1.获取IK的源码2.将字典目录下的dic文件,在Windows环境下使用jdk的nativetoascii.exe将格式从GBK转化成UTF-83.修改Dictionary类中所有的字典load方法,将InputStreamReader中的编码修改为“UTF-8”dic文件都转成了这种内容的\u4e00\u5c0f\u5f04\u4e00\u90fd\u9547\u4e01\u4ed4\u5df7\u4e03\u661f\u4e95Dictionary类中所有的字典load方法,将InputStreamReader中的编码也修改为了UTF-8,但是通过public static String transJe(String testString,String c1,String c2) {String result = "";try { Analyzer analyzer = new MIK_CAnalyzer(); Reader r = new StringReader(testString); TokenStream ts = (TokenStream)analyzer.tokenStream("", r); System.out.println("=====je analyzer===="); Token t;while ((t = ts.next()) != null) {result += t.termText()+",";}}catch(Exception e){e.printStackTrace();}return result;} 你先试着在windows下面看看能不能分词。

windows下在eclipse里是可以正常分词的


那就是你在unix下读取的待分词的文字,其编码不是UTF-8的了,需要进行转换
64 楼 herrapfel 2009-04-04  
linliangyi2007 写道

herrapfel 写道
linliangyi2007 写道herrapfel 写道linliangyi2007 写道herrapfel 写道是否可以解释一下,已经在XP的ECLIPSE下测试通过的代码,为什么在UNIX ,分词就不成功呢,谢谢.请赐教.这块可能是IK在字典上的处理不妥。IK采用了GBK的本地编码来存储字典,这个常常会造成在Linux和Unix环境下字典载入乱码,从而使的分词失败有什么办法可以解决吗? 1.获取IK的源码2.将字典目录下的dic文件,在Windows环境下使用jdk的nativetoascii.exe将格式从GBK转化成UTF-83.修改Dictionary类中所有的字典load方法,将InputStreamReader中的编码修改为“UTF-8”dic文件都转成了这种内容的\u4e00\u5c0f\u5f04\u4e00\u90fd\u9547\u4e01\u4ed4\u5df7\u4e03\u661f\u4e95Dictionary类中所有的字典load方法,将InputStreamReader中的编码也修改为了UTF-8,但是通过public static String transJe(String testString,String c1,String c2) {String result = "";try { Analyzer analyzer = new MIK_CAnalyzer(); Reader r = new StringReader(testString); TokenStream ts = (TokenStream)analyzer.tokenStream("", r); System.out.println("=====je analyzer===="); Token t;while ((t = ts.next()) != null) {result += t.termText()+",";}}catch(Exception e){e.printStackTrace();}return result;} 你先试着在windows下面看看能不能分词。

windows下在eclipse里是可以正常分词的
63 楼 linliangyi2007 2009-04-03  
herrapfel 写道

linliangyi2007 写道
herrapfel 写道
linliangyi2007 写道herrapfel 写道是否可以解释一下,已经在XP的ECLIPSE下测试通过的代码,为什么在UNIX ,分词就不成功呢,谢谢.请赐教.这块可能是IK在字典上的处理不妥。IK采用了GBK的本地编码来存储字典,这个常常会造成在Linux和Unix环境下字典载入乱码,从而使的分词失败有什么办法可以解决吗? 1.获取IK的源码2.将字典目录下的dic文件,在Windows环境下使用jdk的nativetoascii.exe将格式从GBK转化成UTF-83.修改Dictionary类中所有的字典load方法,将InputStreamReader中的编码修改为“UTF-8”

dic文件都转成了这种内容的
\u4e00\u5c0f\u5f04
\u4e00\u90fd\u9547
\u4e01\u4ed4\u5df7
\u4e03\u661f\u4e95
Dictionary类中所有的字典load方法,将InputStreamReader中的编码也修改为了UTF-8,但是通过

public static String transJe(String testString,String c1,String c2)
{
String result = "";
try
{
Analyzer analyzer = new MIK_CAnalyzer();
Reader r = new StringReader(testString);
TokenStream ts = (TokenStream)analyzer.tokenStream("", r);
System.out.println("=====je analyzer====");
Token t;
while ((t = ts.next()) != null)
{
result += t.termText()+",";
}
}
catch(Exception e)
{
e.printStackTrace();
}
return result;
}


你先试着在windows下面看看能不能分词。
62 楼 linliangyi2007 2009-04-03  
herrapfel 写道

Exception in thread "main" java.lang.NoSuchMethodError


这个异常可能是你使用的jdk版本同我打包时用的jdk版本不同的原因
61 楼 herrapfel 2009-04-03  
herrapfel 写道

linliangyi2007 写道
herrapfel 写道 linliangyi2007 写道herrapfel 写道是否可以解释一下,已经在XP的ECLIPSE下测试通过的代码,为什么在UNIX ,分词就不成功呢,谢谢.请赐教.这块可能是IK在字典上的处理不妥。IK采用了GBK的本地编码来存储字典,这个常常会造成在Linux和Unix环境下字典载入乱码,从而使的分词失败有什么办法可以解决吗? 1.获取IK的源码2.将字典目录下的dic文件,在Windows环境下使用jdk的nativetoascii.exe将格式从GBK转化成UTF-83.修改Dictionary类中所有的字典load方法,将InputStreamReader中的编码修改为“UTF-8” dic文件都转成了这种内容的 \u4e00\u5c0f\u5f04 \u4e00\u90fd\u9547 \u4e01\u4ed4\u5df7 \u4e03\u661f\u4e95 Dictionary类中所有的字典load方法,将InputStreamReader中的编码也修改为了UTF-8,但是通过 public static String transJe(String testString,String c1,String c2) { String result = ""; try { Analyzer analyzer = new MIK_CAnalyzer(); Reader r = new StringReader(testString); TokenStream ts = (TokenStream)analyzer.tokenStream("", r); System.out.println("=====je analyzer===="); Token t; while ((t = ts.next()) != null) { result += t.termText()+","; } } catch(Exception e) { e.printStackTrace(); } return result; }

还是没有调用成功用刚才发的方法,还是没有分词
60 楼 herrapfel 2009-04-03  
linliangyi2007 写道

herrapfel 写道
linliangyi2007 写道herrapfel 写道是否可以解释一下,已经在XP的ECLIPSE下测试通过的代码,为什么在UNIX ,分词就不成功呢,谢谢.请赐教.这块可能是IK在字典上的处理不妥。IK采用了GBK的本地编码来存储字典,这个常常会造成在Linux和Unix环境下字典载入乱码,从而使的分词失败有什么办法可以解决吗? 1.获取IK的源码2.将字典目录下的dic文件,在Windows环境下使用jdk的nativetoascii.exe将格式从GBK转化成UTF-83.修改Dictionary类中所有的字典load方法,将InputStreamReader中的编码修改为“UTF-8”

dic文件都转成了这种内容的
\u4e00\u5c0f\u5f04
\u4e00\u90fd\u9547
\u4e01\u4ed4\u5df7
\u4e03\u661f\u4e95
Dictionary类中所有的字典load方法,将InputStreamReader中的编码也修改为了UTF-8,但是通过

public static String transJe(String testString,String c1,String c2)
{
String result = "";
try
{
Analyzer analyzer = new MIK_CAnalyzer();
Reader r = new StringReader(testString);
TokenStream ts = (TokenStream)analyzer.tokenStream("", r);
System.out.println("=====je analyzer====");
Token t;
while ((t = ts.next()) != null)
{
result += t.termText()+",";
}
}
catch(Exception e)
{
e.printStackTrace();
}
return result;
}
59 楼 herrapfel 2009-04-03  
Exception in thread "main" java.lang.NoSuchMethodError
herrapfel 写道

linliangyi2007 写道
herrapfel 写道 linliangyi2007 写道herrapfel 写道linliangyi2007 写道herrapfel 写道linliangyi2007 写道herrapfel 写道是否可以解释一下,已经在XP的ECLIPSE下测试通过的代码,为什么在UNIX ,分词就不成功呢,谢谢.请赐教.这块可能是IK在字典上的处理不妥。IK采用了GBK的本地编码来存储字典,这个常常会造成在Linux和Unix环境下字典载入乱码,从而使的分词失败有什么办法可以解决吗? 1.获取IK的源码2.将字典目录下的dic文件,在Windows环境下使用jdk的nativetoascii.exe将格式从GBK转化成UTF-83.修改Dictionary类中所有的字典load方法,将InputStreamReader中的编码修改为“UTF-8”nativetoascii.exelinliangyi2007 写道herrapfel 写道linliangyi2007 写道herrapfel 写道是否可以解释一下,已经在XP的ECLIPSE下测试通过的代码,为什么在UNIX ,分词就不成功呢,谢谢.请赐教.这块可能是IK在字典上的处理不妥。IK采用了GBK的本地编码来存储字典,这个常常会造成在Linux和Unix环境下字典载入乱码,从而使的分词失败有什么办法可以解决吗? 1.获取IK的源码2.将字典目录下的dic文件,在Windows环境下使用jdk的nativetoascii.exe将格式从GBK转化成UTF-83.修改Dictionary类中所有的字典load方法,将InputStreamReader中的编码修改为“UTF-8”IK_CAnalyzer在重新编译的时候报 import org.mira.lucene.lib.TokenTree; 没有这个类找遍了整个源代码文件夹也没有找到这个类和目录.不好意思,那个是我做实验的类,去掉那行就好,没有用的,呵呵已经去掉了,但是我执行 Dictionary 的main方法后报下面的错Exception in thread "main" java.lang.OutOfMemoryError: Java heap spaceat org.mira.lucene.analysis.dict.DictSegment.addWord(DictSegment.java:22)at org.mira.lucene.analysis.dict.DictSegment.addWord(DictSegment.java:31)at org.mira.lucene.analysis.dict.DictSegment.addWord(DictSegment.java:31)at org.mira.lucene.analysis.dict.Dictionary.&amp;amp;lt;init&amp;amp;gt;(Dictionary.java:61)at org.mira.lucene.analysis.dict.Dictionary.load(Dictionary.java:66)at org.mira.lucene.analysis.dict.Dictionary.main(Dictionary.java:536)我做的改动是BufferedReader br = new BufferedReader(new InputStreamReader(is , "UTF-8"), 512);IK分词器词典有22w,自身启动的时候,在GBK情况下需要有45-50M的内存空间占用,估计你的jvm内存设置是默认的64M,编码改变后,对存储空间占用可能变大,请改变一下jvm的运行参数吧&amp;nbsp;&amp;nbsp; -Xms128M -Xmx256M 内存改后可以调试了,但我将我改过后的 Dictionary.class 覆盖了IKAnalyzer2.0.2OBF.jar 后,用这个方法测试 Analyzer analyzer = new MIK_CAnalyzer(); Reader r = new StringReader(testString); TokenStream ts = (TokenStream)analyzer.tokenStream("", r); System.out.println("=====je analyzer===="); Token t; while ((t = ts.next()) != null) { result += t.termText()+","; //System.out.println(t.termText()); } 后报下面的错误,如果方便的话 加我QQ:356104 Exception in thread "main" java.lang.NoSuchMethodError: org.mira.lucene.analysis.dict.Dictionary.a()Lorg/mira/lucene/analysis/dict/Dictionary; at org.mira.lucene.analysis.a.&lt;init&gt;(Unknown Source) at org.mira.lucene.analysis.MIK_CAnalyzer.tokenStream(Unknown Source) at com.sohu.wm.search.JeAnalyzer.transJe(JeAnalyzer.java:90) at com.sohu.wm.search.JeAnalyzer.main(JeAnalyzer.java:119)




明白了,你的源代码里的类和IKAnalyzer2.0.2OBF.jar 的类构造是不一样的.

只能把源代码再导成个新的JAR包了
58 楼 herrapfel 2009-04-03  
linliangyi2007 写道

herrapfel 写道
linliangyi2007 写道herrapfel 写道linliangyi2007 写道herrapfel 写道linliangyi2007 写道herrapfel 写道是否可以解释一下,已经在XP的ECLIPSE下测试通过的代码,为什么在UNIX ,分词就不成功呢,谢谢.请赐教.这块可能是IK在字典上的处理不妥。IK采用了GBK的本地编码来存储字典,这个常常会造成在Linux和Unix环境下字典载入乱码,从而使的分词失败有什么办法可以解决吗? 1.获取IK的源码2.将字典目录下的dic文件,在Windows环境下使用jdk的nativetoascii.exe将格式从GBK转化成UTF-83.修改Dictionary类中所有的字典load方法,将InputStreamReader中的编码修改为“UTF-8”nativetoascii.exelinliangyi2007 写道herrapfel 写道linliangyi2007 写道herrapfel 写道是否可以解释一下,已经在XP的ECLIPSE下测试通过的代码,为什么在UNIX ,分词就不成功呢,谢谢.请赐教.这块可能是IK在字典上的处理不妥。IK采用了GBK的本地编码来存储字典,这个常常会造成在Linux和Unix环境下字典载入乱码,从而使的分词失败有什么办法可以解决吗? 1.获取IK的源码2.将字典目录下的dic文件,在Windows环境下使用jdk的nativetoascii.exe将格式从GBK转化成UTF-83.修改Dictionary类中所有的字典load方法,将InputStreamReader中的编码修改为“UTF-8”IK_CAnalyzer在重新编译的时候报 import org.mira.lucene.lib.TokenTree; 没有这个类找遍了整个源代码文件夹也没有找到这个类和目录.不好意思,那个是我做实验的类,去掉那行就好,没有用的,呵呵已经去掉了,但是我执行 Dictionary 的main方法后报下面的错Exception in thread "main" java.lang.OutOfMemoryError: Java heap spaceat org.mira.lucene.analysis.dict.DictSegment.addWord(DictSegment.java:22)at org.mira.lucene.analysis.dict.DictSegment.addWord(DictSegment.java:31)at org.mira.lucene.analysis.dict.DictSegment.addWord(DictSegment.java:31)at org.mira.lucene.analysis.dict.Dictionary.&amp;lt;init&amp;gt;(Dictionary.java:61)at org.mira.lucene.analysis.dict.Dictionary.load(Dictionary.java:66)at org.mira.lucene.analysis.dict.Dictionary.main(Dictionary.java:536)我做的改动是BufferedReader br = new BufferedReader(new InputStreamReader(is , "UTF-8"), 512);IK分词器词典有22w,自身启动的时候,在GBK情况下需要有45-50M的内存空间占用,估计你的jvm内存设置是默认的64M,编码改变后,对存储空间占用可能变大,请改变一下jvm的运行参数吧&nbsp;&nbsp; -Xms128M -Xmx256M



内存改后可以调试了,但我将我改过后的 Dictionary.class 覆盖了IKAnalyzer2.0.2OBF.jar 后,用这个方法测试

Analyzer analyzer = new MIK_CAnalyzer();
Reader r = new StringReader(testString);
TokenStream ts = (TokenStream)analyzer.tokenStream("", r);
System.out.println("=====je analyzer====");
Token t;
while ((t = ts.next()) != null)
{
result += t.termText()+",";
//System.out.println(t.termText());
}
后报下面的错误,如果方便的话 加我QQ:356104

Exception in thread "main" java.lang.NoSuchMethodError: org.mira.lucene.analysis.dict.Dictionary.a()Lorg/mira/lucene/analysis/dict/Dictionary;
at org.mira.lucene.analysis.a.<init>(Unknown Source)
at org.mira.lucene.analysis.MIK_CAnalyzer.tokenStream(Unknown Source)
at com.sohu.wm.search.JeAnalyzer.transJe(JeAnalyzer.java:90)
at com.sohu.wm.search.JeAnalyzer.main(JeAnalyzer.java:119)
57 楼 linliangyi2007 2009-04-03  
herrapfel 写道

linliangyi2007 写道
herrapfel 写道
linliangyi2007 写道herrapfel 写道linliangyi2007 写道herrapfel 写道是否可以解释一下,已经在XP的ECLIPSE下测试通过的代码,为什么在UNIX ,分词就不成功呢,谢谢.请赐教.这块可能是IK在字典上的处理不妥。IK采用了GBK的本地编码来存储字典,这个常常会造成在Linux和Unix环境下字典载入乱码,从而使的分词失败有什么办法可以解决吗? 1.获取IK的源码2.将字典目录下的dic文件,在Windows环境下使用jdk的nativetoascii.exe将格式从GBK转化成UTF-83.修改Dictionary类中所有的字典load方法,将InputStreamReader中的编码修改为“UTF-8”nativetoascii.exelinliangyi2007 写道herrapfel 写道linliangyi2007 写道herrapfel 写道是否可以解释一下,已经在XP的ECLIPSE下测试通过的代码,为什么在UNIX ,分词就不成功呢,谢谢.请赐教.这块可能是IK在字典上的处理不妥。IK采用了GBK的本地编码来存储字典,这个常常会造成在Linux和Unix环境下字典载入乱码,从而使的分词失败有什么办法可以解决吗? 1.获取IK的源码2.将字典目录下的dic文件,在Windows环境下使用jdk的nativetoascii.exe将格式从GBK转化成UTF-83.修改Dictionary类中所有的字典load方法,将InputStreamReader中的编码修改为“UTF-8”IK_CAnalyzer在重新编译的时候报 import org.mira.lucene.lib.TokenTree; 没有这个类找遍了整个源代码文件夹也没有找到这个类和目录.不好意思,那个是我做实验的类,去掉那行就好,没有用的,呵呵



已经去掉了,但是我执行 Dictionary 的main方法后报下面的错

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at org.mira.lucene.analysis.dict.DictSegment.addWord(DictSegment.java:22)
at org.mira.lucene.analysis.dict.DictSegment.addWord(DictSegment.java:31)
at org.mira.lucene.analysis.dict.DictSegment.addWord(DictSegment.java:31)
at org.mira.lucene.analysis.dict.Dictionary.&lt;init&gt;(Dictionary.java:61)
at org.mira.lucene.analysis.dict.Dictionary.load(Dictionary.java:66)
at org.mira.lucene.analysis.dict.Dictionary.main(Dictionary.java:536)

我做的改动是
BufferedReader br = new BufferedReader(new InputStreamReader(is , "UTF-8"), 512);



IK分词器词典有22w,自身启动的时候,在GBK情况下需要有45-50M的内存空间占用,估计你的jvm内存设置是默认的64M,编码改变后,对存储空间占用可能变大,请改变一下jvm的运行参数吧   -Xms128M -Xmx256M
56 楼 herrapfel 2009-04-03  
linliangyi2007 写道

herrapfel 写道
linliangyi2007 写道herrapfel 写道linliangyi2007 写道herrapfel 写道是否可以解释一下,已经在XP的ECLIPSE下测试通过的代码,为什么在UNIX ,分词就不成功呢,谢谢.请赐教.这块可能是IK在字典上的处理不妥。IK采用了GBK的本地编码来存储字典,这个常常会造成在Linux和Unix环境下字典载入乱码,从而使的分词失败有什么办法可以解决吗? 1.获取IK的源码2.将字典目录下的dic文件,在Windows环境下使用jdk的nativetoascii.exe将格式从GBK转化成UTF-83.修改Dictionary类中所有的字典load方法,将InputStreamReader中的编码修改为“UTF-8”nativetoascii.exelinliangyi2007 写道herrapfel 写道linliangyi2007 写道herrapfel 写道是否可以解释一下,已经在XP的ECLIPSE下测试通过的代码,为什么在UNIX ,分词就不成功呢,谢谢.请赐教.这块可能是IK在字典上的处理不妥。IK采用了GBK的本地编码来存储字典,这个常常会造成在Linux和Unix环境下字典载入乱码,从而使的分词失败有什么办法可以解决吗? 1.获取IK的源码2.将字典目录下的dic文件,在Windows环境下使用jdk的nativetoascii.exe将格式从GBK转化成UTF-83.修改Dictionary类中所有的字典load方法,将InputStreamReader中的编码修改为“UTF-8”IK_CAnalyzer在重新编译的时候报 import org.mira.lucene.lib.TokenTree; 没有这个类找遍了整个源代码文件夹也没有找到这个类和目录.不好意思,那个是我做实验的类,去掉那行就好,没有用的,呵呵



已经去掉了,但是我执行 Dictionary 的main方法后报下面的错

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at org.mira.lucene.analysis.dict.DictSegment.addWord(DictSegment.java:22)
at org.mira.lucene.analysis.dict.DictSegment.addWord(DictSegment.java:31)
at org.mira.lucene.analysis.dict.DictSegment.addWord(DictSegment.java:31)
at org.mira.lucene.analysis.dict.Dictionary.<init>(Dictionary.java:61)
at org.mira.lucene.analysis.dict.Dictionary.load(Dictionary.java:66)
at org.mira.lucene.analysis.dict.Dictionary.main(Dictionary.java:536)

我做的改动是
BufferedReader br = new BufferedReader(new InputStreamReader(is , "UTF-8"), 512);
55 楼 linliangyi2007 2009-04-03  
herrapfel 写道

linliangyi2007 写道
herrapfel 写道
linliangyi2007 写道herrapfel 写道是否可以解释一下,已经在XP的ECLIPSE下测试通过的代码,为什么在UNIX ,分词就不成功呢,谢谢.请赐教.这块可能是IK在字典上的处理不妥。IK采用了GBK的本地编码来存储字典,这个常常会造成在Linux和Unix环境下字典载入乱码,从而使的分词失败有什么办法可以解决吗? 1.获取IK的源码2.将字典目录下的dic文件,在Windows环境下使用jdk的nativetoascii.exe将格式从GBK转化成UTF-83.修改Dictionary类中所有的字典load方法,将InputStreamReader中的编码修改为“UTF-8”

nativetoascii.exelinliangyi2007 写道
herrapfel 写道
linliangyi2007 写道herrapfel 写道是否可以解释一下,已经在XP的ECLIPSE下测试通过的代码,为什么在UNIX ,分词就不成功呢,谢谢.请赐教.这块可能是IK在字典上的处理不妥。IK采用了GBK的本地编码来存储字典,这个常常会造成在Linux和Unix环境下字典载入乱码,从而使的分词失败有什么办法可以解决吗? 1.获取IK的源码2.将字典目录下的dic文件,在Windows环境下使用jdk的nativetoascii.exe将格式从GBK转化成UTF-83.修改Dictionary类中所有的字典load方法,将InputStreamReader中的编码修改为“UTF-8”



IK_CAnalyzer
在重新编译的时候报
import org.mira.lucene.lib.TokenTree; 没有这个类

找遍了整个源代码文件夹也没有找到这个类和目录.




不好意思,那个是我做实验的类,去掉那行就好,没有用的,呵呵

相关推荐

Global site tag (gtag.js) - Google Analytics