zoukankan      html  css  js  c++  java
  • CLucene对中文文本的按字建索引与搜索

    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对中文文本的按字建索引与搜索
  • 相关阅读:
    [SAM学习笔记]
    CF513G3 Inversions problem
    AtCoder Beginner Contest 204
    [SDOI2017]序列计数
    CF993E Nikita and Order Statistics
    多项式板子
    多项式杂学笔记
    「雅礼集训 2017 Day5」远行
    Mysql备份恢复工具
    个人选择上网的流量方式对比
  • 原文地址:https://www.cnblogs.com/cy163/p/1214777.html
Copyright © 2011-2022 走看看