关于Lucene中文分词的highlight显示

来源:互联网 发布:婴儿车 知乎 编辑:程序博客网 时间:2024/05/17 06:34
关于Lucene中文分词的highlight显示字体变小 字体变大

   在lucene使用highlighter包实现高亮显示,对于英文文档不会出现问题,但对于中文总是得不到正确的结果。网上能寻找到的解决方案是这样的:

    “将highlight包中的一个额外的判断去掉。对于中文来说没有明显的单词界限,所以下面这个判断是错误的:tokenGroup.isDistinct(token)”也就是说让这个函数总是返回false。

     但是在我的程序中使用这种方法并没有解决问题。下面分析一下highlighter的原理。

     如果使用highlight包,在建立索引的时候必须保存被索引词的位置,即使用“ Field.TermVector.WITH_POSITIONS_OFFSETS”

 Field f = new Field(FIELD_NAME, text ,

                                   Field.Store.YES, Field.Index.TOKENIZED,

                                   Field.TermVector.WITH_POSITIONS_OFFSETS);

    这样我们就可以通过Token.startOffset() 以及Token.endOffset() 两个函数,直到索引词在原始文档中的偏移量,高亮显示既是根据这个偏移量计算得到的。下面看一个例子:

      “the quick brown fox”,这句话中the偏移为[0->3],接下来quick 的偏移是[4-9],注意这里Token.endOffset() 的含义是“one greater than the position of the last character corresponding to this token in the source text.”,所以the偏移为[0->3],而不是[0-2]...。英文中每个词Token的偏移和在原始文档的偏移是恰好对应的,例如quick的在原始文档的起始位置是4。

    在看看中文的例子

     “中文分词技术”这句话,被切分为“中文 分词 技术”。“中文”的偏移为[0->2],“分词”的偏移为[3-5],...

    如果这时使用“中文分词技术”作为原始文档,我们可以看到“分词”这个关键词在原始文档的起始位置是2,不是3!中文高亮显示的错误问题就出在这里,中文分词后引入了空格,而原始文档中是没有空格的,这就造成了Token的偏移和原始文档中的偏移不一致的问题!

   可是使用下面的方法解决这个问题:

    使用“中文 分词 技术”作为highlighter原始文档,再最终显示的时候再把空格去掉。highlighter包不必做任何修改。

    另外一种方法是在建立索引时指定Token的startOffset() 以及endOffset,不要把空格计算在内,原始文档还是使用“中文分词技术”,这样Token的偏移和原始文档的偏移就对应起来了。此时,因为中文词之间没有界限,highlighter包中的“tokenGroup.isDistinct(token)”函数修改为总是返回false。(这种方法我没有测试过).