精华帖 (14) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-08-08
主要变更: 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/ 不建议下载旧版本 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-08-08
好呀,兄弟,我前段时间就看了你写的这个东东,不错,确实不错!
|
|
返回顶楼 | |
发表时间:2007-08-08
切切.王,呵呵,你好, 很高兴今天下午收到你的邮件回复,我下载了最新版本,包结构的确比以前清晰了不少,也有些不错的调整。
我运行了你的ch4下面的例子,同样地,高亮错误的问题还是没有得到解决,如查询“中华”会把“中华人民共和国”都高亮了。总之会把连在一起的也成词的都高亮,我不知道你自己的测试为何没有问题,希望其他遇到这个问题的人也出来说说。 期待你的解决,关注中…… |
|
返回顶楼 | |
发表时间:2007-08-08
有两个其它建议要提一下的:
1、词典文件建议使用UTF-8编码格式保存,避免不同的操作系统出现乱码的的可能,如在英文(非GBK)的操作系统就会读取乱码,这样分词就徒劳无功了。 2、最终的Analyer子类(PaodingAnalyzer),应该提供一个无参构造器,因为大多数框架通常都是配置指定Analyer实现类通过反映加载Analyer的,如Hibernate Search. |
|
返回顶楼 | |
发表时间:2007-08-09
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变更说明。 |
|
返回顶楼 | |
发表时间:2007-08-09
其实词典文件只要用UTF-8编码保存,读取的时候也以UTF-8来读取就可以了,不需要搞两份不同骗码的词典,用UTF-8可以保证环境不同不会乱码。
我看了你的FileWordsReader.java BufferedReader in = new BufferedReader(new InputStreamReader( new FileInputStream(f))); 这样读取在不同环境存在乱码的可能的,因为这样是以操作系统的默认编码去读取的,如果你的操作系统是中文的,那就是说以GBK编码方式去读取,所以读取UTF-8那份词典肯定是乱码。 正确的读取方式应该是: BufferedReader in = new BufferedReader(new InputStreamReader( new FileInputStream(f),"UTF-8")); 至于有没有必要搞两份不同编码的源代码,那就见仁见智了,我写了个工具类,可以方便转换不同编码的工程,有需要的同学可以问我要。 |
|
返回顶楼 | |
发表时间:2007-08-09
这个情况值得讨论一下。
对被分词的文本,我们不知道他是什么编码的,可能是GBK,可能是UTF-8,不同的应用可能不一样。 如果在庖丁的代码中hard code指定使用UTF-8读取字典(此时字典是UTF-8编码的),如何应用在非UTF-8的应用中? 可能可以这样做: 我们在配置文件中增加一个“编码”配置项,同时提供多种编码的字典。 不同的应用,根据实际情况在配置文件里面设置编码,并使用对应编码的字典 |
|
返回顶楼 | |
发表时间:2007-08-09
字典文件编码可配置即可
|
|
返回顶楼 | |
发表时间:2007-08-09
Qieqie 写道 这个情况值得讨论一下。
对被分词的文本,我们不知道他是什么编码的,可能是GBK,可能是UTF-8,不同的应用可能不一样。 如果在庖丁的代码中hard code指定使用UTF-8读取字典(此时字典是UTF-8编码的),如何应用在非UTF-8的应用中? 可能可以这样做: 我们在配置文件中增加一个“编码”配置项,同时提供多种编码的字典。 不同的应用,根据实际情况在配置文件里面设置编码,并使用对应编码的字典 这与工程的编码格式无关,仅与文件的存储编码格式有并,只要你以某种编码方式存储,再与对应的编码方法读取就没问题的了,你可以指明用户,要求以UTF-8编码保存字典文件。如果你不想这样做,你也可以用一些工具(如:Cpdetector)来检测字典文件的编码格式,再以正确的编码方式读取就OK了。 |
|
返回顶楼 | |
发表时间:2007-08-09
不是这个问题。
我指的是使用者的系统(不是开发者源代码编码,而是用户传过来的字符串编码)不仅仅限制在UTF-8,可能是其他编码。 如果请求传过来的是其他编码形式的文本,而词典不与其匹配,那么词典就没用了。 说到这,激发我想到一个相关的问题: 怎么同时支持不同编码,但实际是同一个字的的分词? 比如同样都是“体育”这个词,GBK有GBK的编码,UTF-8有UTF-8的编码,big5有big5的编码(“體育”)。 对!中文分词应该把这些不同的编码的词视为一个词。 策略上可以以UTF-8作为统一标准,由庖丁自动将非UTF-8的文本(包括正体字/繁体字),转为简体UTF-8的,然后再进行分词! 这个需求应该是有用的。现在庖丁解牛没有做这方面的工作。 |
|
返回顶楼 | |