`
Qieqie
  • 浏览: 337819 次
  • 性别: 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 中文分词 庖丁解牛

    庖丁解牛(很好的分词效率) 在做站内全文检索时创建索引时比较快,而且感觉效果比JE要好一些。。

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

    支持中文的庖丁解牛,庖丁分词,找了好久才找到的希望对你有帮助。

    lucene3庖丁解牛中文分词器

    支持lucene3的庖丁解牛分词器和字典,可直接调用

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

    Lucene 庖丁解牛分词法 , 能够使用它解决中文分词问题。

    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..5的庖丁解牛分词器

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

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

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

    lucene3.0 分词器

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

    庖丁解牛工具

    庖丁解牛,Lucene分词器,很难得的资源。

    lucene Analyzer 庖丁解牛 中文分词

    NULL 博文链接:https://qpshenggui.iteye.com/blog/1157999

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

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

    庖丁解牛分词器jar包

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

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

    一款比较好的中文分词器,可以很方便地集成到lucene中,集成到lucene3.0中的时候需要做一些修改,具体修改方法可以百度之

    lucene实现企业产品检索

    在lucene中使用庖丁解牛的分词器,实现类似当当网站的功能实现一个对企业内部产品的检索功能

    paoding(庖丁解牛)

    庖丁中文分词库是一个使用Java开发的,可结合到Lucene应用中的,为互联网、企业内部网使用的中文搜索引擎分词组件。Paoding填补了国内中文分词方面开源组件的空白,本书介绍了在nutch上配置paoding

    Paoding中文分词

    庖丁解牛中文分词,速度不错,词库也很全面,非常不错!

    lucene 例子以及所需jar包

    自己做的完整的luecene例子,分词用庖丁解牛,过滤文本用的tika

    自然语言处理全集_代码结构说明.doc

    1)汉语分词,采用ICTCLAS系统和Lucene+庖丁解牛系统 2)情感倾向性分析,包括基于统计学习的SVM算法,基于情感词典的词语权重算法,给出文档的情感权重和情感倾向 3)文本聚类,包括KMeas算法实现,文档向量建模,...

    paoding-analysis3.0

    庖丁解牛中文分词器,只要配置好字典的路径,就可以使用庖丁解牛,可以有效针对中文进行分词,而且可以自定义词典。适用于lucene-core-3.3.0.jar,包内已经包含lucene-core-3.3.0.jar,已测试,包好用!

    自然语言处理全集

    1)汉语分词,采用ICTCLAS系统和Lucene+庖丁解牛系统 2)情感倾向性分析,包括基于统计学习的SVM算法,基于情感词典的词语权重算法,给出文档的情感权重和情感倾向 3)文本聚类,包括KMeas算法实现,文档向量建模,...

Global site tag (gtag.js) - Google Analytics