从非结构化信息中获得更多的价值。研究一个简单的文本挖掘应用程序如何使用 UIMA SDK 构建的文本分析引擎在文档中寻找人名。然后,另一个 UIMA 组件将结果写入 DB2® 数据库中的表。然后利用这些数据,使用 DB2 Intelligent Miner 寻找在文档中经常同时提到的人之间的强关联。简介人们越来越希望使用信息技术从组织中的非结构化信息中获得更大的价值。IBM 最近引入了新的 Unstructured Information Management Architecture(UIMA)框架(参见 参考资料),这个框架简化了分析非结构化媒体对象(比如文档)的系统的开发和部署,可以用来提供语义搜索和文本挖掘等功能。文本挖掘就是用于从文本中提取信息的数据挖掘技术。接下来,具体描述一个非常简单的文本挖掘应用程序。概述本文中描述的文本挖掘应用程序称为 PReston,它对文档进行分析,寻找提到的人名,并使用文本挖掘寻找经常同时提到的人。尽管这种技术只是众多有用的文本挖掘技术之一,但是它演示了这类应用程序的主要特性,并为介绍 UIMA 的使用提供了一个具体示例。它还演示了如何组合结构化数据库和文本挖掘。本文面对的读者是希望了解如何使用新的 UIMA 技术将非结构化和结构化信息联系在一起的人。图 1 给出了 Preston 的概况。这个程序对存储为 DB2 数据库表中的文本字段的文档进行分析。UIMA 框架中的组件从数据库读取并分析文档,寻找以某种格式提到的名称,然后将结果写到另一个数据库 Extracted Information Database(EIDB) 中。这些组件是使用 UIMA SDK 中的工具开发和部署的,UIMA SDK 可以从 developerWorks 获得(参见 参考资料)。对 EIDB 中的信息要进行分析后处理,以便预备进行文本挖掘,这是使用 DB2 Intelligent Miner 完成的。整个应用程序可以很轻易地在笔记本计算机上运行。图 1. 本文中描述的 Preston 文本挖掘应用程序的概况
![](/images/load.gif)
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 类型名显示为斜体。箭头指出继续关系。
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
<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。
这种模式称为垂直模式(vertical schema),它有两个主要优点。它非常灵活,因为通过在 predicate_type 列中使用不同的值,可以很轻松地插入新的关系。其次,它使关系和它们的语义变成显式的,而在标准的数据库模式中许多关系隐含在模式的设计中。垂直模式还更加接近于语义 Web 标准,比如 RDF。通过定义视图而不是显式的表,可以避免垂直模式的主要缺点,即许多查询要求它与本身进行联结,而这种操作是很昂贵的。将 UIMA_RELATIONS 视图创建为两个 SQL 选择语句的联合。一个选择语句为 “Mentioned_in” 谓词创建行,另一个为 “Has_name” 谓词创建行。第一个选择语句将人和文档联系起来。它从 EIDB 中的 INSTANCES 表中取出人实例,并通过与其他表进行联结,寻找提到这个人实例的文档。证据 URI 是文档 URI。第二个 SQL 选择语句为 “Has_name” 谓词创建行,它将人实例与他们的名字字符串联系起来。因为这个谓词所需的所有信息都在 INSTANCES 表中,因此构造一个证据 URI 指向这个表中的相关行。Preston 中的数据挖掘要寻找关联,它需要定义另一个视图 MINING_VIEW,这个视图的格式根据下面描述的 DB2 Intelligent Miner 工具的需求进行定义。它是通过对 UIMA_RELATIONS 视图进行自我联结建立的。挖掘视图只包含两列,见 表 2。第一个列是人可读的实体标识符,在这个例子中是人名。第二个列是出现此人的 “事务” 的惟一 ID。在这个例子中是提到此人的文档的 URI。表 2. MINING_VIEW 视图的模式。两个列的类型都是 VARCHAR。
列名
说明
name
一个描述实体的字符串,例如一个人实例的名字。
transaction_id
出现此实体的事务的惟一标识符,例如文档的 URI。
假如我们考虑到关联挖掘最初的动机 —— Market Basket Analysis,那么事务 ID 的重要性就很明显了。假如把购物篮(Market Basket,例如超级市场中的购物车)看作 “事务”,把它的标识符看作事务 ID,那么关联挖掘就可以用来寻找购物车中两个或多个商品之间的关联。在 Preston 中,文档相当于购物车,文档中提到的人相当于购物车中的商品。假如还有其他关系,尤其是采用 “人-关系-人” 形式的二元关系,那么关系实例相当于购物车,关系中的主体和对象是购物车中的商品,事务标识符是关系实例的标识符。关联挖掘的输出是一组采用以下形式的规则entity1, entity2 => entity 3这表示,在一个事务中假如同时存在 entity1 和 entity2,那么 entity3 可能以一定的概率存在。这个例子是一个长度为 3 的规则。在 Preston 中,我们寻找的规则只是将两个人联系起来,比如:personA => personB,这种规则的长度是 2。这个规则的强度表示 personA 和 personB 在同一个文档中一起出现的可能性。强度的几种度量由关联的挖掘算法进行计算。我们使用 DB2 Intelligent Miner 进行关联挖掘。安装了 DB2 之后,可以通过在 SQL 语句中调用存储过程来调用这个产品。清单 3 所示的调用使用了 Intelligent Miner 提供的一个 “简单挖掘过程”。在这个调用中,PRESTON 是创建的模型名,MINING_VIEW 是要挖掘的视图,下面两个数字参数为生成的规则的强度设置阈值,即最低支持度为 0.01%,最低可靠度是 1%。最后一个参数指定最大规则长度是 2。支持度 和可靠度 是关联规则强度的度量。支持度就是符合这一规则的事务的比例,可靠度度量包含 personA 的文档也提到 personB 的可能性。考虑共同提及的一种办法是定义一个网络或图,假如两个人在至少一个文档中被同时提到,那么在网络中就在他们之间建立链接。这个网络隐含在挖掘视图中。DB2 Intelligent Miner 的有用功能之一是能够在这个网络中寻找强连接的子图。这些子图中的人频繁地被同时提到。一个例子见 图 6,这是由 DB2 Intelligent Miner Visualization 绘制的。可以看到,通过对 IMDB 传记文档中的共同提及数据进行数据挖掘,找到了现实生活中一些闻名的关联。这里采用不同的颜色表示关联的强度,橙色比白色强,白色比蓝色强。这个子图指出了披头士乐队和与他们高度相关的人。清单 3. 这个 SQL 语句调用 “简单挖掘过程” 来进行关联挖掘。BuildRuleModel 是 DB2 Intelligent Miner 提供的一个用户定义函数。 CALL IDMMX.BuildRuleModel( 'PRESTON', 'MINING_VIEW',
'TRANSACTION_ID', 0.01, 1, 2)图 6. DB2 Intelligent Miner 在文本分析找到的共同提及关系网络中发现的强连接子图。
![](/images/load.gif)