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

中文分词“庖丁解牛”BUG修正:高亮显示错位的问题

阅读更多
现象:检索后对关键字高亮显示时,高亮位置严重错误。使加粗在不相关的地方。

严重性:严重。

解析
该现象的发生是由于建立索引的token位置构造错误引起的。经过诊断,错误的地方为XTokenizer.java的next方法。还好,代码只需要 做2、3行的增减。


解决

在原来的XTokenizer类next方法找到:


// 构造"牛",并使用knife"解"之 
beef.set(0, charCount); 



然后在他们的下一行,dissected = 0;的前面
加上offset += Math.abs(dissected);这一行
同时删除掉:
offset -= remainning;
offset += read;
这两行。(这两行在代码中并不是紧哎的)


修改后的next方法如下


@Override 
public Token next() throws IOException { 
    // 已经穷尽tokensIteractor的Token对象,则继续请求reader流入数据 
    while (tokenIteractor == null || !tokenIteractor.hasNext()) { 
        System.out.println(dissected); 
        int read = 0; 
        int remainning = -1;//重新从reader读入字符前,buffer中还剩下的字符数,负数表示当前暂不需要从reader中读入字符 
        if (dissected >= beef.length()) { 
            remainning = 0; 
        } 
        else if (dissected < 0){ 
            remainning = bufferLength + dissected; 
        } 
        if (remainning >= 0) { 
            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 += Math.abs(dissected); // 增加这个代码
            //offset -= remainning;   //删除或注释掉这行代码
            dissected = 0; 
        } 
        dissected = knife.dissect((Collector)this, beef, dissected); 
        //offset += read;// !!! //删除或注释掉这行代码
        tokenIteractor = tokenCollector.iterator(); 
    } 
    // 返回tokensIteractor下一个Token对象 
    return tokenIteractor.next(); 

} 


不是从SVN上下载代码的同学,需要自己更新代码
分享到:
评论
5 楼 心无旁骛 2007-08-08  
请问lz的庖丁解牛在linux要怎么样跑起来呢?
4 楼 rainsf 2007-08-07  
Qieqie 写道
现象:检索后对关键字高亮显示时,高亮位置严重错误。使加粗在不相关的地方。

严重性:严重。

解析
该现象的发生是由于建立索引的token位置构造错误引起的。经过诊断,错误的地方为XTokenizer.java的next方法。还好,代码只需要 做2、3行的增减。


解决

在原来的XTokenizer类next方法找到:


// 构造"牛",并使用knife"解"之 
beef.set(0, charCount); 



然后在他们的下一行,dissected = 0;的前面
加上offset += Math.abs(dissected);这一行
同时删除掉:
offset -= remainning;
offset += read;
这两行。(这两行在代码中并不是紧哎的)


修改后的next方法如下


@Override 
public Token next() throws IOException { 
    // 已经穷尽tokensIteractor的Token对象,则继续请求reader流入数据 
    while (tokenIteractor == null || !tokenIteractor.hasNext()) { 
        System.out.println(dissected); 
        int read = 0; 
        int remainning = -1;//重新从reader读入字符前,buffer中还剩下的字符数,负数表示当前暂不需要从reader中读入字符 
        if (dissected >= beef.length()) { 
            remainning = 0; 
        } 
        else if (dissected < 0){ 
            remainning = bufferLength + dissected; 
        } 
        if (remainning >= 0) { 
            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 += Math.abs(dissected); // 增加这个代码
            //offset -= remainning;   //删除或注释掉这行代码
            dissected = 0; 
        } 
        dissected = knife.dissect((Collector)this, beef, dissected); 
        //offset += read;// !!! //删除或注释掉这行代码
        tokenIteractor = tokenCollector.iterator(); 
    } 
    // 返回tokensIteractor下一个Token对象 
    return tokenIteractor.next(); 

} 


不是从SVN上下载代码的同学,需要自己更新代码



