1

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

我用 GATE 代码得出的结论:我相信我找到了需要更改的代码文件(final.jape、org_context.jape 和 name_context.jape),以便他们可以将该 id 功能添加到包含“Person”的每个注释中”和“组织”。我不太了解 GATE 使用的语言(我是机械工程师,而不是软件工程师),这可能就是我无法弄清楚的原因(哈!)。无论如何,我可能会离开,并且可能需要添加几行才能让 jape 文件正常工作,但我觉得我已经非常准确地指出了它。有两段代码相似但略有不同,这是我目前存在的祸根。第一个通过迭代器循环,第二个没有。我复制/粘贴了下面的那两个,并用一行说明 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);
}
4

2 回答 2

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); 
}
于 2015-02-24T18:07:25.990 回答
1

这很简单。您必须通过一些标签(在我下面的示例中)标记规则右侧(RHS)上的注释,然后在规则的左侧(LHS)上,获取相应的AnnotationSet表单变量并迭代注释(通常其中只有一个注释)并将相应的 ID 复制到输出。token_matchbindings

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")

于 2014-09-22T09:14:29.473 回答