论坛首页 Java企业应用论坛

Lucene中文分词“庖丁解牛”

浏览 129670 次
该帖已经被评为精华帖
作者 正文
   发表时间:2007-01-23  

 Lucene中文分词 “庖丁解牛”

 附件 为本人设计编写的组件,中文分词“庖丁解牛”,具有相当好的使用价值。。。

高效率:我的赛扬PC 1 秒解析 >>> 20000汉字的词语  (实际测试结果数据,可达1秒10万+汉字。)
高可维护性:使用“庖丁”隐喻,形象明晰
高灵活性,可扩展:OOD

对比:《终于突破中文分词的效率问题》http://www.lucene.org.cn/read.php?tid=54&fpage=2 他的效率为 6秒 解析2588汉字
 

2007-08-08:

由于庖丁解牛进行了一些调整和重构,这里的附件代码已经是"较旧"的,最新的下载地址:

http://code.google.com/p/paoding/downloads/list

SVN地址为:http://paoding.googlecode.com/svn/trunk/paoding-analysis/ 

同时也可以通过浏览器访问http://paoding.googlecode.com/svn/trunk/paoding-analysis/  直接浏览代码。

最新的在JavaEye的发布帖子是:

http://www.iteye.com/topic/110148   中文分词 庖丁解牛 2.0.0 发布

 

  • Paoding.rar (1.1 MB)
  • 描述: 中文分词“庖丁解牛”,面向对象,高效率,高扩展性
  • 下载次数: 6782
  • HashBinaryDictionary.java.rar (2.2 KB)
  • 描述: 原来的HashBinaryDictionary.java使用对第一个字符hash+二份查找。这个算法已经不错。 但下面的更新使用了更好的策略。可连续hash词语的字符。理论上这个词典算法应该到达极致了。 覆盖HashBinaryDictionary.java在com/sohospace/dictionary下
  • 下载次数: 2578
  • Main1.java.rar (6.1 KB)
  • 描述: 对一个长度2185856的字符串(4,347,520字节)的分词效率测试。 下载解压后添加到源文件中
  • 下载次数: 2402
   发表时间:2007-01-23  
示例代码:搜索时...
XAnalyzer analyzer = XFactory.getQueryAnalyzer();//搜索时应使用的分析器
String testString = "中华人民共和国在1949年建立,从此开始了新中国的伟大篇章";
Reader r = new StringReader(testString);
XTokenizer ts = (XTokenizer) analyzer.tokenStream("", r);

Token t;
while ((t = ts.next()) != null) {
   System.out.println(t);
}

-------------------
以上是旧版本的paoding的示例代码,新版本的代码应是:

// 将庖丁封装成符合Lucene要求的Analyzer规范
Paoding paoding = PaodingMaker.make();
Analyzer queryAnalyzer = PaodingAnalyzer.queryMode(paoding);
...


解析结果如下:
(中华人民共和国,0,7)
(1949年,8,13)
(建立,13,15)
(从此,16,18)
(开始,18,20)
(新中国,21,24)
(伟大,25,27)
(大篇,26,28)
(篇章,27,29)

0 请登录后投票
   发表时间:2007-01-23  
示例代码2: 建立索引时...

XAnalyzer analyzer = XFactory.getWriterAnalyzer();//建立索引时应使用的分析器   
String testString = "中华人民共和国在1949年建立,从此开始了新中国的伟大篇章";   
Reader r = new StringReader(testString);   
XTokenizer ts = (XTokenizer) analyzer.tokenStream("", r);   
  
Token t;   
while ((t = ts.next()) != null) {   
   System.out.println(t);   
}   


-------------------
以上是旧版本的paoding的示例代码,新版本的代码应是:

// 将庖丁封装成符合Lucene要求的Analyzer规范
Paoding paoding = PaodingMaker.make();
Analyzer writerAnalyzer = PaodingAnalyzer.writerMode(paoding);
...



