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

Lucene中文分词“庖丁解牛”

阅读更多

 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
分享到:
评论
72 楼 myreligion 2007-03-26  
对于这个全文检索我一直有一个疑惑,希望大家能解答。全文检索的索引是怎么做的?

因为分词以后,其实分出来的词加起来要比原先的内容还要多,对于如此大量的索引数据,lunce是怎么处理的? 索引是如何组织检索的?
71 楼 shaquan6776 2007-03-26  
不好意思,原来是在XFactory里用到的!我用 Eclipse的Open Call
Hierarchy竟然没发现!郁闷
另外:我向base.dic文件里增加词语,测试的时候会打印出一句:“出现这个文字,表示输入的词语排序错误,请确保词典排序正确>>>>>>>>>”。我找到源码,
if (subs.containsKey(key)) {
System.out.println("出现这个文字,表示输入的词语排序错误,请确保词典排序正确>>>>>>>>>"
+ hashChar);

}

看的不甚明白,请问楼主,字典里的词语存放还有必须特定的顺序吗?
70 楼 shaquan6776 2007-03-26  
Qieqie 写道
shaquan6776 写道
楼主,我看了下源码,有两个类:KnifeBox和Paoding在闲着,这个庖丁Paoding怎么背了一堆kinfe跑到一边儿玩去了呢?
Paoding末有闲着,背着刀的他不至于跑不见了,那他可真忽悠人了。

看看XTokenizer.java,Paoding在XTokenizer公司工作。

------------

偶最近一段来项目都比较紧 所以连paoding的hosting没做,也没有做其他的前进。sorry sorry!

--------------------------

有些问题没有进行反馈或解决 如果有出现问题 或提议, 哥们你自己动手改改代码然后提交上来 我来整合发布
楼主:根据你的提示,我看仔细看了看XTokenizer.java,的确没有发现
Paoding!难道他矿工了不成!故,特帖源码以示证据。
public final class XTokenizer extends TokenStream implements Collector {

private final Reader input;

private static final int bufferLength = 128;

private final char[] buffer = new char[bufferLength];

private int offset;

private final Beef beef = new Beef(buffer, 0, 0);


private int dissected;


private Knife knife;

private TokenCollector tokenCollector;

private Iterator<Token> tokenIteractor;

public XTokenizer(Reader input, Knife knife, TokenCollector tokenCollector) {
this.input = input;
this.knife = knife;
this.tokenCollector = tokenCollector;
}

public TokenCollector getTokenCollector() {
return tokenCollector;
}

public void setTokenCollector(TokenCollector tokenCollector) {
this.tokenCollector = tokenCollector;
}

public void collect(String word, int offset, int end) {
tokenCollector.collect(word, this.offset + offset, this.offset + end);
}

// -------------------------------------------------
@Override
public Token next() throws IOException {
// 已经穷尽tokensIteractor的Token对象,则继续请求reader流入数据
while (tokenIteractor == null || !tokenIteractor.hasNext()) {
int read = 0;
int remainning = -1;//重新读入字符时,buffer中还剩下的字符数,-1表示当前暂不不需要从reader中读入字符
if (dissected >= beef.length()) {
remainning = 0;
}
else if (dissected < 0){
remainning = bufferLength + dissected;
}
if (remainning != -1) {
if (remainning > 0) {
System.arraycopy(buffer, -dissected, buffer, 0, remainning);
}
read = input.read(buffer, remainning, bufferLength - remainning);
int charCount = remainning + read;
if (charCount < 0) {
// reader已尽,按接口next()要求返回null.
return null;
}
if (charCount < bufferLength) {
buffer[charCount ++] = 0;
}
// 构造“牛”,并使用knife“解”之
beef.set(0, charCount);
offset -= remainning;
dissected = 0;
}
dissected = knife.dissect((Collector)this, beef, dissected);
offset += read;// !!!
tokenIteractor = tokenCollector.iterator();
}
// 返回tokensIteractor下一个Token对象
return tokenIteractor.next();
}

// -------------------------------------------------

@Override
public void close() throws IOException {
super.close();
input.close();
}

}(注:去掉了注释!)
69 楼 Qieqie 2007-03-23  
shaquan6776 写道
楼主,我看了下源码,有两个类:KnifeBox和Paoding在闲着,这个庖丁Paoding怎么背了一堆kinfe跑到一边儿玩去了呢?
Paoding末有闲着,背着刀的他不至于跑不见了,那他可真忽悠人了。

