我最近发现了 UIMA ( http://uima.apache.org/ )。它看起来很有希望用于简单的 NLP 任务,例如标记化、句子分割、词性标记等。
我已经设法获得了一个已配置的最小 Java 示例,该示例使用 OpenNLP 组件作为其管道。
代码如下所示:
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 生成的所有注释以供进一步使用。
我猜
List<Feature> feats = it.next().getType().getFeatures();
是获取值的开始,但由于 UIMA 拥有原始类型的类,即使是注解类中的 toString 方法的源代码读起来也像是一记耳光。
我在哪里可以找到使用基本 UIMA 东西的 java 代码,哪里有好的教程(框架本身的 javadoc 除外)?