Connection conn;
ResultSet rs;
// Not shown: code to set up the Connection and to
// populate the ResultSet from the input database
public void getNext( CAS cas) {
// Not shown: code to check that the ResultSet contains more data
// Get the document text and put it into the CAS
String content = resultSet.getString( "TRIVIA"); //get document text
JCas jcas = cas.getJCas();
jcas.setDocumentText( content); // set document text
// Construct a URI for this document
String id = rs.getString( idColName); // get primary key
String url = conn.getMetaData().getURL(); // database URL
String uri = url + "/" + tableName + "/" + idColName + "#" + id;
// set URI into a SourceDocumentInfo
SourceDocumentInfo docInfo = new SourceDocumentInfo( jcas);
docInfo.setURI( uri); // set uri feature value
docInfo.addToIndexes();
// Advance to next row in the ResultSet
nextRow();
}
使用一个 xml 描述符文件让 UIMA 框架了解 SQLReader。每个 UIMA 组件都有这样的文件,可以使用 SDK 中的工具或手工创建这种文件。描述符指向组件的实现,在这种情况下是一个类文件,还包含组件需要的任何配置信息。对于 SQLReader,描述符包含源数据库的 URL 和登录所需的用户 id/密码等信息。在进行初始化时,使用 UIMA 提供的方法读取这些信息。 描述符中另一个非常重要的信息是组件使用的类型系统的引用。CAS 将数据存储为有类型的结构,类型系统定义了类型以及类型之间的关系。图 2 显示 Preston 中使用的类型系统。类型系统是使用 SDK 工具定义的,这些工具还创建与类型系统中的类型对应的 java ™ 类。清单 1 中的 SourceDocumentInfo 就是这样的类。它的 URI 属性用于保存 SQLReader 创建的文档 URI。(在 UIMA 处理结束时,这个 URI 将从 CAS 复制到 EIDB 中。) 图 2. Preston 使用的 UIMA 类型系统。内置的 UIMA 类型名显示为斜体。箭头指出继续关系。 Son of actor 'John Barrymore (I)' (qv) and actress 'Dolores Costello' (qv).
Annotator 接口中最重要的方法是 initialize 和 process。当框架调用 initialize 时,NameReferenceAnnotator 从描述符以字符串形式读取正则表达式并编译它。然后,当调用 process 时,它在从 CAS 收到的文档文本中寻找与正则表达式匹配的地方。每当找到匹配时,就将它作为图 2 所示的类型系统中的类型实例存储在 CAS 中。每个名字存储为一个 NameReference 对象,这个对象包含正则表达式找到的名字字符串,它的开头和结尾字符位置设置为 NameReference 从 Annotation 内置类型继续来 begin 和 end 整数特性。NameReference 还包含一个 DocumentEntity 引用。这个结构的功能是存储关于文档中提到的每个实体(人)的信息。假如多次提到一个实体,那么每次提到时都引用同一个文档实体。使 Preston 比较简单的一个因素是:在 IMDB 数据中,提到同一个人的所有地方都采用完全相同的形式。所以,很轻易识别适当的 DocumentEntity。假如必须对 Preston 进行扩展来处理其他类型的输入数据,那么必须能够处理同一名字的不同形式。例如,假如在 图 3 所示文档的较长版本中提到 “Mr Barrymore”,那么必须意识到这引用了与 “John Barrymore (I)” 一样的实体。进行这种连接所需的处理称为文档内共同引用(in-document co-reference)。在 Preston 中,不需要这种处理,因为 IMDB 数据非常一致。 创建 Extracted Information Database 为了在 NameReferenceAnnotator 从文档集合中发现的信息上进行文本挖掘,所有 CAS 中的提及信息和文档实体信息必须写入一个结构化数据库。这是在文档处理流程结束时进行的(参见 图 1)。在处理结束时接收每个 CAS 的组件称为 CAS 消费者,UIMA 为这个组件提供了 CasConsumer 接口。一个 UIMA 处理管道可以有多个 CAS 消费者,在从 Text Analysis Engine 退出时,这些 CAS 消费者依次接收每个 CAS。Preston 使用两个 CAS 消费者。一个称为 cas2jdbc,它将来自每个 CAS 的数据写到一个关系数据库(DB2)的表中;另一个称为 EidbManager,它忽略接收的 CAS,但是在每次运行开始时设置数据库,并在分析完所有文档之后对所有信息进行后期处理。 图 4. Extracted Information Database(EIDB)的结构 <explicitMappingRule applyToSubtypes="false">
<type>com.ibm.fisc.preston.NameReference</type>
<table>MENTIONS</table>
<featureMappings>
<featureMapping>
<feature>name</feature>
<length>1024</length>
<column>SPAN</column>
</featureMapping>
<featureMapping>
<feature>
entity/com.ibm.fisc.preston.DocumentEntity:uniqueId()
</feature>
<column>DOCENT_ID</column>
</featureMapping>
</featureMappings>
</explicitMappingRule>
在处理完最后一个文档之后,EIDB 中的 MENTIONS 和 DOCENT 表保存着找到的所有人名提及的信息。但是,给定的人名可能在多个文档中被提及。使用实例(instance) 这个术语表示在一个或多个文档中提到的一个实体。EIDB 中的 INSTANCES 表记录关于实例的信息,DE_INST 表维护从每个文档实体到对应的实例的链接。需要判定来自不同文档的哪些实体实际上是同一实例,这种处理称为跨文档共同引用(cross-document co-reference)。在 Preston 中,跨文档共同引用的处理是在框架调用 EidbManager CAS 消费者的 collectionProcessComplete 方法时执行的。在 Preston 中,这个任务相当简单,因为在 IMDB 中总是以完全相同的方式提到人名,所以很轻易判定不同文档中的哪些实体应该链接到同一实例。在其他生产应用程序中,跨文档共同引用可能非常复杂,实际上这个领域还有待研究。在 Preston 中,这种处理只需要两条 SQL 语句,它们在 INSTANCES 表中为 DOCENT 表中的每组独特人名创建一个条目,并在 DE_INST 表中创建对应的行。Extracted Information Database 已经完成了,可以用于数据挖掘了。 为关联进行数据挖掘 我们对 EIDB 中的数据进行数据挖掘,寻找高度相关的人。两个人之间有关联的证据是在同一个文档中提到了他们,也就是,他们被共同提及。还可以包含其他证据,这可以通过包含其他结构化数据(比如用数据库表记录哪些人为同一部电影工作过),或者通过进行更深入的文本分析。其他文本分析使我们能够根据文本中的语句寻找人们之间的其他关系。通过添加更多标注器来寻找这些关系,并在类型系统中添加更多可以存储在 CAS 中的类型,就能够创建包含 “实体-关系-实体” 三元组(也称为 “主体-谓词-对象” 三元组)的数据库表。为了便于以后提供这种功能,将 EIDB 中的共同提及数据转换为一个面向三元组的模式,实现的方法是在数据库上定义一个具有这种结构的视图。这个视图的模式称为 UIMA_RELATIONS,见 表 1。 表 1. UIMA_RELATIONS 视图的模式。所有列的类型都是 VARCHAR。列名 | 说明 |
subject_type | 主体实体的类型,例如 NameReference。 |
subject_uri | 主体实体的惟一标识符,采用 URI 形式。 |
predicate_type | 谓词的类型,例如 Has_name。 |
object_type | 对象的类型,比如 Document 或 String。 |
object_name | 对象实体的 URI(假如它的类型是 Document), 或者对象的字符串值(假如它的类型是 String)。 |
evidence_uri | 应用程序用来获得这个关系的证据的 URI, 例如文档的 URI。 |
列名 | 说明 |
name | 一个描述实体的字符串,例如一个 人实例的名字。 |
transaction_id | 出现此实体的事务的惟一标识符, 例如文档的 URI。 |
CALL IDMMX.BuildRuleModel( 'PRESTON', 'MINING_VIEW',
'TRANSACTION_ID', 0.01, 1, 2)
图 6. DB2 Intelligent Miner 在文本分析找到的共同提及关系网络中发现的强连接子图。 新闻热点
疑难解答