楼主,这个问题我发现很久了,也曾发过信给你叫你改正,很高兴你见到你的贴子,但问题仍未解决。
如索引中存在“中华人民共和国”,现在搜索“中华”、“人民”或“中华人民”,都会将“中华人民共和国”全部高亮,希望得到解决。。。
3 楼 johnnyhg 2007-08-07  
Thanks
2 楼 Qieqie 2007-08-07  
https://paoding.googlecode.com/svn/trunk
1 楼 johnnyhg 2007-08-07  
请问能告知svn地址吗?

相关推荐

    lucene 中文分词 庖丁解牛

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

    庖丁解牛 中文分词工具

    "庖丁解牛"是一款专为中文处理设计的分词工具,其版本2.0.4-alpha2提供了更稳定和高效的分词体验。这个工具的核心功能是将中文文本拆分成有意义的词语,这对于中文信息处理、自然语言理解和搜索引擎优化等场景至关...

    中文分词 庖丁解牛 2_0_0版本发布 - 企业应用

    【庖丁解牛 2_0_0版本】是一个专门针对中文分词的软件工具,其在企业应用中扮演着重要角色。中文分词是自然语言处理中的基础步骤,对于文本分析、信息检索、机器翻译等领域至关重要。在这个2_0_0版本的更新中,我们...

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

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

    庖丁解牛分词源码

    "庖丁解牛分词器"是一款著名的中文分词工具,源自开源社区,因其高效的性能和灵活的应用场景而广受欢迎。在深入理解其源码的过程中,我们可以了解到许多关于自然语言处理(NLP)和Java编程的知识点。 1. **中文分词...

    庖丁解牛分词时需要的高亮显示jar包

    庖丁解牛分词时需要的高亮显示jar包,高亮显示需要的jar包

    lucene3庖丁解牛中文分词器

    “庖丁解牛”中文分词器是一款专为中文文本处理设计的工具,其名字来源于古代寓言故事,寓意对复杂问题的深入理解和熟练掌握。它在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 : / ...

    庖丁解牛分词之自定义词库、庖丁解牛配置

    "庖丁解牛分词"是一个针对中文文本的分词工具,它借鉴了中国古代庖丁解牛的故事,寓意对文本进行精细、深入的剖析。这个工具的主要目标是帮助开发者更准确地切分中文句子,提取关键信息,从而提升搜索效率或理解文本...

    庖丁解牛工具

    "庖丁解牛工具"是一款基于Java开发的文本分析工具,尤其在中文分词领域有着广泛的应用。这个工具的名字来源于中国古代寓言故事“庖丁解牛”,寓意对文本的精细处理和深入理解,就像庖丁对牛肉的熟练切割一样。在IT...

    庖丁解牛分词 java包

    "庖丁解牛分词" 是一款针对中文文本处理的分词工具,主要适用于Java环境。这个工具包的名称形象地借用中国古代故事“庖丁解牛”,寓意对文本的精细处理,如同庖丁对牛肉的熟练分解。在Java开发中,分词是自然语言...

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

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

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

    "庖丁解牛"分词器采用了先进的算法和技术来解决这个问题,包括基于词典的匹配、上下文信息分析以及统计学习方法等,使得它在处理中文文本时表现出了较高的准确性和效率。 "Lucene"是一个流行的开源全文搜索引擎库,...

    庖丁解牛jarbao

    "庖丁解牛jarbao"是一个专为中文分词设计的工具,它的核心是"庖丁解牛中文分词器"。在Java开发环境中,它通常以jar包的形式提供,如"paoding-analysis - 3.1.jar",这表明它是基于Java语言实现的,并且是版本3.1的...

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

    然而,由于中文的复杂性,简单的英文分词策略无法满足需求,于是有了针对中文的分词方法——"庖丁解牛分词法"。该方法是专门为了解决Lucene在处理中文文本时的分词难题而设计的。在本文中,我们将深入探讨这一分词法...

    庖丁解牛 源码 for Lucene 2.4

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

    庖丁解牛分词器jar包

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

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

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

    全文检索(庖丁解牛)

    在这里,"庖丁解牛"被用来形容一种精细的分词方法,它可能是指在进行全文检索时,对文本进行深入细致的分析,就像庖丁解剖牛一样,精确地识别和拆分出每个词语。 分词是全文检索的重要步骤,它将连续的文本序列分割...

Global site tag (gtag.js) - Google Analytics