看看XTokenizer.java,Paoding在XTokenizer公司工作。

------------

偶最近一段来项目都比较紧 所以连paoding的hosting没做,也没有做其他的前进。sorry sorry!

--------------------------

有些问题没有进行反馈或解决 如果有出现问题 或提议, 哥们你自己动手改改代码然后提交上来 我来整合发布
68 楼 shaquan6776 2007-03-23  
楼主,我看了下源码,有两个类:KnifeBox和Paoding在闲着,这个庖丁Paoding怎么背了一堆kinfe跑到一边儿玩去了呢?
67 楼 shaquan6776 2007-03-22  
楼主,怎么不把整个分词系统的类图画下,好让我们这些菜鸟快速看明白这个结构。
66 楼 eingmarra 2007-03-11  
楼主,不知道你开发的KI_CAnalyzer 支持不支持highlighter(lucene contribution包里的)关键词加亮,为什么我的返回中搜索"人"这个关键词的话,会加亮诸如"高层人士","管理人员"...等等这些不太想要的词,是不是有点越俎代庖了!
65 楼 cooliceyu 2007-03-07  
64 楼 linliangyi2007 2007-03-02  
hghdo 写道
Qieqie:
汉语的字典文件在linux的环境下,字典文件名都变成乱码了。请问有什么方法把文件名变成utf-8编码的?


可以在windows平台下,用jdk自带的native2ascii.exe将词典转化一下,再打包到linux下,试试!
63 楼 Qieqie 2007-03-02  
收到~~
62 楼 linliangyi2007 2007-02-28  
southgate 写道
同志,大问题:有基于jdk1.4的不?


要1.4滴,毛遂自荐一下IKAnalyzer1.4 ,http://download.csdn.net/source/160753 .
还有JEAnalyzer1.5.1 http://www.jesoft.cn/posts/list/5.page

qieqie兄是个技术冲浪者,总在新技术的浪尖呀,他的分词器基于jdk1.5滴。

不过1.5的annotaion和自解包/封包功能真不错,运行效率也高不少,要不是考虑兼容性,偶也想更新换代咯,jdk都出6咯
61 楼 southgate 2007-02-23  
同志,大问题:有基于jdk1.4的不?
60 楼 foreverqihe 2007-02-13  
谢谢你的讲解,总算明白点了。请问 我要是用  '*爸'来搜呢?能得到更好的结果么?
59 楼 caocao 2007-02-06  
楼主研究精神可敬可佩,我也是搞Lucene的,我的一个站点是http://so.mdbchina.com
我的分词是自己研究的算法,和楼主的有些不同,因为这个搜索引擎是影视类的,所以我的行业词典也偏向影视类,有电影名、人名、地名等。我会另开一贴介绍一下我搞的那个分词。楼主 
58 楼 Qieqie 2007-02-03  
foreverqihe 写道
请问楼主,为什么“老爸”这个词,我建立索引之后,搜“爸”就搜不出来呢


全文检索与like不一样,路人皆知。

paoding对词建立索引,对未能识别的词也采用良好的识别和切词。一段连续的中文是否是个词主要由预存的词典定义。

“老爸”在词典中已经定义,但没有单独“爸”这个词,所以不会再建立索引。(我特地重新查看了字典)

所以,如果搜索结果在现实生活中确实令人不满意,那就有必要更加合理的组织字典。--

paoding的字典是可编辑的,你可以往里面添加或删除词语(但需要保持按照汉字编码升序-目的是:方便建立词典以及加速查找)。甚至可以另外寻找一个符合要求的词典替换base.dic。

--各行各业都有自己的词典,建立索引时,最好能把特有的词建立一个新的字典(以.dic结尾命名,保持词语按汉字编码升序),放置CJK字典目录下,这样paoding会自动读入
57 楼 Qieqie 2007-02-03  
billgmh 写道
butterfly 写道
楼主有哪些开源具有分词性的中文分词的编程接口可介绍一下啊?


中科院的分词系统就是具有分词性的中文分词接口哦,有一个dotNet下的C++版本


