2

私は現在、キーフレーズ抽出ツールに取り組んでいます。これは、Web サイト上のテキストまたはドキュメントのタグ候補を提供する必要があります。私はこの論文で提案されている方法に従います:ニューラル ネットワークを使用したキーフレーズ抽出への新しいアプローチ私は最初のステップ、つまり候補選択に OpenNLP ツールキットの POSTagger を使用しています。

一般に、キーフレーズ抽出は非常にうまく機能します。私の問題は、POSTagger を使用するたびに、モデルに対応するファイルからこの高価なロードを実行する必要があることです。

posTagger = new POSTaggerME(new POSModel(new FileInputStream(new File(modelDir + "/en-pos-maxent.bin"))));
tokenizer = new TokenizerME(new TokenizerModel(new FileInputStream(new File(modelDir + "/en-token.bin"))));
// ...
String[] tokens = tokenizer.tokenize(text);
String[] tags = posTagger.tag(tokens);

これは、このコードが Web サーバー自体のスコープではなく、特定の 1 つの要求のみを処理するライフサイクルを持つ「ハンドラー」内にあるためです。私の質問は、ファイルを一度だけロードするにはどうすればよいですか? (モデルがロードされるのを待って、その後200ミリ秒だけ使用するのに10秒を費やしたくありません。)

私の最初のアイデアは、Java の組み込みメカニズムを使用して、POSTaggerME ( TokenizerME resp.) をシリアライズし、必要なたびにデシリアライズすることでした。残念ながら、これは機能しません。例外が発生します。(毎回分類子を構築 (またはトレーニング) する必要がないように、最後に候補を分類する WEKA ツールキットから分類子をシリアル化します。したがって、これは POSTaggeME にも適用できると思います。残念ながら、これはそうではありません。)

Tokenizer の場合、単純なWhitespaceTokenizerを参照できます。これは劣ったソリューションですが、それほど悪くはありません。

tokenizer = WhitespaceTokenizer.INSTANCE;

しかし、信頼できる POSTagger にはこのオプションがありません。

4

1 に答える 1

1

トークン化/POS タグ付けパイプラインをsingletonでラップするだけです。

基礎となる OpenNLP コードがスレッド セーフでない場合は、呼び出しを同期ブロックに入れます。次に例を示します。

// the singletons tokenization/POS-tagging pipeline 
String[] tokens;
synchronized(tokenizer) { 
   tokens = tokenizer.tokenize(text);
}
String[] tags;
synchronized(posTagger) { 
   tags = posTagger.tag(tokens);
}
于 2010-12-06T20:22:54.493 に答える