我正在使用Apache UIMA进行有关域特定实体提取的NLP任务的应用程序。
用例如下:
有Office文档或PDF(已扫描,未扫描)作为输入,应用程序需要从中获取特定于域的数据。该文档可以包含自由文本或/和键值,表格,图片
面临的挑战:
有时原始文档可以包含表(带元数据或不带表)。注释特定的独立令牌没有问题。但是,我正在寻找在表内建立带注释的标记之间关系的示例(例如,它具有带有一些业务属性的标题,并且在行下方包含属性值,因此我需要创建适当的关系以及定义组,以便之后提取信息实例,例如,表的每一行都是一个由一些原始实体编译并受关系限制的业务实体实例。
所以有问题:
示例:
<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>
Name Favorite Color
Bob Yellow
Michelle Purple
答案 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的有用工具,其中包括profiling和testing。
免责声明:我是UIMA Ruta的开发人员