【问题标题】:GATE write annotation ID as a featureGATE 将注释 ID 作为特征写入
【发布时间】:2013-11-07 15:03:03
【问题描述】:

我想知道是否有人可以在这里帮助我。我认为这可能对任何试图在 GATE(文本工程通用架构)上进行机器学习的人有用。所以基本上要进行机器学习,我首先需要向一些 jape 文件添加一些代码,这样我的输出 XML 文件就会打印出 Annotation Id 值作为特征。下面提供了一个示例:

<Annotation Id="1491" Type="Person" StartNode="288" EndNode="301">
<Feature>
  <Name className="java.lang.String">id</Name>
  <Value className="java.lang.String">1491</Value>
</Feature>

(注意1491的特征值与Annotation Id="1491"匹配。这是我想要的。)

为什么我需要这个: 我正在对最初不包含注释的纯文本文档进行机器学习。在执行此操作时,我使用 GATE 网站上的 2012 年 6 月培训课程作为指南。我特别关注模块 11:关系教程(它找到了个人和组织之间的雇佣关系)。我利用 93 个预注释文档的语料库进行训练,然后将学习到的模块应用到我的文档中。但首先我通过 ANNIE 运行我的文档。它创建了许多注释和功能,但不是机器学习所需的一切。我通过反复试验和调查了解到,我的注释文档必须包含每个“人员”和“组织”类型的带有注释 ID 的特征。我认识到批量学习 PR 中使用的配置文件 (relations-config.xml) 会查找“Person”和“Organization”类型的 id 特征。如果这些 ID 功能不存在,它将不会运行。所以我手动添加它,然后通过机器学习“APPLICATION”模式运行它。它工作得很好。但是,我显然不想每次都手动将 id 功能添加到我的 XML 文件中。

我通过门禁密码得出的结论: 我相信我已经找到了需要更改的代码文件(final.jape、org_context.jape 和 name_context.jape),以便他们可以将该 id 功能添加到包含“Person”和“Organization”的每个注释中。我不太了解 GATE 使用的语言(我是机械工程师,而不是软件工程师),这可能就是我无法弄清楚的原因(哈!)。无论如何,我可能会离开,并且可能需要添加几行才能让 jape 文件正常工作,但我觉得我已经非常准确地指出了它。有两段代码相似但略有不同,这是我目前存在的祸根。第一个通过迭代器循环,第二个没有。我复制/粘贴了下面的那两个,并用一行说明 WHAT_DO_I_PUT_HERE 表明我认为我的问题和解决方案在哪里。如果有人能帮我写出我需要写的东西来得到我的结果,我将不胜感激。

谢谢! - 托德

///////////第一段代码///////////////////p>

Rule: PersonFinal
Priority: 30
//({JobTitle}
//)?
(
 {TempPerson.kind == personName}
)
:person
--> 
{
gate.FeatureMap features = Factory.newFeatureMap();
gate.AnnotationSet personSet = (gate.AnnotationSet)bindings.get("person");
gate.Annotation person1Ann = (gate.Annotation)personSet.iterator().next();


gate.AnnotationSet firstPerson = (gate.AnnotationSet)personSet.get("TempPerson");
if (firstPerson != null && firstPerson.size()>0)
{
  gate.Annotation personAnn = (gate.Annotation)firstPerson.iterator().next();
  if (personAnn.getFeatures().containsKey("gender")) features.put("gender", personAnn.getFeatures().get("gender"));
}
  features.put("id", WHAT_DO_I_PUT_HERE.getId().toString());
  features.put("rule1", person1Ann.getFeatures().get("rule"));
  features.put("rule", "PersonFinal");
outputAS.add(personSet.firstNode(), personSet.lastNode(), "Person", features);
outputAS.removeAll(personSet);
}

////////////////////////////////////////////p>

Rule:OrgContext1
Priority: 1
// company X
// company called X

(
 {Token.string == "company"}
 (({Token.string == "called"}|
   {Token.string == "dubbed"}|
   {Token.string == "named"}
  )
 )?
)
( 
 {Unknown.kind == PN}
)
:org
-->
{
gate.AnnotationSet org = (gate.AnnotationSet) bindings.get("org");
gate.FeatureMap features = Factory.newFeatureMap();
features.put("id", WHAT_DO_I_PUT_HERE.getId().toString());
features.put("rule ", "OrgContext1");
outputAS.add(org.firstNode(), org.lastNode(), "Organization", features);
outputAS.removeAll(org);
}

【问题讨论】:

  • 我认为您不应该修改库,因为您的代码将与任何未来版本不兼容。

标签: java xml annotations machine-learning gate


【解决方案1】:

在创建实际注释之前,您无法访问注释 ID。我对这个问题的解决方案:

Rule:PojemId
(
 {PojemD}
):pojem
--> 
{
    AnnotationSet matchedAnns = bindings.get("pojem");  
    Annotation ann = matchedAnns.get("PojemD").iterator().next();

    FeatureMap pojemFeatures = ann.getFeatures();
    gate.FeatureMap features = Factory.newFeatureMap();
    features.putAll(pojemFeatures);
    features.put("annId", ann.getId()); 

    inputAS.remove(ann); 
    Integer id = outputAS.add(matchedAnns.firstNode(), matchedAnns.lastNode(), "PojemD", features);  
    features.put("id", id); 
}

【讨论】:

    【解决方案2】:

    这很简单。您必须在规则的 Right Hand Side (RHS) 上用一些标签(在我下面的示例中为token_match)标记注释,然后在 Left Hand Side (LHS),只需从bindings变量中获取对应的AnnotationSet并遍历注解(通常其中只有一个注解)并将对应的ID复制到输出即可。

    Phase: Main
    Input: Token 
    
    Rule: WriteTokenID
    (
      ({Token}):token_match
    )    
    -->
    {
      AnnotationSet as = bindings.get("token_match");
      for (Annotation a : as) 
      {
        FeatureMap features = Factory.newFeatureMap();
        features.put("origTokenId", a.getId());
        outputAS.add(a.getStartNode(), a.getEndNode(), "NewToken", features);   
      }
    }
    

    在您的代码中,您可能希望像下面这样标记{TempPerson.kind == personName}{Unknown.kind == PN}

    (
     ({TempPerson.kind == personName}):temp_person
    )
    :person
    

    (
     {Token.string == "company"}
     (({Token.string == "called"}|
       {Token.string == "dubbed"}|
       {Token.string == "named"}
      )
     )?
    )
    ( 
     ({Unknown.kind == PN}):unknown_org
    )
    :org
    

    他们分别使用bindings.get("temp_person")bindings.get("unknown_org")

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-03
      • 1970-01-01
      • 1970-01-01
      • 2016-12-17
      相关资源
      最近更新 更多