我最近发现了 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 除外)?
最佳答案
为您的注释类型生成 JCas 包装器类(您可以使用 UIMA 附带的用于 Eclipse 的类型系统编辑器 UIMA 插件来执行此操作)。这将为您提供可用于访问注释的 Java 类——这些类为功能提供了 getter 和 setter。
您应该看看 uimaFIT ,它提供了一个更方便的 API,包括从 JCas 检索注释的便捷方法,例如select(jcas, Token.class) (其中 Token.class 是您使用类型系统编辑器生成的类之一)。
您可以在 Groovy scripts 页面上找到一些快速入门的 DKPro Core 和 UIMA 组件集合。
UIMA@GSCL 2013 教程(幻灯片和示例代码)中的 Material 可能对您有用。转到 here 并向下滚动到“教程”。
披露:我是 UIMA、uimaFIT、DKPro Core 的开发人员和 UIMA@GSCL 2013 研讨会的共同组织者。
关于java - 如何开始 UIMA 和简单的 NLP 任务?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19840576/