0
0

More than 1 year has passed since last update.

lucene の CJKAnalyzer で Trigram を可能にする。

Last updated at Posted at 2022-10-14

の続きのような記事です。
読んでいなかったら、読んでから来るといいと思います。

成果物

Lucene の CJK、Bigram しか対応しておらず...

Lucene の Tokenizer には、CJK という 日本語韓国語中国語 を n-gram にしてくれるものがあるんですが、それが Bigram 対応のみで Trigram 対応してくれていません。なので、ここでは、Trigram 対応の Java ファイルを作ろうと思います。

Trigram にするためのメソッド

メソッドは、flushTrigramhasBufferedTrigram があります。flushTrigram では attributeSource に登録された CharTermAttribute などに Trigram の内容を追加し、

CJKTrigramFilter.java
  /**
    Flushes a trigram token 
  */ 
  private void flushTrigram() {
    clearAttributes();
    char[] termBuffer = termAtt.resizeBuffer(6);
    int len1 = Character.toChars(buffer[index], termBuffer, 0);
    int len2 = len1 + Character.toChars(buffer[index + 1], termBuffer, len1);
    int len3 = len2 + Character.toChars(buffer[index + 2], termBuffer, len2);
    termAtt.setLength(len3);
    offsetAtt.setOffset(startOffset[index], endOffset[index+2]);
    typeAtt.setType(TRIPLE_TYPE);
    if (outputUnigrams) {
      posIncAtt.setPositionIncrement(0);
      posLengthAtt.setPositionLength(2);
    }
    index++;
  }

hasBufferedTrigram では Trigram で分けるかどうかの判別をしています。

CJKTrigramFilter.java
  private boolean hasBufferedTrigram() {
    return bufferLen - index > 2;
  }

一応、これで、CJKAnalyzer の CJKBigramFilter の部分を CJKTrigramFilter に変えれば、Trigram で判定が行われるようになると思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0