自各儿写的一个基于词库的lucene分词程序-ThesaurusAnalyzer
自己写的一个基于词库的lucene分词程序--ThesaurusAnalyzer
前一段时间用lucene做一个搜索程序,找了好长时间的中文分词程序,都没找到合适的,最后自己弄了一个.现在共享出来.希望对大家有用.
分词算法: 基于词库的正向最大匹配算法.
分词词库用的是网上一个叫 segmenter 的分词程序使用的词库.
地址:www.mandarintools.com/segmenter.html
这个segmenter分词程序是把文件按行读取出来,然后把一行假设为一个词,从库中匹配,如果匹配不成功,则去掉一个字,再继续匹配.这样的分词程序,其一,不便在lucene中使用,因为lucene的analyzer是通过Tokenizer分词的,而Tokenizer中一般是对字符流进行处理,每次next返回一个Token,并不是一次性把内容读取进来,处理后再返回结果.其二,按行读取会有个缺点,就是如果文本中恰好把一个词用换行符隔开了,这样这个词也就被切开了,没有被当作一个词处理.
我的程序实现方式:把词库读进内存后构建一个词语树.树的每个节点包含一个字. 比方 中国 中国人 中华民族 中华人民共和国 几个词,构成的树的结构:
中
国^ 华
人^ 人 民
民 族^
共
和
国^
懒得上传图片,所以将就着这样表示了.^表示该节点可以构成一个词.分词的过程类似于输入法的联想功能.读取一个字,然后联想,直到联想到不能为止.如果当前可以构成词,便返回一个Token.如果当前不能构成词语,便回溯到最近的可以构成词语的节点,返回.最差的情况就是返回第一个单字.然后从返回结果的下一个字重新开始联想.
lucene自带的几个分词程序中,ChineseAnalyzer是按字分的,与StandardAnalyzer对中文的分词没有大的区别.CJKAnalyzer是按两字切分的,比较武断,并且会产生垃圾Token,影响索引大小.
本分词程序的效果取决与词库.您可以用自己的词库替换程序自带的词库.词库是一个文本文件,名称为word.txt. 每一行一个词语,以#开头表示跳过改行.最后保存为UTF-8的文本.
程序的缺陷:
没有加入识别人名和地名的功能
该分词的一个应用案例:http://www.cyonline.net
这个网站是我给学校做的,用lucene对pdf ,word,excel,html等多种格式的文档进行解析,索引,提供全文搜索,并实现摘要高亮.这个网站在教育网上,公网用户可能访问起来比较慢.
附件1为分词程序的jar包
附件2为分词程序的源码,需要lucene-core.jar,一个比较Analyzer的测试类还需要lucene-analyzers.jar.
有问题或者意见建议请与我联系 jolestar@hotmail.com jolestar@gmail.com
分词效果很不错,不过貌似你的代码还没有放出来,很期待你的分词算法
谢谢两位,我最近在忙装修,现在心绪很乱,无法静心整理思路,以后详细介绍,
谢谢两位,我最近在忙装修,现在心绪很乱,无法静心整理思路,以后详细介绍,
感觉两位的分词算法的非常的棒!
前端时间在javaeye还有一个Paoding的分词算法,效果也不错!
不知在没有没人牵头做个分词算法的开源项目,大家也能够集思广益,把这个中文的分词算法做好!这个建议不知道robbin是不是感兴趣?
还有就是javaeye在国内是非常活跃的java社区,不知道到能不能做个java开源项目的宿主?
谢谢两位,我最近在忙装修,现在心绪很乱,无法静心整理思路,以后详细介绍,
感觉两位的分词算法的非常的棒!
前端时间在javaeye还有一个Paoding的分词算法,效果也不错!
不知在没有没人牵头做个分词算法的开源项目,大家也能够集思广益,把这个中文的分词算法做好!这个建议不知道robbin是不是感兴趣?
还有就是javaeye在国内是非常活跃的java社区,不知道到能不能做个java开源项目的宿主?
hosting的地方多的是,Google Code, Java.net,Sourceforge.net,......哪个不是功能强大,影响力广泛的OpenSource Hosting网站呢?JavaEye能集中有限的资源把社区做好就不错了。再说,一个项目源代码放在哪里有那么重要吗?就算把项目放在Google code,只要在JavaEye能够召集一群人一起做开发,宣传和推广,效果不是一样?
我接下来一两个月会投入时间学习全文检索和中文分词,不过我的目标是用ruby写一遍分词算法,给JavaEye3.0使用。所以没有多少精力组织Java开源分词算法项目。有兴趣的可以自己组织嘛。
前一段时间用lucene做一个搜索程序,找了好长时间的中文分词程序,都没找到合适的,最后自己弄了一个.现在共享出来.希望对大家有用.
分词算法: 基于词库的正向最大匹配算法.
分词词库用的是网上一个叫 segmenter 的分词程序使用的词库.
地址:www.mandarintools.com/segmenter.html
这个segmenter分词程序是把文件按行读取出来,然后把一行假设为一个词,从库中匹配,如果匹配不成功,则去掉一个字,再继续匹配.这样的分词程序,其一,不便在lucene中使用,因为lucene的analyzer是通过Tokenizer分词的,而Tokenizer中一般是对字符流进行处理,每次next返回一个Token,并不是一次性把内容读取进来,处理后再返回结果.其二,按行读取会有个缺点,就是如果文本中恰好把一个词用换行符隔开了,这样这个词也就被切开了,没有被当作一个词处理.
我的程序实现方式:把词库读进内存后构建一个词语树.树的每个节点包含一个字. 比方 中国 中国人 中华民族 中华人民共和国 几个词,构成的树的结构:
中
国^ 华
人^ 人 民
民 族^
共
和
国^
懒得上传图片,所以将就着这样表示了.^表示该节点可以构成一个词.分词的过程类似于输入法的联想功能.读取一个字,然后联想,直到联想到不能为止.如果当前可以构成词,便返回一个Token.如果当前不能构成词语,便回溯到最近的可以构成词语的节点,返回.最差的情况就是返回第一个单字.然后从返回结果的下一个字重新开始联想.
lucene自带的几个分词程序中,ChineseAnalyzer是按字分的,与StandardAnalyzer对中文的分词没有大的区别.CJKAnalyzer是按两字切分的,比较武断,并且会产生垃圾Token,影响索引大小.
本分词程序的效果取决与词库.您可以用自己的词库替换程序自带的词库.词库是一个文本文件,名称为word.txt. 每一行一个词语,以#开头表示跳过改行.最后保存为UTF-8的文本.
程序的缺陷:
没有加入识别人名和地名的功能
该分词的一个应用案例:http://www.cyonline.net
这个网站是我给学校做的,用lucene对pdf ,word,excel,html等多种格式的文档进行解析,索引,提供全文搜索,并实现摘要高亮.这个网站在教育网上,公网用户可能访问起来比较慢.
附件1为分词程序的jar包
附件2为分词程序的源码,需要lucene-core.jar,一个比较Analyzer的测试类还需要lucene-analyzers.jar.
有问题或者意见建议请与我联系 jolestar@hotmail.com jolestar@gmail.com
1 楼
robbin
2007-03-10
很棒,非常感谢你的共享。我看你的词库也有19万分词,已经很不错了。
2 楼
jolestar
2007-03-10
呵呵,在javaeye的第一个精华贴,要继续努力.
3 楼
strongkill
2007-03-10
很好啊..加油加油...
问个问题..优先级如何?
例如:
我还清晰地记得我们坐在江边聊天的情境.
分出来是
我 还清 晰 地 记得 我们 坐在 江边 聊天 的 情境
结果 清晰 被拆开了.
还有其它..还在测试当中..
密切关注.
问个问题..优先级如何?
例如:
我还清晰地记得我们坐在江边聊天的情境.
分出来是
我 还清 晰 地 记得 我们 坐在 江边 聊天 的 情境
结果 清晰 被拆开了.
还有其它..还在测试当中..
密切关注.
4 楼
jolestar
2007-03-10
这个是基于词库的分词算法固有的问题.没有很好的解决方法.。有统计结果表明,单纯使用正向最大匹配的错误率为1/169,单纯使用逆向最大匹配的错误率为1/245.有一种解决方案是正向匹配结果后再逆向匹配一次,然后比较结果,消除歧义.最好加入词汇概率统计功能.有歧义的用概率决定.
不过想不来如何做到lucene中去.
不过想不来如何做到lucene中去.
5 楼
bruce.fine
2007-03-10
佩服楼主,向楼主学习
6 楼
Reed_Nanjing
2007-03-10
好
,这段时间做一个项目是用TRS做全文搜索的,对lucene也很有兴趣,希望接下来有时间和lz交流交流
7 楼
lyx_2709
2007-03-10
很棒,学习了
8 楼
caocao
2007-03-10
顶,那句话我用我自己写的分词算法分下来是:我还 清晰地 记得 我们 坐在 江边 聊天的 情境
我的词库里面有近80万词语,且有一些metadata来配合我的分词算法。以后有空详细介绍。
上个效果图
我的词库里面有近80万词语,且有一些metadata来配合我的分词算法。以后有空详细介绍。
上个效果图
9 楼
robbin
2007-03-11
caocao 写道
顶,那句话我用我自己写的分词算法分下来是:我还 清晰地 记得 我们 坐在 江边 聊天的 情境
我的词库里面有近80万词语,且有一些metadata来配合我的分词算法。以后有空详细介绍。
我的词库里面有近80万词语,且有一些metadata来配合我的分词算法。以后有空详细介绍。
分词效果很不错,不过貌似你的代码还没有放出来,很期待你的分词算法
10 楼
jasongreen
2007-03-11
真强,希望看到源码,我一直在设想如何使分词系统能够加入统计功能
11 楼
caocao
2007-03-11
jasongreen 写道
真强,希望看到源码,我一直在设想如何使分词系统能够加入统计功能
robbin 写道
分词效果很不错,不过貌似你的代码还没有放出来,很期待你的分词算法
谢谢两位,我最近在忙装修,现在心绪很乱,无法静心整理思路,以后详细介绍,
12 楼
wuyunlong
2007-03-12
caocao 写道
jasongreen 写道
真强,希望看到源码,我一直在设想如何使分词系统能够加入统计功能
robbin 写道
分词效果很不错,不过貌似你的代码还没有放出来,很期待你的分词算法
谢谢两位,我最近在忙装修,现在心绪很乱,无法静心整理思路,以后详细介绍,
感觉两位的分词算法的非常的棒!
前端时间在javaeye还有一个Paoding的分词算法,效果也不错!
不知在没有没人牵头做个分词算法的开源项目,大家也能够集思广益,把这个中文的分词算法做好!这个建议不知道robbin是不是感兴趣?
还有就是javaeye在国内是非常活跃的java社区,不知道到能不能做个java开源项目的宿主?
13 楼
robbin
2007-03-12
wuyunlong 写道
caocao 写道
jasongreen 写道
真强,希望看到源码,我一直在设想如何使分词系统能够加入统计功能
robbin 写道
分词效果很不错,不过貌似你的代码还没有放出来,很期待你的分词算法
谢谢两位,我最近在忙装修,现在心绪很乱,无法静心整理思路,以后详细介绍,
感觉两位的分词算法的非常的棒!
前端时间在javaeye还有一个Paoding的分词算法,效果也不错!
不知在没有没人牵头做个分词算法的开源项目,大家也能够集思广益,把这个中文的分词算法做好!这个建议不知道robbin是不是感兴趣?
还有就是javaeye在国内是非常活跃的java社区,不知道到能不能做个java开源项目的宿主?
hosting的地方多的是,Google Code, Java.net,Sourceforge.net,......哪个不是功能强大,影响力广泛的OpenSource Hosting网站呢?JavaEye能集中有限的资源把社区做好就不错了。再说,一个项目源代码放在哪里有那么重要吗?就算把项目放在Google code,只要在JavaEye能够召集一群人一起做开发,宣传和推广,效果不是一样?
我接下来一两个月会投入时间学习全文检索和中文分词,不过我的目标是用ruby写一遍分词算法,给JavaEye3.0使用。所以没有多少精力组织Java开源分词算法项目。有兴趣的可以自己组织嘛。
14 楼
znjq
2007-03-12
字库中每个词对应有一个相应的权重,这个做起来就要复杂点了。以前做的也只是根据词库来切分,对于一般的也够用了
15 楼
YuLimin
2007-03-14
又多一个比较的方案了,我的个分词结果的是,整理好了发上来一起进步。
我/ 还/ 清晰/ 地/ 记得/ 我们/ 坐/ 在/ 江边/ 聊天/ 的/ 情境/
我/ 还/ 清晰/ 地/ 记得/ 我们/ 坐/ 在/ 江边/ 聊天/ 的/ 情境/
16 楼
grantbb
2007-03-14
我的分词做出来是:我还 清晰 地 记得 我们 坐在 江边 聊天 的 情境
使用lucene可以把地和的过滤。
使用lucene可以把地和的过滤。
17 楼
DigitalSonic
2007-03-16
谢谢LZ的共享,有空了研究研究
我本来在项目里想用ferret的,但发现它不支持中文分词,自己又没工夫去写,所以用lucene做了一个搜索引擎,用rjb在rails里对java做的引擎进行调用.
robbin 写道
我接下来一两个月会投入时间学习全文检索和中文分词,不过我的目标是用ruby写一遍分词算法,给JavaEye3.0使用。所以没有多少精力组织Java开源分词算法项目。有兴趣的可以自己组织嘛。
我本来在项目里想用ferret的,但发现它不支持中文分词,自己又没工夫去写,所以用lucene做了一个搜索引擎,用rjb在rails里对java做的引擎进行调用.
18 楼
xzc
2007-03-18
good
19 楼
jeamzhang
2007-03-19
谢谢了!