`
Qieqie
  • 浏览: 337693 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

中文分词 庖丁解牛 版本号 2.0.1

阅读更多
庖丁解牛 中文分词 版本号 2.0.1

---------------------------------------------------
相对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/
分享到:
评论
12 楼 heitu278 2008-05-08  
切切!好样的!加油!
11 楼 qizhan 2008-04-27  
cqf820 写道
qieqie, 您好.
可是我连svn时候, 提示正在取数据, 但马上就没信息了.

无法正常取到数据.
我当的是paoding-analysis-2.0.4-alpha2版本.

回:melin, 我没有用到中文或空格路径





我这边连svn很正常的。
10 楼 cqf820 2008-04-25  
qieqie, 您好.
可是我连svn时候, 提示正在取数据, 但马上就没信息了.

无法正常取到数据.
我当的是paoding-analysis-2.0.4-alpha2版本.

回:melin, 我没有用到中文或空格路径
9 楼 melin 2008-04-25  
paoding 包的路径不能有中文或空格
8 楼 Qieqie 2008-04-25  
谢谢!
这是JDK1.4 API的问题。
很久之前已经有热心人士报告JDK1.4的问题并在当时fix commit到svn上了
7 楼 cqf820 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.

6 楼 Qieqie 2007-08-17  
rainsf 写道


Qieqie,你说Lucene不会随索引容量的大小而变慢,这不是事实吧。我始终觉得索引一大无论你用什么Analyzer都会变慢


去了解“倒排索引”的原理,就能理解搜索为什么能在短时间内在海量数据中保持一致的快速。

简单说,就像hash表一样,不管这个hash表多大,从中找到一个元素的时间都是O(1),几乎和hash表大小无关。
只要Lucene能够建立上索引(建立索引可能有最大容量数据的限制-这点还没仔细了解),搜索的速度根本不用考虑。

你的测试数据肯定是错误的,或者说偶然的(参考上上帖子我说的几点疑问:你的测试是多次平均的吗?你的库是否索引后是否有优化?)
5 楼 rainsf 2007-08-17  
wirterMode和queryMode的PaodingAnaylyzer设计需求是有的,但无奈写和查一般只能用同一Analyzer. 或者可以用queryMode的PaodingAnaylyzer在对查询关键字进行分词再用wirterMode构造Query???待考究。

Qieqie,你说Lucene不会随索引容量的大小而变慢,这不是事实吧。我始终觉得索引一大无论你用什么Analyzer都会变慢的,不过就发现PaodingAnaylyzer会慢得很明显。我在实际中查询采用了分页(一页10条结果)方法,有高亮。而且发现就算了用了Field.TermVector.WITH_POSITIONS_OFFSETS仅高亮也会用去0.01x秒,不用高亮一页结果会更慢,一直苦于提升搜索速度,但不甚理想,不知Qieqie有什么高见呢?
4 楼 Qieqie 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版本稳定之后,找找看有什么公司/网站可以正式地试用并最终使用庖丁分词。(一开始总是要求人试用),个人对他很有信心。
3 楼 rainsf 2007-08-16  
发现查询模式的PaodingAnalyzer切分效果并不理想,有时连在一起的几个词,其实还可以切成一个大词,但你没有这样做。
2 楼 rainsf 2007-08-16  
切切.王,你好!
高亮问题已解决,原因是之前使用你的早期版本发现有问题,便拿Highlighter来开刀,谁知没改好就改出问题,后来忘了改回去,所以出问题。真不好意思。

现在又发现两个问题:

1、使用查询模式的PaodingAnalyzer去查询用写模式建立的索引时,基本上无法检索到结果,举例:索引中存在“计算机安全XXX”,如果查询“计算机”是可以查到结果的,但如果查询“计算机安全”就无法检索到结果。类似情况很多,只要你在检索结果中复制一段相对长的字符串作为检索词,很有可能无结果。

2、在索引比较大的情况下(如:400M),搜索速度会变成非常慢,由于查询模式的PaodingAnalyzer很多情况下无法检索结果,我使用写模式的PaodingAnalyzer,以求最多的检索结果,我的在实际中测试有时超过1秒,而且检索词越多,速度变慢得越明显。同样的Size的检索,我使用MMAnalyzer,速度在0.1秒以内

希望得到解决……
1 楼 心无旁骛 2007-08-16  
赞~~~ 继续学习

相关推荐

Global site tag (gtag.js) - Google Analytics