GATE将注释ID写为功能

时间:2013-10-28 17:46:33

标签: java xml annotations machine-learning gate

我想知道有人可以帮助我。我认为这对于任何试图在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的功能。我认识到Batch Learning PR中使用的配置文件(relations-config.xml)查找“Person”和“Organization”类型的id功能。如果不存在这些ID功能,它将无法运行。所以我手动添加它,然后通过机器学习“APPLICATION”模式运行它。它运作得相当不错。但是我显然不希望每次都手动将id功能添加到我的XML文件中。

我用门代码编写的内容: 我相信我已经找到了我需要更改的代码文件(final.jape,org_context.jape和name_context.jape),因此他们可以将该id功能添加到包含“Person”和“Organization”的每个注释中。我不太了解GATE使用的语言(我是一名机械工程师,而不是软件工程师),这可能就是为什么我无法解决这个问题(哈!)。无论如何,我可能会关闭,可能需要添加更多的行来使jape文件正常工作,但我觉得我已经非常仔细地指出了它。有两部分代码相似但略有不同,这些代码目前是我存在的祸根。第一个通过迭代器循环,第二个没有。我将下面那些2复制/粘贴在一行,说明WHAT_DO_I_PUT_HERE,表明我认为我的问题和解决方案在哪里。如果有人可以帮我完成我需要写的东西以获得我的结果,我将非常感激。

谢谢!   - 托德

////////////第一段代码////////////////

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);
}

////////////第二段代码////////////////

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);
}

2 个答案:

答案 0 :(得分:2)

在创建实际注释之前,您无法访问注释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); 
}

答案 1 :(得分:1)

这很简单。您必须通过某个标签(在我的示例中为token_match)标记规则的右侧(RHS)上的注释,然后在左手侧< / em>(LHS)规则,只需获取相应的 AnnotationSet 形式bindings变量并迭代注释(通常只有一个注释)并将相应的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")