月曜日, 9月 01, 2008

[Scala] CJKでも十分?(SpanScorer)

SpanScorerというので、確かにCJK利用時のハイライタが改善された。

◆SpanScorerの実行例(○)
D:\scala-2.7.0-final\bin\test>..\scala -classpath .;lucene3\lucene-core-2.4-dev.jar;lucene3\lucene-highlighter-2.4-dev.jar;lucene3\lucene-analyzers-2.4-dev.jar HighlightCJKSpan
このプログラムは酒造で合資の会社である、<B>酒造合資</B>会社の事業所で作成されました

◆QueryScorerの実行例(×)
D:\scala-2.7.0-final\bin\test>..\scala -classpath .;lucene3\lucene-core-2.4-dev.jar;lucene3\lucene-highlighter-2.4-dev.jar;lucene3\lucene-analyzers-2.4-dev.jar HighlightCJKQuery
このプログラムは<B>酒造で合資</B>の会社である、<B>酒造合資</B>会社の事業所で作成されました

Javaが書けないのでScalaで(ソースは以下)。

import org.apache.lucene.analysis._;

import org.apache.lucene.analysis.cjk._;

import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.highlight._;

import java.io._;

object HighlightCJKSpan {
val CONTENT = "このプログラムは酒造で合資の会社である、酒造合資会社の事業所で作成されました";
val QUERY_STRING = "酒造合資";
val F = "f";
//var analyzer: Analyzer = new NGramAnalyzer(1,3);
var analyzer: Analyzer = new CJKAnalyzer();

def main(args: Array[String]) {
try{
var qp :QueryParser = new QueryParser( F, analyzer );
var query :Query = qp.parse( QUERY_STRING );

//var scorer :Scorer = new QueryScorer( query, F );
var tokenStream :TokenStream = analyzer.tokenStream(F, new StringReader(CONTENT));
var scorer :SpanScorer = new SpanScorer( query, F, new CachingTokenFilter(tokenStream));

// println(tokenStream);
/*
var token :Token = tokenStream.next();
while(token != null){
println(token.termText());
token = tokenStream.next();
}
*/

var h :Highlighter = new Highlighter( scorer );
println( h.getBestFragment( analyzer, F, CONTENT ) );
} catch {
case e:StringIndexOutOfBoundsException => ()
case e:Exception => {
e.printStackTrace
}
} finally {
// println("FINALLY");
}
}
}

nagaShimaさんのページを参考にさせて頂きました。