下载了。它的词典放在debug/data下,以dct结尾。文本编辑器打开词典文件,不是能清楚看明他的词典结构,隐隐约约感觉词典对每个词都有特别的标注,那进行词性标注的可能性是很大的 (没有直接证据,所以使用可能性的判断)。

要做到词性理解,关键还是词典+句型模板。 利用词典标注词性,识别出词语的同时识别出词语词性(可能不只一个词性),在通过句型模板,判断最后到底该词语是什么词性。

不过偶认为对一般搜索来说做到这个地步费力不讨好,没有必要做。

题外:
>>>如果能够使机器真真正正识别人的语言,那不知道天会怎么样!!!

有一阵子我在想,能不能对语言进行标准化,然后进行“建模”!解析具体语言时,将句子的意思对应到该标准语言,从而做到各种语言搜索的统一:使用的不再是基于文本的搜索,而是基于语义的搜索!

这样词性的问题也就自然而然解决了。

BUT, 可行吗?呵呵,先放弃吧!想那么多,那么完美,那事情永远也解决不了。。。。。


>>>附件中的代码看起来粗看一下,感觉不好阅读。。。
56 楼 foreverqihe 2007-02-03  
请问楼主,为什么“老爸”这个词,我建立索引之后,搜“爸”就搜不出来呢
55 楼 butterfly 2007-02-03  
谢谢楼上,如果有java版的就更好了
54 楼 billgmh 2007-02-03  
butterfly 写道
楼主有哪些开源具有分词性的中文分词的编程接口可介绍一下啊?


中科院的分词系统就是具有分词性的中文分词接口哦,有一个dotNet下的C++版本
53 楼 butterfly 2007-02-02  
Qieqie 写道
butterfly 写道
楼主有哪些开源具有分词性的中文分词的编程接口可介绍一下啊?


很困难啊


嗯,那看来只能自己写了。可不可以在已经将句子分成一个一个的词后,再给每个词标注词性呢?还是将判别词性的部分跟分词组合在一起完成较好?

Qieqie 写道
butterfly 写道

。。。之所以要分词性是挖掘阶段的准备,因为我们想应用频繁集的方法,同时查找一个词的同义词或者反义词这种。


同义词或反义词之类的互相映射是分词之后,不属于分词的范畴了,得去买这种字典了 算法还达不到给出同义或反义的这种智能的程度


呵呵,我还以为现在已经有可以以程序接口的形式查找一个词的同义词或者反义词的“中文电子词典”了呢。

