导出带注释的 GATE 文件以在 Python 中进一步处理会导致字符偏移问题

问题描述

我使用通用文本工程架构 (GATE) 为命名实体识别 (NER) 任务手动注释数据。注释位于语料库级别,并与字符开始和结束偏移一起存储,如下所示:

 startOffset endOffset annotationType
 12          17        personName
 21          28        organisationName

当我尝试在 Python 中加载注释和原始文本文件时,字符偏移不匹配,即在 GATE 中,从偏移 12 开始到偏移 20 结束的给定实体可能正确地类似于人名,而在 Python 中偏移相同有点像什么东西。

理想情况下,我想标记语料库并用包含单词及其注释类型的元组替换文本中的注释,如下所示:

"This","is","Jane","Doe","speaking"
"This",("Jane",personName),("Doe","speaking"

这将使我更容易实现以 I、O、B 格式转换数据的最终目标,其中每个标记都写在带有注释标签或“O”的新行上,如果该单词没有注释在它的旁边。一个实体可以有多个令牌长,在这种情况下,所述实体的第一次出现接收“(B)eginning”标签,随后出现的接收“(I)nside”标签。如下图所示:

This O
is O
Jane B-personName
Doe I-personName
speaking O

然而,我不确定如何解决这个问题:通过使用 Python 或通过使用 GATE 和许多可用插件之一,即使用 Groovy 编辑器。有多种方法可以导出 GATE 文件,例如通过 XML、json 或使用 Groovy 的纯文本,但在使用 UTF-8 编码时导入任何一种文件类型都会导致字符偏移不匹配。出于这个原因,我创建了一个 Python 脚本来首先修复错误的注释,但是这段代码很长,效率不高,感觉就像我试图解决一个不应该存在的问题。我在这文章底部写了我目前的高级方法

作为参考,下面显示一个示例 XML 文件片段,输入以下文本作为输入,其中国家和城市名称标记为“地名”:

Sweden is a country in Europe.
Paris is the capital of France.
In Spain it's often sunny.

这会产生以下 GATE 输出 XML:

<?xml version='1.0' encoding='UTF-8'?>
<GateDocument>
<!-- The document content area with serialized nodes -->

<TextWithNodes><Node id="0"/>Sweden<Node id="6"/> is a country in <Node id="23"/>Europe<Node id="29"/>.&#xd;
<Node id="32"/>Paris<Node id="37"/> is the capital of <Node id="56"/>France<Node id="62"/>.&#xd;
In <Node id="68"/>Spain<Node id="73"/> it's often sunny.<Node id="91"/></TextWithNodes>
<!-- The default annotation set -->

<AnnotationSet>
<Annotation Id="1" Type="gateFinal" StartNode="0" EndNode="6">
<Feature>
  <Name className="java.lang.String">kind</Name>
  <Value className="java.lang.String">Toponyms</Value>
</Feature>
</Annotation>
<Annotation Id="2" Type="gateFinal" StartNode="23" EndNode="29">
<Feature>
  <Name className="java.lang.String">kind</Name>
  <Value className="java.lang.String">Toponyms</Value>
</Feature>
</Annotation>
<Annotation Id="3" Type="gateFinal" StartNode="56" EndNode="62">
<Feature>
  <Name className="java.lang.String">kind</Name>
  <Value className="java.lang.String">Toponyms</Value>
</Feature>
</Annotation>
<Annotation Id="4" Type="gateFinal" StartNode="32" EndNode="37">
<Feature>
  <Name className="java.lang.String">kind</Name>
  <Value className="java.lang.String">Toponyms</Value>
</Feature>
</Annotation>
<Annotation Id="5" Type="gateFinal" StartNode="68" EndNode="73">
<Feature>
  <Name className="java.lang.String">kind</Name>
  <Value className="java.lang.String">Toponyms</Value>
</Feature>
</Annotation>
</AnnotationSet>
</GateDocument>

目前我通过标记输入语料库同时记住每个标记的字符偏移量来“修复”不正确的偏移量。然后我从 XML 文件的“注释集”部分检索注释。然后我遍历所有注释的列表并找到注释标记的第一次出现并从最后找到的标记继续循环,同时存储正确的注释偏移量。最终我将语料库偏移量与注释偏移量合并。但是,一个错误可能会导致此脚本崩溃,因此我很想找到更好的解决方案。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...