锁定老帖子 主题:中文分词 庖丁解牛 版本号 2.0.1
精华帖 (1) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-08-14
--------------------------------------------------- 相对2.0.0版本变更如下: 重构(!): svn上的代码和字典从原来的GBK编码转化为UTF-8编码(使用Eclipse下载代码的同学需要改变工程的encoding) ->从统计上,更多人使用UTF-8而非GBK,故改之;望谅。 重构(!): 重构PaodingMaker使调用make获取Paoding对象,一个配置文件默认只会产生一个Paoding(通过记录文件的绝对路径并记录之实现) ->2.0.0如果多次调用PaodingMaker.make会多次载入词典,虽然这是有意的。2.0.1不必有如此担心了,同一个配置文件的Paoding不会多次创建。 重构(!): 重构PaodingMaker使可以调用多次make方法根据不同配置文件(类路径或普通文件路径)产生不同的Paoding ->这个特性目的是为了支持根据不同的应用场合扩招Paoding的分词针对性(庖丁能够根据配置不同的Knife而具有完全不同的分词效果) ->2.0.0不能同时根据不同的配置文件产生Paoding对象 重构: 删除几乎无用的net.paoding.dictionary.support.Util类(其中有一个函数被move到其他位置) 重构: 增加Constants接口记录配置文件中配置项的name 增强: 当指定的词典安装目录或其子目录下没有任何词典文件时,抛出PaodingAnalysisException,并提示:Not found any dictionary files, have you set the 'paoding.dic.home' right? 增强: 可以在配置文件中指定字符集读取字典文件,如果没有配置则使用UTF-8。配置项名为paoding.dic.charset 增强:增加build.xml文件 错误: 当没有noiseWord、noiseCharactor、unit、confucianFamilyName等特定词典时无法使用,应为忽略之而正常使用 错误: 非词典直接目录下的设置词典忽略前缀无效 错误: 将错误的命名paoding-analy[s]is.jar纠正为paoding-analysis.jar 之前jar命名少了中括号标注的字母 --------------------------------------------------- 任务表(还未实现的任务) 1、繁简体的支持[优先级:中] 2、动态转载变更的词典[优先级:高] 3、针对高级使用者的文档[优先级:低] --------------------------------------------------- 示例: 请参考:庖丁解牛 2.0.0版本发布 之《"庖丁解牛" 使用指南》 --------------------------------------------------- 相关地址 svn地址:http://paoding.googlecode.com/svn/trunk/paoding-analysis zip下载:http://code.google.com/p/paoding/downloads/list 论 坛:http://groups.google.com/group/paoding JavaEye:http://analysis.group.iteye.com/ 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-08-16
切切.王,你好!
高亮问题已解决,原因是之前使用你的早期版本发现有问题,便拿Highlighter来开刀,谁知没改好就改出问题,后来忘了改回去,所以出问题。真不好意思。 现在又发现两个问题: 1、使用查询模式的PaodingAnalyzer去查询用写模式建立的索引时,基本上无法检索到结果,举例:索引中存在“计算机安全XXX”,如果查询“计算机”是可以查到结果的,但如果查询“计算机安全”就无法检索到结果。类似情况很多,只要你在检索结果中复制一段相对长的字符串作为检索词,很有可能无结果。 2、在索引比较大的情况下(如:400M),搜索速度会变成非常慢,由于查询模式的PaodingAnalyzer很多情况下无法检索结果,我使用写模式的PaodingAnalyzer,以求最多的检索结果,我的在实际中测试有时超过1秒,而且检索词越多,速度变慢得越明显。同样的Size的检索,我使用MMAnalyzer,速度在0.1秒以内。 希望得到解决…… |
|
返回顶楼 | |
发表时间:2007-08-16
发现查询模式的PaodingAnalyzer切分效果并不理想,有时连在一起的几个词,其实还可以切成一个大词,但你没有这样做。
|
|
返回顶楼 | |
发表时间:2007-08-16
这里的两个问题
1、查询模式的PaodingAnalyzer的问题: queryMode的PaodingAnalyzer,将内容按最大的词切,即最大的词中包含的小的词将被忽略;wirterMode的PaodingAnalyzer的做法则是,大词、小词都会切出来。 本来这里是希望lucene在建立索引时尽量切词,而查询的时候则只检索最大词的条目(document)。以免把仅含有小词的条目也检索出来。 今天我花一少些时间看QueryParser的规则和试验,发现这样的设计是不必要的。比如一个文章内容为:“安全计算!”,使用writerMode的PaodingAnalyzer,则切为2个词:安全、计算;用户用“计算机”来搜索文章,以前担心,使用writerMode的PaodingAnalyzer会把“安全计算!”这个条目搜索出来(这是不希望的),现在经过试验,是不会的。 所以既然如此,就没有必要在建立索引的使用writerMode,检索的时候使用queryMode。这是问题的一方面,从必要性角度来看的。 从程序的正确性看这个问题,queryMode和writerMode的PaodingAnaylyzer确实是按逾期的方式来切词的,并没有错误。问题出在Lucene的搜索机制的约束上(一言难尽)。既然Lucene约束限制了,反过来说,不管我们做的如何正确,那都是和Lucene机制不匹配的,也就达不到预期。 不过还好,wirterMode和queryMode在实际中可能都有需要。之后,我们保持同时支持这两种切词方式,但会给他改个名(免误导)。2.0.2应该中完成这个改变。 说到此最重要的一句话便是:建立索引和使用索引使用同一种分析器吧。要么都是writerMode的PaodingAnalyzer,要么是queryMode的Analyzer。 2、检索速度慢的问题 你提供的数据我个人认为可能性不大。 1)Lucene的检索速度几乎不会随索引库增大而有大的变化。4M也好,400M也好,4G也好检索速度不会有明显差别; 2)Lucene的检索速度和分词器关系几乎为0(如果说有关系的话,那就是不同的分词器分词算法,有的分词垃圾词条目太多因此产生的微弱影响,此影响可以不计) 3)测试的时候,词库是否做了优化? 统计是否是多次平均的?(多次访问索引文件,操作系统会进行文件内存缓存,从而提高访问速度,不必每次都去做磁盘操作) 但不管怎么样,我会留意一下,我会找个时间弄个超大库来测试的,或者委托别人帮忙测试。 ---------------------- 交待一下Paoding的状态: 词典的动态加载已经完成核心设计、实现和测试了(但代码还没commit到SVN上)。下周能够发布2.0.2。 臭美一下,自我感觉设计的不错。 动态检测文件变更的这一块完全可以在第三方利用(跟庖丁没有任何耦合,只是挂了庖丁的package名而已)。想去找tomcat,resin它们这一块的代码,但是代码太多了,很难找。 也因为要加动态监测并更新字典这个特性,使得之前良好的设计第一次获得明显回报,能够比较轻松地,不用变更原来程序结构的基础上支持此特性。 老知识: 带码根据职责、约束分割,以“接口”为接口;用接口分离并连接模块与模块。 --- 我的一个想法: 等2.0版本稳定之后,找找看有什么公司/网站可以正式地试用并最终使用庖丁分词。(一开始总是要求人试用),个人对他很有信心。 |
|
返回顶楼 | |
发表时间:2007-08-17
wirterMode和queryMode的PaodingAnaylyzer设计需求是有的,但无奈写和查一般只能用同一Analyzer. 或者可以用queryMode的PaodingAnaylyzer在对查询关键字进行分词再用wirterMode构造Query???待考究。
Qieqie,你说Lucene不会随索引容量的大小而变慢,这不是事实吧。我始终觉得索引一大无论你用什么Analyzer都会变慢的,不过就发现PaodingAnaylyzer会慢得很明显。我在实际中查询采用了分页(一页10条结果)方法,有高亮。而且发现就算了用了Field.TermVector.WITH_POSITIONS_OFFSETS仅高亮也会用去0.01x秒,不用高亮一页结果会更慢,一直苦于提升搜索速度,但不甚理想,不知Qieqie有什么高见呢? |
|
返回顶楼 | |
发表时间:2007-08-17
rainsf 写道 Qieqie,你说Lucene不会随索引容量的大小而变慢,这不是事实吧。我始终觉得索引一大无论你用什么Analyzer都会变慢 去了解“倒排索引”的原理,就能理解搜索为什么能在短时间内在海量数据中保持一致的快速。 简单说,就像hash表一样,不管这个hash表多大,从中找到一个元素的时间都是O(1),几乎和hash表大小无关。 只要Lucene能够建立上索引(建立索引可能有最大容量数据的限制-这点还没仔细了解),搜索的速度根本不用考虑。 你的测试数据肯定是错误的,或者说偶然的(参考上上帖子我说的几点疑问:你的测试是多次平均的吗?你的库是否索引后是否有优化?) |
|
返回顶楼 | |
发表时间:2008-04-24
您好, 我在build.bat时候出现如下错误:
E:\temp\paoding-analysis-2.0.4-alpha2>"C:\j2sdk1.4.2_08/bin/java" -cp lib/ant/an t.jar;lib/ant/ant-launcher.jar;lib/ant/ant-trax.jar;lib/ant/ant-junit.jar;lib/ju nit/junit.jar;lib/clover/clover.jar;"C:\j2sdk1.4.2_08/lib/tools.jar" org.apache. tools.ant.Main Buildfile: build.xml compile: [delete] Deleting directory E:\temp\paoding-analysis-2.0.4-alpha2\classes [mkdir] Created dir: E:\temp\paoding-analysis-2.0.4-alpha2\classes [javac] Compiling 57 source files to E:\temp\paoding-analysis-2.0.4-alpha2\c lasses [javac] E:\temp\paoding-analysis-2.0.4-alpha2\src\net\paoding\analysis\analy zer\PaodingAnalyzerBean.java:123: cannot resolve symbol [javac] symbol : constructor IllegalArgumentException (java.lang.String,jav a.lang.ClassNotFoundException) [javac] location: class java.lang.IllegalArgumentException [javac] throw new IllegalArgumentException("not found mo de class", e); [javac] ^ [javac] E:\temp\paoding-analysis-2.0.4-alpha2\src\net\paoding\analysis\analy zer\PaodingAnalyzerBean.java:160: cannot resolve symbol [javac] symbol : constructor IllegalArgumentException (java.lang.String,jav a.lang.InstantiationException) [javac] location: class java.lang.IllegalArgumentException [javac] throw new IllegalArgumentException("wron g mode class", e); [javac] ^ [javac] E:\temp\paoding-analysis-2.0.4-alpha2\src\net\paoding\analysis\analy zer\PaodingAnalyzerBean.java:162: cannot resolve symbol [javac] symbol : constructor IllegalArgumentException (java.lang.String,jav a.lang.IllegalAccessException) --------------------------------------------------------------------------- [我的jdk版本:] E:\temp\paoding-analysis-2.0.4-alpha2>java -vaersion Unrecognized option: -vaersion Could not create the Java virtual machine. |
|
返回顶楼 | |
发表时间:2008-04-25
谢谢!
这是JDK1.4 API的问题。 很久之前已经有热心人士报告JDK1.4的问题并在当时fix commit到svn上了 |
|
返回顶楼 | |
发表时间:2008-04-25
paoding 包的路径不能有中文或空格
|
|
返回顶楼 | |
发表时间:2008-04-25
qieqie, 您好.
可是我连svn时候, 提示正在取数据, 但马上就没信息了. 无法正常取到数据. 我当的是paoding-analysis-2.0.4-alpha2版本. 回:melin, 我没有用到中文或空格路径 |
|
返回顶楼 | |