相关推荐

    lucene 中文分词 庖丁解牛

    《Lucene中文分词:庖丁解牛》 在信息技术高速发展的今天,全文搜索引擎已经成为网站内容检索不可或缺的一部分。其中,Apache Lucene作为一个开源的全文检索库,被广泛应用于各种项目中,尤其对于处理中文文本,...

    lucene中文分词(庖丁解牛)庖丁分词

    《Lucene中文分词——庖丁解牛》 在自然语言处理领域,中文分词是基础且关键的一环。在Java开发中,Apache Lucene是一个强大的全文搜索引擎库,但默认并不支持中文,这就需要借助第三方分词工具。本文将深入探讨...

    lucene3庖丁解牛中文分词器

    《深入剖析:Lucene3与庖丁解牛中文分词器》 在信息技术飞速发展的今天,全文检索和搜索引擎已经成为日常开发中不可或缺的部分。Lucene作为一款强大的全文检索库,被广泛应用于各种信息检索系统中。然而,对于中文...

    Lucene 庖丁解牛分词法2.4版本jar包

    总的来说,"庖丁解牛分词法"为Lucene提供了一种高效的中文分词解决方案,显著提升了中文信息检索的准确性和用户体验。通过不断优化和更新,如"paoding-analysis-2.0.4-alpha2"这样的分词工具,使得开发者能够更好地...

    paoding analysis 3.0.1 jar (庖丁解牛分词器)

    由于庖丁官方目前提供可下载尚不支持Lucene 3.0以上版本。因此作者对paoding进行重新编译,使其与最新Lucene 3.0.1版本适用。 Latest paoding 3.0.1 for lucene 3.0.1 使用说明: 先下载2.0.4的版本(h t t p : / ...

    lucene中文分词器(paoding解牛)

    Paoding这个名字来源于中国古代的一种宰牛技术,寓意其对中文文本的“解构”能力,如同庖丁解牛般精细入微。 Paoding的核心特点包括: 1. **智能词典**:Paoding使用了一种动态加载的词典机制,能够根据上下文信息...

    庖丁解牛工具

    “Lucene分词器”是"庖丁解牛工具"的一个重要组成部分。Apache Lucene是一个高性能、全文本搜索库,它是Java开发者常用来构建搜索引擎的工具。而"庖丁解牛"则为Lucene提供了针对中文的分词支持,使得开发者可以更好...

    Lucene加庖丁解牛测试类

    本文将深入探讨“Lucene加庖丁解牛测试类”,旨在帮助读者理解Lucene的核心概念,并通过实际的测试类解析,提升对Lucene的运用能力。 首先,我们需要理解“庖丁解牛”的含义。这源自古代典故,意指做事技艺娴熟,能...

    适用于lucene..5的庖丁解牛分词器

    可以适用于lucene3.5的庖丁解牛分词器jar包

    lucene Analyzer 庖丁解牛 中文分词

    《Lucene Analyzer剖析:中文分词的奥秘》 在信息检索领域,Lucene作为一款强大的全文搜索引擎库,被广泛应用于各种系统中。其核心功能之一就是对输入文本进行高效精准的分词处理,以便进行后续的索引和查询操作。...

    Lucene3.0以上版本庖丁解牛分词法demo

    最新庖丁解牛分词法的使用demo,支持Lucene3.3、3.4等3.0以上版本,庖丁解牛的分词包为自己编译生成的,之前的2.0的版本不能支持Lucene3.0以上版本,所以需要从svn下载最新的庖丁解牛源码,生成jar文件(我同样已...

    庖丁解牛,一种中文分词器

    总的来说,"庖丁解牛"分词器是中文信息处理领域的一个强大工具,它与Lucene的结合进一步增强了对中文文本的处理能力。对于需要处理大量中文文本的开发者来说,掌握这款分词器的使用和集成技巧是非常有价值的。通过...

    庖丁解牛 源码 for Lucene 2.4

    《庖丁解牛 源码 for Lucene 2.4》是一份针对开源全文搜索引擎Lucene 2.4版本的深度解析资料。这个压缩包包含的文件名为"paoding-for-lucene-2.4",很可能是针对中文处理的Paoding Lucene库的源代码分析或扩展。...

    lucene3.0 分词器

    lucene3.0 中文分词器, 庖丁解牛

    sorlr + tomcat+ 庖丁解牛中文分词 配置文档

    标题 "sorlr + tomcat+ 庖丁解牛中文分词 配置文档" 提到的是一个关于在Apache Solr中集成Tomcat服务器,并利用庖丁解牛中文分词工具进行中文处理的配置教程。这个配置过程对于搭建支持中文搜索的Solr环境至关重要。...

    lucene最新版本加庖丁解牛实现搜索引擎

    《使用Lucene最新版与庖丁解牛方法构建搜索引擎》 在信息技术日新月异的今天,搜索引擎已经成为了我们获取信息的重要工具。Apache Lucene是一个高性能、全文本搜索库,被广泛应用于各种搜索引擎的开发中。本文将...

    支持Lucene3.3、3.4的庖丁解牛分词法的源码和jar包

    资源为庖丁解牛分词法的最新源码以及生成的jar包,支持最新的Lucene3.4以及Lucene3.0以上版本。Jar包为本地生成,大家也可以到SVN上检出自己生成,另外庖丁解牛分词法的使用Demo我会接下来上传一份,欢迎分享。

    lucene3.0庖丁+索引搜索程序

    《深入剖析Lucene3.0:庖丁解牛与索引搜索实践》 在IT行业中,搜索引擎技术扮演着至关重要的角色,而Lucene作为一个开源全文检索库,为开发者提供了强大的文本搜索功能。本文将深入探讨Lucene3.0版本,结合“庖丁解...

    庖丁解牛分词器jar包

    Paoding's Knives 中文分词具有极 高效率 和 高扩展性 。引入隐喻,采用完全的面向对象设计,构思先进。 高效率:在PIII 1G内存个人机器上,1秒 可准确分词 100万 汉字。 采用基于 不限制个数 的词典文件对文章...

Global site tag (gtag.js) - Google Analytics