汉语言分词 庖丁解牛 2.0.0版本发布
中文分词 庖丁解牛 2.0.0版本发布
庖丁解牛 最新版本2.0.0
主要变更:
1)调整了package命名 改为net.paoding.analysis开头;调整了一些类的命名,主要是XAnalyzer改为
PaodingAnalyzer之类的。
2)并调整了部分代码的相对位置:代码集中在三个包中:
net.paoding.analysis.dictionary 字典抽象--这是核心代码之一
net.paoding.analysis.knife "刀"抽象-分词算法-这是核心代码之二
net.paoding.analysis.analyzer 封装adapter到lucene接口
关键代码没有任何改变,特别是CJKKnife没有发现错误。
3)同时,将字典改为英文命名,避免操作系统中文命名带来不必要影响
4)增加了配置文件;使knife可以在配置文件配置增减,同时字典的安装路径可以随意指定。
5)BUGFIX : highlight位置错误
下载地址:[url]http://code.google.com/p/paoding/downloads/list [/url]
SVN地址:http://paoding.googlecode.com/svn/trunk/paoding-analysis/
-------------------------------
选择"庖丁解牛"作为Lucene中文分词可能有以下理由:
@设计优美-使用庖丁隐喻,容易理解代码设计
@效率极高-极高效率的字典查找算法;尽量避免无谓试探查找
@算法简练-简单易理解的算法,但效率却是非常高效的
@轻松支持最大/最小切词
@字典灵活-
字典文件个数不限;
名称不限,只要符合以dic作为扩展名的均视为字典
目录层级不限(所以可以任意加减字典目录以及目录下的字典)
字典格式简单:不需要特别排序,人工可编辑
@源代码是开放的,遵守http://www.apache.org/licenses/LICENSE-2.0协议
@作者能力:Java基础知识、设计能力扎实、持续关注改进
-------------------------------
"庖丁解牛" 使用指南
1、准备
1)将二进制包paoding-analyis.jar放到自己的classpath下
2)将字典文件安装(也就是拷贝)到某个目录下,比如/data/paoding/dic下
3)把配置文件paoding-analysis.properties放到自己的classpath下
4)打开paoding-analysis.properties,把paoding.dic.home属性设置为字
典的安装目录,比如paoding.dic.home=/data/paoding/dic,特别的,如
果字典是安装在classpath下的dic目录下,则可以简单这样配置该属性:
paoding.dic.home=classpath:dic
2、建立索引
1)将庖丁封装成符合Lucene要求的Analyzer规范,获取writer mode的lucene
分析器,writer mode意味要同时支持最大和最小切词。
Paoding paoding = PaodingMaker.make();
Analyzer writerAnalyzer = PaodingAnalyzer.writerMode(paoding);
Paoding应保存为一个系统单例为好,以重复利用,它是线程安全的.
2)使用Lucene标准API对文件建立索引。
IndexWriter writer = new IndexWriter(dirctory, writerAnalyzer);
...
3、检索查找
1)使用Lucene标准API对文件进行检索,使用和建立索引时相同种的lucene分析器。
QueryParser parser = new QueryParser("content", writerAnalyzer );
...
更具体的使用方式参见
examples/net.paoding.analysis.examples.gettingstarted中的示例代码
------------------------------
"庖丁解牛"google 论坛:
[url]http://groups.google.com/group/paoding [/url]
"中文分词" Javaeye 论坛:
http://analysis.group.iteye.com/
svn地址:
[url]http://paoding.googlecode.com/svn/trunk/paoding-analysis/ [/url]
旧版本地址:
http://paoding.googlecode.com/svn/trunk/paoding-analysis-1/
不建议下载旧版本
在网上找到一个 BIG2GB的类简单的改了下,做了一个包,看 庖丁 需要不,需要的话就加进去!
使用方法
private static String QUERY = "固若金湯";
GB2Big5 pTmp = GB2Big5.getInstance();
String queryString = pTmp.big52gb(QUERY);
QueryParser parser = new QueryParser(FIELD_NAME, PaodingAnalyzer.queryMode(paoding));
Query query = parser.parse(queryString);
这段时间在搞拼音联想(目前有些BUG),过段时间在加入到庖丁 里面去
这个继续解决中,准备搞台电脑安装繁体版 XP
eclipse用的编译器是自己改造过的。
如果,是仅在eclipse下出问题,可以考虑用jdk的默认编译器编译下。
ant+javac
庖丁解牛 最新版本2.0.0
主要变更:
1)调整了package命名 改为net.paoding.analysis开头;调整了一些类的命名,主要是XAnalyzer改为
PaodingAnalyzer之类的。
2)并调整了部分代码的相对位置:代码集中在三个包中:
net.paoding.analysis.dictionary 字典抽象--这是核心代码之一
net.paoding.analysis.knife "刀"抽象-分词算法-这是核心代码之二
net.paoding.analysis.analyzer 封装adapter到lucene接口
关键代码没有任何改变,特别是CJKKnife没有发现错误。
3)同时,将字典改为英文命名,避免操作系统中文命名带来不必要影响
4)增加了配置文件;使knife可以在配置文件配置增减,同时字典的安装路径可以随意指定。
5)BUGFIX : highlight位置错误
下载地址:[url]http://code.google.com/p/paoding/downloads/list [/url]
SVN地址:http://paoding.googlecode.com/svn/trunk/paoding-analysis/
-------------------------------
选择"庖丁解牛"作为Lucene中文分词可能有以下理由:
@设计优美-使用庖丁隐喻,容易理解代码设计
@效率极高-极高效率的字典查找算法;尽量避免无谓试探查找
@算法简练-简单易理解的算法,但效率却是非常高效的
@轻松支持最大/最小切词
@字典灵活-
字典文件个数不限;
名称不限,只要符合以dic作为扩展名的均视为字典
目录层级不限(所以可以任意加减字典目录以及目录下的字典)
字典格式简单:不需要特别排序,人工可编辑
@源代码是开放的,遵守http://www.apache.org/licenses/LICENSE-2.0协议
@作者能力:Java基础知识、设计能力扎实、持续关注改进
-------------------------------
"庖丁解牛" 使用指南
1、准备
1)将二进制包paoding-analyis.jar放到自己的classpath下
2)将字典文件安装(也就是拷贝)到某个目录下,比如/data/paoding/dic下
3)把配置文件paoding-analysis.properties放到自己的classpath下
4)打开paoding-analysis.properties,把paoding.dic.home属性设置为字
典的安装目录,比如paoding.dic.home=/data/paoding/dic,特别的,如
果字典是安装在classpath下的dic目录下,则可以简单这样配置该属性:
paoding.dic.home=classpath:dic
2、建立索引
1)将庖丁封装成符合Lucene要求的Analyzer规范,获取writer mode的lucene
分析器,writer mode意味要同时支持最大和最小切词。
Paoding paoding = PaodingMaker.make();
Analyzer writerAnalyzer = PaodingAnalyzer.writerMode(paoding);
Paoding应保存为一个系统单例为好,以重复利用,它是线程安全的.
2)使用Lucene标准API对文件建立索引。
IndexWriter writer = new IndexWriter(dirctory, writerAnalyzer);
...
3、检索查找
1)使用Lucene标准API对文件进行检索,使用和建立索引时相同种的lucene分析器。
QueryParser parser = new QueryParser("content", writerAnalyzer );
...
更具体的使用方式参见
examples/net.paoding.analysis.examples.gettingstarted中的示例代码
------------------------------
"庖丁解牛"google 论坛:
[url]http://groups.google.com/group/paoding [/url]
"中文分词" Javaeye 论坛:
http://analysis.group.iteye.com/
svn地址:
[url]http://paoding.googlecode.com/svn/trunk/paoding-analysis/ [/url]
旧版本地址:
http://paoding.googlecode.com/svn/trunk/paoding-analysis-1/
不建议下载旧版本
13 楼
心无旁骛
2007-08-10
我已经把paoding在linux下用起来了,对编码问题根本可以视而不见,一样很好用。
14 楼
rainsf
2007-08-10
我终于发现在“高亮错误”的可笑原因,在JDK1.6环境下,直接命令行来运行那几个例子,高亮就没有问题,但我在Eclipse下无论用JDK1.5还是JDK1.6,编译级别无论用5还是6,高亮都一样是错误的,在Tomcat环境下运行情况同样。以上情况看起来很可笑。
真的很郁闷,具体原因出在哪里,还没有时间考究,只知道有这样的事实。切切.王,你也在Eclipse或服务器环境下,或JDK1.5下试试吧,看看情况怎样。。。
真的很郁闷,具体原因出在哪里,还没有时间考究,只知道有这样的事实。切切.王,你也在Eclipse或服务器环境下,或JDK1.5下试试吧,看看情况怎样。。。
15 楼
youkao
2007-08-11
在网上找到一个 BIG2GB的类简单的改了下,做了一个包,看 庖丁 需要不,需要的话就加进去!
使用方法
private static String QUERY = "固若金湯";
GB2Big5 pTmp = GB2Big5.getInstance();
String queryString = pTmp.big52gb(QUERY);
QueryParser parser = new QueryParser(FIELD_NAME, PaodingAnalyzer.queryMode(paoding));
Query query = parser.parse(queryString);
这段时间在搞拼音联想(目前有些BUG),过段时间在加入到庖丁 里面去
16 楼
Qieqie
2007-08-12
[表述错误-所以删除]
17 楼
Qieqie
2007-08-12
简繁体方面,庖丁需要有人贡献这些函数:
1、big5->utf-8
2、gbk->utf-8
3、utf-8繁->utf-8简
或者,等价的另一种方式:
4、big5->gbk
5、utf-8->gbk
6、gbk繁->gbk简
第一种方式感官上优于第二种。
1、big5->utf-8
2、gbk->utf-8
3、utf-8繁->utf-8简
或者,等价的另一种方式:
4、big5->gbk
5、utf-8->gbk
6、gbk繁->gbk简
第一种方式感官上优于第二种。
18 楼
youkao
2007-08-12
PaodingMaker 在每次加载的时候都会初始化一次,很好损失内存,在WEB下应用会经常内存溢出,建议修改成单例模式,其他保持不变,修改如下:
public class PaodingMaker {
private static Log log = LogFactory.getLog(PaodingMaker.class);
private static Paoding paoding;
private static PaodingMaker instance = null;
public static synchronized PaodingMaker getInstance() {
if (instance == null)
instance = new PaodingMaker();
return instance;
}
public PaodingMaker(){
make();
}
public static Paoding make() {
if (paoding == null) {
synchronized (PaodingMaker.class) {
paoding = make(Config.properties());
}
}
return paoding;
}
// @SuppressWarnings("unchecked")
public static Paoding make(Properties p) {
try {
Paoding paoding = new Paoding();
// 包装各种字典-将自动寻找,若存在则读取类路径中的paoding-analysis.properties文件
// 若不存在该配置文件,则一切使用默认设置,即字典在文件系统当前路径的dic下(非类路径dic下)
Dictionaries dictionaries = new FileDictionaries(p);
Enumeration names = p.propertyNames();
while (names.hasMoreElements()) {
String name = (String) names.nextElement();
// 以paoding.knife.class开头的被认为是knife对象
if (name.startsWith("paoding.knife.class")) {
String className = p.getProperty(name);
Class clazz = Class.forName(className);
Knife knife = (Knife) clazz.newInstance();
if (knife instanceof DictionariesWare) {
((DictionariesWare) knife)
.setDictionaries(dictionaries);
}
// 把刀交给庖丁
System.out.println("add knike: " + className);
log.info("add knike: " + className);
paoding.addKnife(knife);
}
}
return paoding;
} catch (Exception e) {
throw new IllegalStateException("Wrong paoding properties config.",
e);
}
}
}
修改后效率大大提高:
Searching time: 188 毫秒 (第一次加载)
Searching time: 16 毫秒
Searching time: 0 毫秒
Searching time: 15 毫秒
Searching time: 0 毫秒
Searching time: 0 毫秒
Searching time: 0 毫秒
public class PaodingMaker {
private static Log log = LogFactory.getLog(PaodingMaker.class);
private static Paoding paoding;
private static PaodingMaker instance = null;
public static synchronized PaodingMaker getInstance() {
if (instance == null)
instance = new PaodingMaker();
return instance;
}
public PaodingMaker(){
make();
}
public static Paoding make() {
if (paoding == null) {
synchronized (PaodingMaker.class) {
paoding = make(Config.properties());
}
}
return paoding;
}
// @SuppressWarnings("unchecked")
public static Paoding make(Properties p) {
try {
Paoding paoding = new Paoding();
// 包装各种字典-将自动寻找,若存在则读取类路径中的paoding-analysis.properties文件
// 若不存在该配置文件,则一切使用默认设置,即字典在文件系统当前路径的dic下(非类路径dic下)
Dictionaries dictionaries = new FileDictionaries(p);
Enumeration names = p.propertyNames();
while (names.hasMoreElements()) {
String name = (String) names.nextElement();
// 以paoding.knife.class开头的被认为是knife对象
if (name.startsWith("paoding.knife.class")) {
String className = p.getProperty(name);
Class clazz = Class.forName(className);
Knife knife = (Knife) clazz.newInstance();
if (knife instanceof DictionariesWare) {
((DictionariesWare) knife)
.setDictionaries(dictionaries);
}
// 把刀交给庖丁
System.out.println("add knike: " + className);
log.info("add knike: " + className);
paoding.addKnife(knife);
}
}
return paoding;
} catch (Exception e) {
throw new IllegalStateException("Wrong paoding properties config.",
e);
}
}
}
修改后效率大大提高:
Searching time: 188 毫秒 (第一次加载)
Searching time: 16 毫秒
Searching time: 0 毫秒
Searching time: 15 毫秒
Searching time: 0 毫秒
Searching time: 0 毫秒
Searching time: 0 毫秒
19 楼
youkao
2007-08-12
Qieqie 写道
简繁体方面,庖丁需要有人贡献这些函数:
1、big5->utf-8
2、gbk->utf-8
3、utf-8繁->utf-8简
或者,等价的另一种方式:
4、big5->gbk
5、utf-8->gbk
6、gbk繁->gbk简
第一种方式感官上优于第二种。
1、big5->utf-8
2、gbk->utf-8
3、utf-8繁->utf-8简
或者,等价的另一种方式:
4、big5->gbk
5、utf-8->gbk
6、gbk繁->gbk简
第一种方式感官上优于第二种。
这个继续解决中,准备搞台电脑安装繁体版 XP
20 楼
youkao
2007-08-12
没人顶?
21 楼
yheart
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,不知道这样修改是否会造成其它影响?谢谢~~
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,不知道这样修改是否会造成其它影响?谢谢~~
22 楼
Qieqie
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异常是因为使用错误的字符集导致的,设置正确了,也就不会有异常。
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异常是因为使用错误的字符集导致的,设置正确了,也就不会有异常。
23 楼
linliangyi2007
2007-08-15
恭喜qieqie兄新版发布。
俺地IKAnalyzer新版分词器也在昨天发布了,这里搭个顺风车,咔咔!!
http://download.****.net/source/227957
俺地IKAnalyzer新版分词器也在昨天发布了,这里搭个顺风车,咔咔!!
http://download.****.net/source/227957
24 楼
Andrew3001
2007-08-16
好东西,先mark一下,回家研究
25 楼
rainsf
2007-08-17
linliangyi2007 写道
恭喜qieqie兄新版发布。
俺地IKAnalyzer新版分词器也在昨天发布了,这里搭个顺风车,咔咔!!
http://download.****.net/source/227957
****要登录的,请问还有哪里可以下载?俺地IKAnalyzer新版分词器也在昨天发布了,这里搭个顺风车,咔咔!!
http://download.****.net/source/227957
26 楼
lanhuai
2007-08-17
希望能够提供Solr的解决方案
在Spring中比较好配置,但是在Solr中好像没有类似Spring的<property name="knife" ref="paoding"/>的方式
2、最终的Analyer子类(PaodingAnalyzer),应该提供一个无参构造器,因为大多数框架通常都是配置指定Analyer实现类通过反映加载Analyer的,如Hibernate Search.
参见:
[url=http://analysis.group.iteye.com/group/post/15584 ]JavaEye:Spring Context下使用"庖丁解牛" [/url]
或:
Google:Spring Context下使用"庖丁解牛"
简单摘要(以上面两个链接中的说明为准,这里只是摘要):
---------
补:
1、建立索引和使用索引只能使用同一种/模式的分词器
2、2.0.2以后(包含)queryMode和writerMode这两个名称将重构为更好的名称,请留意倒是的API说明或readme变更说明。
在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变更说明。
27 楼
lazywalker
2007-08-19
我封装了一下,在solr1.2版本中测试通过,希望对您有用,也为了享受paoding的同时出一份力:
把附件 mysolr.jar 和 paoding-analysis.jar/commons-logging.jar 拷贝到solr实例的lib目录下(默认不存在,需要自己建立),
编辑schema.xml,加上对mysolr.analysis.ChineseTokenizerFactory的配置节
ps:之所以使用mode=index来代替mode=write,是因为我觉得index更加符合lucene的习惯,呵呵
把附件 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"/>的方式
2、最终的Analyer子类(PaodingAnalyzer),应该提供一个无参构造器,因为大多数框架通常都是配置指定Analyer实现类通过反映加载Analyer的,如Hibernate Search.
参见:
[url=http://analysis.group.iteye.com/group/post/15584 ]JavaEye:Spring Context下使用"庖丁解牛" [/url]
或:
Google:Spring Context下使用"庖丁解牛"
简单摘要(以上面两个链接中的说明为准,这里只是摘要):
---------
补:
1、建立索引和使用索引只能使用同一种/模式的分词器
2、2.0.2以后(包含)queryMode和writerMode这两个名称将重构为更好的名称,请留意倒是的API说明或readme变更说明。
在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变更说明。
28 楼
O.Lions
2007-08-20
强烈支持 感谢这样的分享!!!
29 楼
0000
2007-08-23
我跑个题,打听一下,楼主对句子相似度有没有研究?或者有没有推荐的比较开放的资料?
30 楼
dwangel
2007-08-27
rainsf 写道
我终于发现在“高亮错误”的可笑原因,在JDK1.6环境下,直接命令行来运行那几个例子,高亮就没有问题,但我在Eclipse下无论用JDK1.5还是JDK1.6,编译级别无论用5还是6,高亮都一样是错误的,在Tomcat环境下运行情况同样。以上情况看起来很可笑。
真的很郁闷,具体原因出在哪里,还没有时间考究,只知道有这样的事实。切切.王,你也在Eclipse或服务器环境下,或JDK1.5下试试吧,看看情况怎样。。。
真的很郁闷,具体原因出在哪里,还没有时间考究,只知道有这样的事实。切切.王,你也在Eclipse或服务器环境下,或JDK1.5下试试吧,看看情况怎样。。。
eclipse用的编译器是自己改造过的。
如果,是仅在eclipse下出问题,可以考虑用jdk的默认编译器编译下。
ant+javac
31 楼
hlgao
2007-09-03
高亮确实有些问题,我也好奇怪的。
看了你们的说法,我换用netbeans 5.5.1重新编译了一下,发现高亮还是有问题的,会出现一些无关的内容。
看了你们的说法,我换用netbeans 5.5.1重新编译了一下,发现高亮还是有问题的,会出现一些无关的内容。
32 楼
Qieqie
2007-09-03
高亮的问题是1.x的bug,已经在2.x修改,现在不存在这个问题。
上面rainsf是因为其修改了代码,未改回来导致的。---rainsf最终给我的邮件说明的。
所以,请确认是用的是2.x的。 如有疑问,站内短信联系为佳。
谢谢。
上面rainsf是因为其修改了代码,未改回来导致的。---rainsf最终给我的邮件说明的。
所以,请确认是用的是2.x的。 如有疑问,站内短信联系为佳。
谢谢。