论坛首页 Java企业应用论坛

中文分词 庖丁解牛 2.0.0版本发布

浏览 38839 次
精华帖 (14) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-08-14  
作者您好:我在用“庖丁”做为compass的中文分词(spring+hibernate+compass+tomcat),做了以下修改:

1、由于只能在配置文件中使用无参的构造函数,所以在PaodingAnalyzer 这个类的tokenStream方法中,把
if (knife == null) {
throw new NullPointerException("knife should be set before token");
}
改成了:
if (knife == null) {
knife = PaodingMaker.make(Config.properties());
}

2、由于tomcat默认字符是iso-8859-1,因此在tokenStream方法中,把传入的reader对象读出保存到一个String中,然后转换字符集到utf-8,然后再构造一个StringReader传入返回语句:
return new PaodingTokenizer(new StringReader(str), knife, createTokenCollector());

然后在使用时,抛出java.lang.StringIndexOutOfBoundsException异常,提示CJKKnife 类的 && beaf.charAt(end) >= word.getNext().charAt(count); 处 String index out of range。

不知道此处是存在BUG?还是由于我做的两处修改而导致问题?如果我在这句话前面先加个判断,如果count溢出,则把word.getNext()的值的length-1赋值给 count,不知道这样修改是否会造成其它影响?谢谢~~
0 请登录后投票
   发表时间:2007-08-14  
to yheart:

1、你的改法没有必要。而且这样改也不是良好的。
PaodingAnalyzer具有无参的构造函数,你可以使用无参构造函数,然后通过setKnife,setMode设置这两个值。
你可以参考前回复中给出的Spring配置方法。

2、和Tomcat默认字符无关。你要确认的是:
   1)你的页面设置什么字符集?
   2)你是否设置了CharacterEncodingFilter过滤器用来对请求和响应设置和页面一致的字符集
    (如果是struts2,webwork等从MVC框架上就支持字符集配置的,可以不需要配置CharacterEncodingFilter)
  
   如果你配置的是UTF-8编码的,就必须使用UTF-8编码的字典,同时你的操作系统要是UTF-8编码的(注)
   如果你配置的是GBK编码的,就必须使用GBK编码的字典,同时你的操作系统要是GBK编码的(注)

[注]:
   2.0.0版本使用操作系统的字符集读取字典,所以要保证你使用的字典和操作系统是同一编码的
   如果你使用的页面字符集和操作系统不一样,现在庖丁没有办法配置用页面的字符集读取字典,
   作为暂时的做法,你可以直接去将net.paoding.analysis.dictionary.support.filewords.FileWordsReader
   中的87行的new InputStreamReader(new FileInputStream(f))改为new InputStreamReader(new FileInputStream(f), "你页面配置的编码")
   这些情况会在2.0.x进行改进。上面的一些贴子,已经叙述了这个问题


3、程序抛出的StringIndexOutOfBoundsException异常是因为使用错误的字符集导致的,设置正确了,也就不会有异常。
0 请登录后投票
   发表时间:2007-08-15  
恭喜qieqie兄新版发布。
俺地IKAnalyzer新版分词器也在昨天发布了,这里搭个顺风车,咔咔!!
http://download.csdn.net/source/227957
0 请登录后投票
   发表时间:2007-08-17  
希望能够提供Solr的解决方案

在Spring中比较好配置,但是在Solr中好像没有类似Spring的<property name="knife" ref="paoding"/>的方式

Qieqie 写道
rainsf 写道

2、最终的Analyer子类(PaodingAnalyzer),应该提供一个无参构造器,因为大多数框架通常都是配置指定Analyer实现类通过反映加载Analyer的,如Hibernate Search.


