1

我有一组文档,每个文档都有不同的标题。例如,如果文档标题显示“心理评估”,我想将文档标记为“Medicalrule”。

  1. 我加载了文档并使用默认值加载了 ANNIE。
  2. 在 Processing Resources > New > Jape Transducer 2.1 在文本文档中写入以下代码并将其保存为 .JAPE 扩展名

代码 :


Phase: ConjunctionIdentifier
Input: Token Split    
Rule: Medicalrule
(
({Token.string=="Psychological"})+({Token.string == " "})+ ({Token.string == "Evaluation"}):Meddoc({Token.kind=="word"})
)

--> 
:Meddoc
  {
    gate.AnnotationSet matchedAnns= (gate.AnnotationSet) bindings.get("Meddoc"); gate.FeatureMap newFeatures= Factory.newFeatureMap();newFeatures.put("rule","Medicalrule");annotations.add(matchedAnns.firstNode(),matchedAnns.lastNode(),"CC", newFeatures);
 }

  1. 加载上面创建的 .JAPE 文件并重新初始化

应用程序运行后,注释集不显示标记!

我在某个地方做错了吗?如果有人可以帮助我,那就太好了。

珍惜你的时间。

谢谢

4

2 回答 2

2

我确定没有像这样的注释:Token.string == ""。尝试改用 SpaceToken 注释。另外,为什么不尝试使用地名词典而不是将文本值硬编码到 JAPE 代码中呢?

于 2013-12-03T11:30:17.737 回答
1

我可以在这里看到三个问题。

  • 首先,正如ashingel 所说,空格不表示为Token注释 - 这是故意的,因为在大多数情况下,您不关心单词之间的间距,只关心单词本身。
  • 其次,尾随({Token.kind=="word"})意味着该规则仅在“Psychological Evaluation”后跟在当前句子结尾之前的另一个单词时匹配(因为您已经Split在 Input 行中)。
  • 第三,您只是将Meddoc标签绑定到“评估”令牌,而不是整个匹配。

我会尝试简化规则的 LHS:

Phase: ConjunctionIdentifier
Input: Token Split    
Rule: Medicalrule
(
  {Token.string=="Psychological"}
  {Token.string == "Evaluation"}
):meddoc

对于 RHS (a) 你不需要做显式bindings.get,因为你已经使用了一个标记的块,所以你已经有了可用的绑定注释,(b) 你应该使用outputAS而不是annotations,并且 (c) 你通常应该避免采用节点的add方法,因为如果输入和输出注释集不同,则不安全。如果您正在使用 GATE 的最新快照,那么gate.Utils静态方法可以在这里为您提供很多帮助

:meddoc {
    Utils.addAnn(outputAS, meddocAnnots,"CC",
                 Utils.featureMap("rule","Medicalrule"));
}

如果您使用的是 7.1 或更早版本,则该addAnn方法不可用,因此稍微复杂一些:

:meddoc {
  try {
    outputAS.add(Utils.start(meddocAnnots), Utils.end(meddocAnnots),"CC",
                 Utils.featureMap("rule","Medicalrule"));
  } catch(InvalidOffsetException e) { // can't happen, but won't compile without
    throw new JapeException(e);
  }
}

最后,只是为了检查一下,您确实将新的 JAPE Transducer PR 添加到管道的末尾吗?

于 2013-12-03T12:23:09.537 回答