`
linliangyi2007
  • 浏览: 1013153 次
  • 性别: 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; 没有这个类

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




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

相关推荐

    ikanalyzer2.0.2源码

    ikanalyzer2.0.2源码是针对中文分词任务设计的一个开源项目,它主要基于Java语言实现,广泛应用于搜索引擎、信息检索系统以及文本挖掘等领域。ikanalyzer的核心目标是为了解决中文在英文为主导的Lucene等全文检索...

    IKAnalyzer2.0.2

    IKAnalyzer2.0.2是基于Java开发的一款开源全文搜索引擎组件,主要应用于Lucene项目,为中文分词提供了解决方案。在理解IKAnalyzer之前,我们先了解一下全文搜索引擎和中文分词这两个概念。 全文搜索引擎是一种信息...

    lucene 所有jar包 包含IKAnalyzer分词器

    总的来说,这个压缩包提供了一套完整的Lucene环境,集成了IKAnalyzer分词器,可以用来构建具备中文处理能力的全文搜索引擎。开发者可以根据实际需求,选择合适的组件进行集成,实现更高效、更精准的文本搜索和处理。...

    c# 中文分词 LUCENE IKAnalyzer

    标题中的"C# 中文分词 LUCENE IKAnalyzer"是指使用C#语言实现的一个中文分词工具,它基于开源全文检索引擎Lucene,并且采用了IKAnalyzer(智能汉字分词系统)的Java版本进行移植。Lucene是一个强大的、高性能的信息...

    ikanalyzer中文分词支持lucene7.1.0

    ikanalyzer中文分词支持lucene7.1.0是一个针对Lucene搜索引擎的中文分词扩展,由林良益先生开发,旨在提供高效、精准的中文词汇拆解功能。Lucene是一个开源全文检索库,它提供了索引和搜索文本的强大工具。然而,...

    IKAnalyzer中文分词.rar

    IKAnalyzer继承Lucene的Analyzer抽象类,使用IKAnalyzer和Lucene自带的分析器方法一样,将Analyzer测试代码改为IKAnalyzer测试中文分词效果。 如果使用中文分词器ik-analyzer,就需要在索引和搜索程序中使用一致的...

    使用IK Analyzer实现中文分词之Java实现

    IK Analyzer 是一个开源的,基于 java 语言开发的轻量级的中文分词工具包。从 2006年 12 月推出 1.0 版开始, IKAnalyzer 已经推出了 4 个大版本。最初,它是以开源项目Luence 为应用主体的,结合词典分词和文法分析...

    IKAnalyzer中文分词器支持Lucene6.0以上

    提示:IKAnalyzer中文分词器支持Lucene6.0以上,IKAnalyzer中文分词器支持Lucene6.0以上。

    Lucene的IK Analyzer 3.0 中文分词器 全解

    IK Analyzer 3.0 是一个专为 Lucene 设计的开源中文分词器,它基于 Java 开发,提供轻量级且高效的分词功能。自2006年12月发布1.0版以来,IK Analyzer 经历了多次升级,3.0版已演变为独立于 Lucene 的通用分词组件,...

    IKAnalyzer 支持高版本最新Lucene 5.x、6.x、7.x

    IKAnalyzer 是一个开源的、基于Java实现的中文分词器,专为全文检索和搜索引擎提供高效、快速的分词服务。这款工具广泛应用于Lucene、Elasticsearch、Solr等全文检索框架,以提高中文处理的性能。在给定的标题和描述...

    中文分词器IK Analyzer 2012FF_hf1

    亲测可用的中文分词器,也可以到IK Analyzer官网下载,网址如下: https://code.google.com/archive/p/ik-analyzer/downloads 在solrcode的schema.xml文件中的配置如下: 配置中文分词器的fieldType: ...

    lucene3.5 IKAnalyzer3.2.5 实例中文分词通过

    lucene3.5 IKAnalyzer3.2.5 实例中文分词通过,目前在网上找的lucene 和IKAnalyzer 的最新版本测试通过。内含:示例代码,以及最新jar包。 lucene lucene3.5 IKAnalyzer IKAnalyzer3.2.5 jar 中文 分词

    Lucene4.7+IK Analyzer中文分词入门教程

    在这个入门教程中,我们将使用Lucene 4.7版本,结合IK Analyzer,一个专门针对中文分词的开源分析器,来学习如何构建一个简单的搜索引擎。 首先,你需要下载Lucene 4.7和IK Analyzer 2012-FF Hotfix 1。Lucene的...

    IK中文分词器IKAnalyzer6.5.0

    IKAnalyzer是一款广泛应用于Java环境中的开源中文分词器,尤其在搜索引擎、文本分析等领域有着重要的应用。6.5.0是其的一个版本,这个版本在前代基础上进行了优化和改进,提升了分词效率和准确度。 一、IKAnalyzer...

    IK Analyzer 中文分词器下载

    IK Analyzer 是一个开源的、基于Java实现的中文分词器,专为全文检索或信息提取等任务设计。它由尹力(Wu Li)在2006年发起,最初是为了改善Lucene的中文处理能力。自那时起,IK Analyzer已经发展成为一个广泛使用的...

    分词器 ikanalyzer-solr6.5

    ikanalyzer-solr6.5 是一个专门为Solr 6.5版本设计的中文分词器,它基于ikanalyzer,并且进行了优化以更好地适应Solr的索引和搜索需求。ikanalyzer是一个开源的、基于Java实现的中文分词库,主要用于解决中文文本...

    适合Lucene5.x的IKAnalyzer-5.0分词器的jar包

    适合Lucene5.x的IKAnalyzer-5.0分词器的jar包,重写了前面版本的IKAnalyzer,我已经试过,可以使用。

Global site tag (gtag.js) - Google Analytics