论坛首页 Java企业应用论坛

发布IKAnnlyzer3.2.0稳定版 for Lucene3.0

浏览 28155 次
该帖已经被评为良好帖
作者 正文
   发表时间:2010-03-14  
linliangyi2007 写道
treason111 写道
楼主你好!我在solr1.3用了你的IKAnalyzer3.1.5GA分词,一开始用得都很好,就是在配置扩展词典的时候出错了,首先我没有找到WEBINF/classes目录,于是自己建了一个,把IKAnalyzer.cfg.xml文件放进去,然后就出错了“HTTP Status 500 - javax.servlet.ServletException: java.lang.NoClassDefFoundError: Could not initialize class org.wltea.analyzer.dic.Dictionary”好像是字典位置不对,能给我解释一下路径该怎么设置呢?我是这么设置的“<entry key="ext_dict">solr/WEB-INF/classes/t-base.dic</entry> ”,我用的是tomcat6,感谢您浪费宝贵的时间为我解答


首先,建议你是用3.1.6GA版本,其次,出现的异常说明你的路径下面没有扩展字典,因为对字典文件的载入是使用classloader的,所以看上去像是类没找到,实际上是字典没找到。


好的,非常感谢您!我马上试试
0 请登录后投票
   发表时间:2010-03-14  
楼主,我换成就可以了。另外,我想问问,是不是新字典的新词都会加入到主字典里呢?如果是,那随着我添加字典种类的增多,主字典会不会越来越大呢?
0 请登录后投票
   发表时间:2010-03-15  
treason111 写道
楼主,我换成就可以了。另外,我想问问,是不是新字典的新词都会加入到主字典里呢?如果是,那随着我添加字典种类的增多,主字典会不会越来越大呢?


所谓加入主词典不是指被记录到主词典文件中,而是指和主词典放在同一内存区域被匹配,这个是必须的。一般而言,1万个词元暂用1M内存,词典对重复的词不会加载两次,不必担心内存浪费
0 请登录后投票
   发表时间:2010-03-17  
您好,我使用ik分词遇到个问题,就是 比如我查询工行的文章,如果文章量很少,会返回 的文章有 带有工字,并且带有行字的文章出现,怎么样来避免此问题,
第二我希望ik分词器分词至少两个字的分词,比希望分词到字,怎么样来处理,希望您能够回复。
0 请登录后投票
   发表时间:2010-03-17  
lz我直接替换之前的jar文件可以吗?需要修改什么吗?
0 请登录后投票
   发表时间:2010-03-17   最后修改:2010-03-17
zhutouying98 写道
您好,我使用ik分词遇到个问题,就是 比如我查询工行的文章,如果文章量很少,会返回 的文章有 带有工字,并且带有行字的文章出现,怎么样来避免此问题,
第二我希望ik分词器分词至少两个字的分词,比希望分词到字,怎么样来处理,希望您能够回复。


你需要对org.wltea.analyzer.Context中的方法
	/**
	 * 向分词结果集添加词元
	 * @param lexeme
	 */
	public void addLexeme(Lexeme lexeme){
		if(!Dictionary.isStopWord(segmentBuff , lexeme.getBegin() , lexeme.getLength())){
			this.lexemeSet.addLexeme(lexeme);
		}
	}


修改为
	/**
	 * 向分词结果集添加词元
	 * @param lexeme
	 */
	public void addLexeme(Lexeme lexeme){
		if(lexeme.getLength() > 1 &&
                      !Dictionary.isStopWord(segmentBuff , lexeme.getBegin() , lexeme.getLength())){
			this.lexemeSet.addLexeme(lexeme);
		}
	}


就好。你需要下载源码然后编译。

如果取得所有的单字,你在搜索的时候,会搜不到词典中没有的词,个人认为这不是好主意
0 请登录后投票
   发表时间:2010-03-17  
lym6520 写道
lz我直接替换之前的jar文件可以吗?需要修改什么吗?


如果你是3.0.0 - 3.1.6GA的替换,你不需要做任何修改。

从3.1.X替换到3.2.0的,如果你使用的是Lucene2.9,那么也不需要修改。
0 请登录后投票
   发表时间:2010-04-13  
  林老师你好,最近项目中在使用你的ik3.1.5分词器,其中要使用词库扩展功能,
按照使用文档中的的第一种方式Dictionary.loadExtendWords(dictList);
给Dictionary传入一个从数据库读出的List List绝对不是空的
但是 始终java.lang.ExceptionInInitializerError
at org.wltea.analyzer.seg.ChineseSegmenter.<init>(ChineseSegmenter.java:37)
at org.wltea.analyzer.cfg.Configuration.loadSegmenter(Configuration.java:114)
at org.wltea.analyzer.IKSegmentation.<init>(IKSegmentation.java:54)
at iktest.test.testik(test.java:20)
at iktest.test.main(test.java:36)
Caused by: java.lang.NullPointerException
at org.wltea.analyzer.dic.Dictionary.loadExtendWords(Dictionary.java:421)
at org.wltea.analyzer.dic.LoadMyDict.initConn(LoadMyDict.java:30)
at org.wltea.analyzer.dic.Dictionary.<init>(Dictionary.java:84)
at org.wltea.analyzer.dic.Dictionary.<clinit>(Dictionary.java:42)
... 5 more
非常困惑不知道为什么出现这个问题望老师指教

0 请登录后投票
   发表时间:2010-04-19   最后修改:2010-04-19
private static ArrayList<PseudoOriginalBeanVo> getPseudoOriginalList(String str){
        ArrayList list=new ArrayList();
        try {
           StringReader reader = new StringReader(str);
           IKSegmentation analyzer = new IKSegmentation(reader,false);
           Lexeme a=analyzer.next();
           while(a!=null){
               PseudoOriginalBeanVo vo=new PseudoOriginalBeanVo();
               vo.setBegin(a.getBegin());
               vo.setEnd(a.getEndPosition());
               vo.setLength(a.getLength());
               vo.setText(a.getLexemeText());
               vo.setType(a.getLexemeType());
               list.add(vo);
               a=analyzer.next();
           }
       } catch (Exception ex) {
           MyLog.info("vo:"+ex.toString());
       }
       return list;
    }



整个系统就调用这一个方法,需要用到中文分词, 不太熟悉,整个系统就无法释放内存,系统内存监视都切图了.希望楼主以及各位指点

  • 大小: 83.8 KB
0 请登录后投票
   发表时间:2010-04-20   最后修改:2010-04-20
zhang310 写道
private static ArrayList<PseudoOriginalBeanVo> getPseudoOriginalList(String str){
        ArrayList list=new ArrayList();
        try {
           StringReader reader = new StringReader(str);
           IKSegmentation analyzer = new IKSegmentation(reader,false);
           Lexeme a=analyzer.next();
           while(a!=null){
               PseudoOriginalBeanVo vo=new PseudoOriginalBeanVo();
               vo.setBegin(a.getBegin());
               vo.setEnd(a.getEndPosition());
               vo.setLength(a.getLength());
               vo.setText(a.getLexemeText());
               vo.setType(a.getLexemeType());
               list.add(vo);
               a=analyzer.next();
           }
       } catch (Exception ex) {
           MyLog.info("vo:"+ex.toString());
       }
       return list;
    }



整个系统就调用这一个方法,需要用到中文分词, 不太熟悉,整个系统就无法释放内存,系统内存监视都切图了.希望楼主以及各位指点



IK的词典是单例模型,在启动时载入,且不会释放内存。里面有27w的词条,是分词需要的。这个肯定是不会释放的,释放就遭了,呵呵
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics