UIMA,从文本中提取 semi-structured(表格)数据

UIMA, extraction semi-structured (tabular) data out of the text

我正在使用 Apache UIMA 开发有关领域特定实体提取的 NLP 任务的应用程序。

用例如下:

有 Office 文档或 PDF(均为扫描件,non-scanned)作为输入,应用程序需要从中获取域特定数据。文档可以包含自由文本 or/and key-values、tables、图片

挑战是什么:

有时原始文档可以包含 tables(带元数据或 w/o)。注释特定的独立令牌没有问题。但是,我正在寻找一些在 table 内的注释标记之间建立关系的示例(例如,它具有 headers 和一些业务属性,下面的行包含属性值,因此我需要创建适当的关系作为以及定义组,以便我以后可以提取信息实例,例如,table 的每一行都是一个由一些原始实体编译并受关系约束的业务实体实例。

所以有疑问:

  1. 我正在寻找在注释规则方面更灵活和人类可读的东西,即当 table-form 数据需要注释时,我可以在这种情况下使用 Ruta 吗?任何规则示例都会很有帮助。关于这个主题的研究还没有给出太多。
  2. 我正在寻找在不存在元数据的情况下如何提取数据的方法(见下文。Ruta 套件在这里或其他任何地方?任何示例将不胜感激
  3. 我正在寻找可以简化注释文本工作的工具,即用于分析、测试目的的工具。再一次,Ruta 会解决它吗?

示例:

  1. 带元数据的 OCR,提取阶段后的数据:
<table> 
    <tr> 
      <th>Name</th> 
      <th>Favorite Color</th> 
    </tr> 
    <tr> 
      <td>Bob</td> 
      <td>Yellow</td> 
    </tr> 
    <tr> 
      <td>Michelle</td> 
      <td>Purple</td> 
    </tr> 
</table>
  1. OCR w/o 元数据,提取阶段后的数据:
Name    Favorite Color
Bob Yellow
Michelle    Purple

问题 1:

在我非常主观的意见中,Ruta 非常适合这些任务,特别是如果文本处理应该在 UIMA 中实现。根据可用的注释和 table 的结构,在 Ruta 中有无数的选项来指定这个提取任务。这是一组基于 HtmlAnnotator 输出的示例性规则(实际上,它只是一个规则):

PACKAGE uima.example;

TYPESYSTEM utils.HtmlTypeSystem;

ENGINE utils.HtmlAnnotator;

EXEC(HtmlAnnotator, {TAG});

ADDRETAINTYPE(WS);
TAG{->TRIM(WS)};
REMOVERETAINTYPE(WS);

DECLARE Relation (Annotation attribute, Annotation value);

BLOCK(tables) TABLE{} {
    TR{-CONTAINS(TH)-> CREATE(Relation, "attribute" = a, "value" = v)}
        <-{# a:TD v:TD;};
}

问题二:

您当然可以使用规则重新创建问题 1 的 table 结构,然后应用相同的规则。识别 table 结构在很大程度上取决于您掌握的有关 table 的信息以及文本转换器产生的输出,例如,您是否知道将发生哪种 attributes/values 或使用转换器用于分隔单元格的选项卡。这又是一组基于 PlainTextAnnotator 输出的示例性规则:

PACKAGE uima.example;

TYPESYSTEM utils.PlainTextTypeSystem;

ENGINE utils.PlainTextAnnotator;

EXEC(PlainTextAnnotator, {Line});

ADDRETAINTYPE(WS);
Line{->TRIM(WS)};
Paragraph{->TRIM(WS)};
REMOVERETAINTYPE(WS);

DECLARE Relation (Annotation attribute, Annotation value);
DECLARE Attribute, Value;

DECLARE TextTable, Row;
DECLARE HeaderInd, HeaderLine;

// mock some annotations
"Name" -> HeaderInd;
"Color" -> HeaderInd;

Line{CONTAINS(HeaderInd, 50, 100, true)-> HeaderLine};

Paragraph{STARTSWITH(HeaderLine)-> TextTable};
TextTable->{Line{-PARTOF(HeaderLine)-> Row};};

FOREACH(row) Row{}{

    row{CONTAINS(W,2,2)} ->{W{-> Attribute} W{-> Value};};
    row{-> CREATE(Relation, "attribute" = Attribute, "value" = Value)};
}

问题三:

UIMA Ruta Workbench 提供了几个有用的 IDE 工具,其中包括 profiling and testing.

免责声明:我是 UIMA Ruta 的开发者