解析结果如下:
(中华,0,2)
(中华人民,0,4)
(中华人民共和国,0,7)
(华人,1,3)
(人民,2,4)
(人民共和国,2,7)
(共和,4,6)
(共和国,4,7)
(1949,8,12)
(1949年,8,13)
(年,12,13)
(建立,13,15)
(从此,16,18)
(开始,18,20)
(新中国,21,24)
(中国,22,24)
(伟大,25,27)
(大,26,27)
(大篇,26,28)
(篇章,27,29)
1 请登录后投票
   发表时间:2007-01-23  
速度不错,将自动切分和词表切分2个机制的结合得也不错
评分:90分
加油!继续努力!希望能够做到自动识别大多数人名
0 请登录后投票
   发表时间:2007-01-23  
这种切分还是有很明显的缺点.例如下面一段文字:
"发展社区老年活动场所和服务设施"

如果我想搜索日本的和服相关资料,输入关键字"和服"的时候,上面的资料也会被搜索出来
0 请登录后投票
   发表时间:2007-01-23  
菲利浦思 写道
这种切分还是有很明显的缺点.例如下面一段文字:
"发展社区老年活动场所和服务设施"

如果我想搜索日本的和服相关资料,输入关键字"和服"的时候,上面的资料也会被搜索出来



搜索引擎是第一步搜索:
      在浩瀚的信息中,快速集结最后可能是所想要的结果,按照可能是最好的顺序展现出来。

人的眼睛是第二步搜索:
      找寻最符合要求的结果,同时将机器无法轻易识别的少数“无效”结果过滤

“和服”问题,涉及了汉语语义的问题,几乎不可完全解决(可作为“特例”解决,或通过排序方法,将他排到相对靠后等价解决)。


0 请登录后投票
   发表时间:2007-01-23  
谢谢,下载来测试..
前一排自己也有写过关于lucene的几篇文章;中文分词的确是一个难点
这一篇文章我加入专栏啦,让更多人了解一下
0 请登录后投票
   发表时间:2007-01-23  
有点不对啊
是精华贴,为什么楼主的积分显示"积分:62";
精华贴应该是加一百分的啊:"评价帖子的建议标准:非常好的主题帖可以点击评为精华,加100分"
0 请登录后投票
   发表时间:2007-01-23  
Qieqie 写道
菲利浦思 写道
这种切分还是有很明显的缺点.例如下面一段文字:
"发展社区老年活动场所和服务设施"

如果我想搜索日本的和服相关资料,输入关键字"和服"的时候,上面的资料也会被搜索出来



搜索引擎是第一步搜索:
      在浩瀚的信息中,快速集结最后可能是所想要的结果,按照可能是最好的顺序展现出来。

人的眼睛是第二步搜索:
      找寻最符合要求的结果,同时将机器无法轻易识别的少数“无效”结果过滤

“和服”问题,涉及了汉语语义的问题,几乎不可完全解决(可作为“特例”解决,或通过排序方法,将他排到相对靠后等价解决)。




所以引入rank参数还是应该考虑的,rank的算法决定了这类问题发生时的结果序列。
0 请登录后投票
   发表时间:2007-01-23  
Qieqie 写道
菲利浦思 写道
这种切分还是有很明显的缺点.例如下面一段文字:
"发展社区老年活动场所和服务设施"

如果我想搜索日本的和服相关资料,输入关键字"和服"的时候,上面的资料也会被搜索出来



搜索引擎是第一步搜索:
      在浩瀚的信息中,快速集结最后可能是所想要的结果,按照可能是最好的顺序展现出来。

人的眼睛是第二步搜索:
      找寻最符合要求的结果,同时将机器无法轻易识别的少数“无效”结果过滤

“和服”问题,涉及了汉语语义的问题,几乎不可完全解决(可作为“特例”解决,或通过排序方法,将他排到相对靠后等价解决)。



实话实说本人之前就是遇到这样的问题,到目前为止还是没有解决,因为不是做语言研究,感觉知识不够用,目前做个项目还要做词性分析,很难!大家继续加油!
0 请登录后投票
论坛首页 Java企业应用版

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