の続きのような記事です。
読んでいなかったら、読んでから来るといいと思います。
成果物
Lucene の CJK、Bigram しか対応しておらず...
Lucene の Tokenizer には、CJK という 日本語韓国語中国語 を n-gram にしてくれるものがあるんですが、それが Bigram 対応のみで Trigram 対応してくれていません。なので、ここでは、Trigram 対応の Java ファイルを作ろうと思います。
Trigram にするためのメソッド
メソッドは、flushTrigram
と hasBufferedTrigram
があります。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 で判定が行われるようになると思います。