CLucene 0.9.16版本支持中文方法

重新去学习搜索

1,环境:windows平台,vc8


2,项目设置:必须设置为Use Unicode Character Set。
因为使用ANSI时,汉字存在与其他语言编码重叠的问题,在分析文本时,很难判断一个char是否是半个汉字,或者是前半个汉字还是后半个汉字。同时,CLucene对UCS2编码能够提供支持,所以VC项目直接设置为Use Unicode Character Set。


3,需要对三处代码进行修改:

3-1,/src/CLucene/util/Misc.cpp,line 76的Misc::_cpycharToWide函数
这个函数是CLucene中用来将char字符串转换为wchar_t字符串,但原有代码中的转化方式是不考虑编码,因此对汉字由ANSI到UCS2转换会失效,需要修改成使用windows API的MultiByteToWideChar函数

3-2,/src/CLucene/analysis/standard/StandardTokenizer.cpp
这个类实现了最基本的切分文本功能,包含英文分词、数字提取。虽然有包含CJK单字提取,但是不够完善。

3-2-1,line 117的StandardTokenizer::next函数
这个函数用来获取下一个token。一个token可以简单地理解为一个英文单词、或一个数字、或CJK单字,是索引或搜索时的基本单位。在原有代码中,ReadAlphaNum比ReadCJK函数先执行,而在中文windows系统上,将一个UCS2编码的汉字(正好一个wchar_t)作为参数传给iswalpha函数时,返回值是true。因此,项目修改为使用Unicode编码后,ReadCJK函数不会被调用到。所以需要将原代码中的if (_CJK)的判断分支放到if (ALPHA)前面,提前执行。

3-2-2,line 261的StandardTokenizer::ReadCJK函数
这个函数用于读取一个CJK的token。在函数中加入了CONSUME_CJK的宏调用,会导致解析器一直读取下去,直到遇到CJK单字为止,相当于把整个句子做成一个token。直接把这个宏调用屏蔽,就会将每个CJK单字作为一个token。同时也意味着,在这里可以加入中文分词。

通过对上面3处的修改,就可以实现CLucene对中文文本的按字建索引与搜索

 

4. 中文分词添加:

主要有2个方向:1)、 /src/CLucene/analysis/standard/StandardTokenizer.cpp
这个类实现了最基本的切分文本功能,包含英文分词、数字提取。虽然有包含CJK单字提取,但是不够完善。直接完善这里面的StandardTokenizer::ReadCJK处理中文函数;2)、添加一个新的 ChineseTokenizer.cpp处理中文分词问题;3)、中文分词方法:2分法,基于词典匹配法等,根据需要确定合适的方法,并不是越复杂越好。

我花了大约2周时间去跟踪clucene里面的索引建立和查询过程,最终只改了几行代码实现了简单的2分词法,实现了中文检索。

详细的网址信息:

http://hi.baidu.com/developer_chen/blog/item/8c4c62dfc5a3a7124954039c.html

http://hi.baidu.com/_1_1_1_1/blog/item/be1fe41f9fbf0f62f724e475.html

http://www.cnblogs.com/sunli

下面这篇文章非常好,阐述了系统架构和部分对象层次结构,有利于大家对lucene的深入理解,推荐给大家。

开放源代码的全文检索引擎Lucene
http://blog.csdn.net/heiyeshuwu/archive/2006/04/14/662805.aspx
对于中文分词,实际上一般需求都比较简单,不需要太复杂,大家可随意尝试。对于大型 系统来说,毕竟速度是非常重要的。

 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/meiqing_2/archive/2007/08/10/1736426.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值