UIMA,从文本中提取半结构化(表格格式)数据

时间:2019-05-09 12:01:06

标签: nlp uima ruta

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

用例如下:

有Office文档或PDF(已扫描,未扫描)作为输入,应用程序需要从中获取特定于域的数据。该文档可以包含自由文本或/和键值,表格,图片

面临的挑战

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

所以有问题:

  1. 我正在寻找一种在注释规则方面更灵活,更易于阅读的内容,即当需要对表格数据进行注释时,我可以在这种情况下使用Ruta吗?任何规则示例都将非常有帮助。关于这个话题的研究还没有很多。
  2. 我正在寻找一种在没有元数据的情况下如何提取数据的方法(请参阅下文。Ruta套件在这里还是其他任何东西?任何示例将不胜感激
  3. 我正在寻找可以简化带注释文本(即用于性能分析和测试)的工具。再说一次,鲁塔会解决吗?

示例:

  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 元数据,提取阶段之后的数据:
Name    Favorite Color
Bob Yellow
Michelle    Purple

1 个答案:

答案 0 :(得分:0)

问题1:

在我的[strong>非常主观”看来,Ruta非常适合这些任务,特别是如果文本处理应在UIMA中实现。根据可用的注释和表的结构,在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;};
}

问题2:

您当然可以使用规则重新创建问题1的表结构,然后应用相同的规则。识别表结构在很大程度上取决于您具有的有关表的信息以及文本转换器产生的输出,例如,您是否知道将出现哪种属性/值或使用转换器选项卡来分隔单元格。这又是一组基于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)};
}

问题3:

UIMA Ruta工作台提供了一些IDE的有用工具,其中包括profilingtesting

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