最近、UIMA ( http://uima.apache.org/ ) について知りました。トークン化、文の分割、品詞のタグ付けなどの単純な NLP タスクに有望です。
パイプラインに OpenNLP コンポーネントを使用している、構成済みの最小限の Java サンプルをなんとか手に入れることができました。
コードは次のようになります。
public void ApplyPipeline() throws IOException, InvalidXMLException,
ResourceInitializationException, AnalysisEngineProcessException {
XMLInputSource in = new XMLInputSource(
"opennlp/OpenNlpTextAnalyzer.xml");
ResourceSpecifier specifier = UIMAFramework.getXMLParser()
.parseResourceSpecifier(in);
AnalysisEngine ae = UIMAFramework.produceAnalysisEngine(specifier);
JCas jcas = ae.newJCas();
jcas.setDocumentText("This is my text.");
ae.process(jcas);
this.doSomethingWithResults(jcas);
jcas.reset();
ae.destroy();
}
private void doSomethingWithResults(JCas jcas) {
AnnotationIndex<Annotation> idx = jcas.getAnnotationIndex();
FSIterator<Annotation> it = idx.iterator();
while (it.hasNext()) {
System.out.println(it.next().toString());
}
}
OpenNlpTextAnalyzer.xml からの抜粋:
<delegateAnalysisEngine key="SentenceDetector">
<import location="SentenceDetector.xml" />
</delegateAnalysisEngine>
<delegateAnalysisEngine key="Tokenizer">
<import location="Tokenizer.xml" />
</delegateAnalysisEngine>
Java コードは次のような出力を生成します。
Token
sofa: _InitialView
begin: 426
end: 435
pos: "NNP"
toString() メソッドが使用する各 Annotation オブジェクトから同じ情報を取得しようとしています。値がどこから来ているのかを理解するために、UIMA のソース コードを調べました。それらを取り戻そうとする私の試みはうまくいきますが、決して賢くはありません。
JCas オブジェクトから情報を抽出する簡単な例を見つけるのに苦労しています。
たとえば、PosTagger または SentenceSplitter によって生成されるすべての Annotations を取得して、さらに使用する方法を探しています。
私は推測する
List<Feature> feats = it.next().getType().getFeatures();
値を取得するための開始ですが、UIMA はプリミティブ型のクラスを所有しているため、注釈クラスの toString メソッドのソース コードでさえ平手打ちのように読み取れます。
基本的な UIMA を使用する Java コードはどこにありますか? また、優れたチュートリアル (フレームワーク自体の javadoc を除く) はどこにありますか?