`
Qieqie
  • 浏览: 337803 次
  • 性别: 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地址吗?

相关推荐

Global site tag (gtag.js) - Google Analytics