一起使用UIMA、斯坦福核心NLP

一起使用UIMA、斯坦福核心NLP,nlp,tokenize,stanford-nlp,opennlp,uima,Nlp,Tokenize,Stanford Nlp,Opennlp,Uima,UIMA和StanfordNLP在操作管道之后生成输出,就像我们要进行词性标记一样,因此在输入文本中首先进行标记化,然后进行词性标记 我想使用UIMA的标记化,并在Stanford CoreNLP的POS标记器中使用该标记。但是Stanford CoreNLP的POS标记器需要在POS标记器之前运行标记器 那么,是否可以在同一管道中使用不同的API? 是否可以同时使用UIMA标记器和斯坦福CoreNLP?将UIMA中不同工具链(例如,等)的分析步骤组合在一起的典型方法是将每个步骤包装为UIMA分

UIMA和StanfordNLP在操作管道之后生成输出,就像我们要进行词性标记一样,因此在输入文本中首先进行标记化,然后进行词性标记

我想使用UIMA的标记化,并在Stanford CoreNLP的POS标记器中使用该标记。但是Stanford CoreNLP的POS标记器需要在POS标记器之前运行标记器

那么,是否可以在同一管道中使用不同的API?
是否可以同时使用UIMA标记器和斯坦福CoreNLP?

将UIMA中不同工具链(例如,等)的分析步骤组合在一起的典型方法是将每个步骤包装为UIMA分析引擎。分析引擎充当UIMA数据结构(CAS)和单个工具(例如OpenNLP POS标记器或CoreNLP解析器)使用的数据结构之间的适配器。在UIMA级别,这些组件可以组合到管道中

有各种各样的UIMA组件集合包装这样的工具链,例如,或

下面的示例结合了OpenNLP分段器(标记器/句子拆分器)和Stanford CoreNLP解析器(在本例中还创建POS标记)。该示例实现为一个脚本,使用创建和运行管道,使用DKPro核心集合的组件

#/usr/bin/env groovy
@抓取(group='de.tudarmstadt.ukp.dkpro.core',
module='de.tudarmstadt.ukp.dkpro.core.opennlp asl',
版本='1.5.0')
@抓取(group='de.tudarmstadt.ukp.dkpro.core',
module='de.tudarmstadt.ukp.dkpro.core.stanfordnlp gpl',
版本='1.5.0')
导入静态org.apache.uima.fit.pipeline.SimplePline.*;
导入静态org.apache.uima.fit.util.JCasUtil.*;
导入静态org.apache.uima.fit.factory.AnalysisEngineFactory.*;
导入org.apache.uima.fit.factory.JCasFactory;
导入de.tudarmstadt.ukp.dkpro.core.opennlp.*;
导入de.tudarmstadt.ukp.dkpro.core.stanfordnlp.*;
import de.tudarmstadt.ukp.dkpro.core.api.segmentation.type.*;
import de.tudarmstadt.ukp.dkpro.core.api.syntax.type.*;
def jcas=JCasFactory.createJCas();
jcas.documentText=“这是一个测试”;
jcas.documentLanguage=“en”;
运行管道(jcas,
createEngineDescription(OpenNlpSegmenter),
createEngineDescription(StanfordParser,
StanfordParser.PARAM_WRITE_PENN_TREE,true));
选择(jcas,Token).each{println“${it.coveredText}${it.pos.posValue}}”
选择(jcas,PennTree).each{println it.PennTree}
其输出(经过大量日志记录输出后)应如下所示:

This DT
is VBZ
a DT
test NN
(ROOT
  (S
    (NP (DT This))
    (VP (VBZ is)
      (NP (DT a) (NN test)))))
我以Groovy脚本为例,因为它是开箱即用的。Java程序看起来非常相似,但通常会使用Maven或Ivy来获取所需的库

如果您想尝试该脚本,并且需要有关安装Groovy和潜在故障排除的更多信息,您可以找到更多信息


披露:我正在处理DKPro核心和Apache UIMA uimaFIT项目。

如果您想使用CoreNLP作为管道,至少有两种方法可以处理此问题

  • 强制CoreNLP忽略这些要求

    Properties=newproperties();
    道具放置(“强制要求”、“虚假”);
    道具放置(“注释器”、“位置”);
    
    这将消除“缺少需求”错误。但是,CoreNLP中的POSTaggerAnnotator希望标记是CoreLabel对象,并希望句子是CoreMap对象(实例化为ArrayCoreMap),因此您必须转换它们

  • 将自定义注释器添加到管道

    CoreMaps/CoreLabels是以类作为键的映射,因此您需要为自定义注释提供类/键:

    公共类自定义注释{
    //这个类将充当一个键
    公共静态类UIMATokensAnnotation
    实现CoreAnnotation{
    //getType()定义/限制与此键关联的值的类型
    公共类getType(){
    返回ErasureUtils.uncheckedCast(List.class);
    }
    }  
    }
    
    您还需要一个注释器类:

    public类UIMATokensAnnotator实现注释器{
    //StanfordCoreNLP.class需要此构造函数签名
    公共UIMATokensAnnotator(字符串名称、属性和属性){
    //初始化你需要的任何东西
    }
    @凌驾
    公共空心注释(注释){
    List tokens=//运行UIMA标记化并将输出转换为CoreLabels
    annotation.set(CustomAnnotations.uimatokensanotation.class,tokens);
    }
    @凌驾
    公共设置要求已满足(){
    返回集合。单例(标记化_要求);
    }
    @凌驾
    公共集需要()个{
    返回集合;
    }
    }
    
    最后:

    props.put(“customAnnotatorClass.UIMAtokenize”、“UIMATokensAnnotator”)
    道具放置(“注释器”、“UIMAtokenize、ssplit、pos”)
    
    UIMA/OpenNLP/etc.语句注释可以以类似的方式添加为自定义注释器。 查看选项2的压缩版本


  • UIMA令牌化器和斯坦福令牌化器有多大不同?另外,我不明白为什么要使用UIMAtokenizer@DanielUIMA和Standford标记器之间的不同之处在于,它们将以不同的数据结构提供输出。我们可以从这些数据结构中提取令牌,但是如何在Standford POS标记器的POS标记中使用UIMA标记器创建的令牌。就像我尝试用props=newproperties()的属性运行Standford POS一样;道具放置(“注释器”、“标记化、ssplit、pos”);如果我尝试以如下方式运行:Properties props=newproperties();道具放置(“注释器”、“位置”);由于标记器和ssplit缺失,它给出了错误。@Daniel的目标不仅是使用UIMA标记器,而且是使用U