读书人

中文分词“庖丁解牛”BUG修正:高亮显

发布时间: 2012-10-31 14:37:31 作者: rapoo

中文分词“庖丁解牛”BUG修正:高亮显示错位的问题
现象:检索后对关键字高亮显示时,高亮位置严重错误。使加粗在不相关的地方。

严重性:严重。

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


解决

在原来的XTokenizer类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要怎么样跑起来呢?

读书人网 >软件架构设计

热点推荐