参见:
[url=http://analysis.group.iteye.com/group/post/15584 ]JavaEye:Spring Context下使用"庖丁解牛" [/url]
或:
Google:Spring Context下使用"庖丁解牛"

简单摘要(以上面两个链接中的说明为准,这里只是摘要):

   <bean id="writerAnalyzer" class="net.paoding.analysis.analyzer.PaodingAnalyzer">
       <property name="knife" ref="paoding"/>
       <property name="mode" value="1"/>
   </bean>

   <bean id="queryAnalyzer" class="net.paoding.analysis.analyzer.PaodingAnalyzer">
       <property name="knife" ref="paoding"/>
       <property name="mode" value="2"/>
   </bean>

   <bean id="paoding" class="net.paoding.analysis.knife.PaodingMaker"  factory-method="make"/>


---------
补:
1、建立索引和使用索引只能使用同一种/模式的分词器
2、2.0.2以后(包含)queryMode和writerMode这两个名称将重构为更好的名称,请留意倒是的API说明或readme变更说明。
0 请登录后投票
   发表时间:2007-08-19  
我封装了一下,在solr1.2版本中测试通过,希望对您有用,也为了享受paoding的同时出一份力:

把附件 mysolr.jar 和 paoding-analysis.jar/commons-logging.jar 拷贝到solr实例的lib目录下(默认不存在,需要自己建立),
编辑schema.xml,加上对mysolr.analysis.ChineseTokenizerFactory的配置节
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
          <tokenizer class="mysolr.analysis.ChineseTokenizerFactory" mode="index"/>
           .....
      </analyzer>
      <analyzer type="query">
	  <tokenizer class="mysolr.analysis.ChineseTokenizerFactory" mode="query"/>
          .....
      </analyzer>
</fieldType>

ps:之所以使用mode=index来代替mode=write,是因为我觉得index更加符合lucene的习惯,呵呵

lanhuai 写道
希望能够提供Solr的解决方案

在Spring中比较好配置,但是在Solr中好像没有类似Spring的<property name="knife" ref="paoding"/>的方式

Qieqie 写道
rainsf 写道

2、最终的Analyer子类(PaodingAnalyzer),应该提供一个无参构造器,因为大多数框架通常都是配置指定Analyer实现类通过反映加载Analyer的,如Hibernate Search.


参见:
[url=http://analysis.group.iteye.com/group/post/15584 ]JavaEye:Spring Context下使用"庖丁解牛" [/url]
或:
Google:Spring Context下使用"庖丁解牛"

简单摘要(以上面两个链接中的说明为准,这里只是摘要):

   <bean id="writerAnalyzer" class="net.paoding.analysis.analyzer.PaodingAnalyzer">
       <property name="knife" ref="paoding"/>
       <property name="mode" value="1"/>
   </bean>

   <bean id="queryAnalyzer" class="net.paoding.analysis.analyzer.PaodingAnalyzer">
       <property name="knife" ref="paoding"/>
       <property name="mode" value="2"/>
   </bean>

   <bean id="paoding" class="net.paoding.analysis.knife.PaodingMaker"  factory-method="make"/>


---------
补:
1、建立索引和使用索引只能使用同一种/模式的分词器
2、2.0.2以后(包含)queryMode和writerMode这两个名称将重构为更好的名称,请留意倒是的API说明或readme变更说明。

    
  • mysolr.jar (1.6 KB)
  • 描述: PaodingTokenizer wrapper for solr
  • 下载次数: 96
  • src.zip (1017 Bytes)
  • 下载次数: 96
0 请登录后投票
   发表时间:2007-08-27  
rainsf 写道
我终于发现在“高亮错误”的可笑原因,在JDK1.6环境下,直接命令行来运行那几个例子,高亮就没有问题,但我在Eclipse下无论用JDK1.5还是JDK1.6,编译级别无论用5还是6,高亮都一样是错误的,在Tomcat环境下运行情况同样。以上情况看起来很可笑。
真的很郁闷,具体原因出在哪里,还没有时间考究,只知道有这样的事实。切切.王,你也在Eclipse或服务器环境下,或JDK1.5下试试吧,看看情况怎样。。。


eclipse用的编译器是自己改造过的。
如果,是仅在eclipse下出问题,可以考虑用jdk的默认编译器编译下。
ant+javac
0 请登录后投票
   发表时间:2007-09-03  
高亮确实有些问题,我也好奇怪的。
看了你们的说法,我换用netbeans 5.5.1重新编译了一下,发现高亮还是有问题的,会出现一些无关的内容。
0 请登录后投票
   发表时间:2007-09-03  
高亮的问题是1.x的bug,已经在2.x修改,现在不存在这个问题。

上面rainsf是因为其修改了代码,未改回来导致的。---rainsf最终给我的邮件说明的。

所以,请确认是用的是2.x的。 如有疑问,站内短信联系为佳。

谢谢。
0 请登录后投票
论坛首页 Java企业应用版

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