我想知道有人可以帮助我。我认为这对于任何试图在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);
}
答案 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")
。