本文通过一个demo,学习DeepDive教程
本文中我们的目标是将使用非结构化的输入,在关系数据库中存储提取出的结果,并且加上deepdive对每个提取结果的预测置信度
也就是写一个DeepDive应用根据一个特定的模式来提取mentions与相邻实体和属性之间的关系。
这就是关系抽取任务。我们希望从新闻文章中抽取是夫妻关系的两个人的mentions.
高级的步骤有:
- 数据处理。首先加载原始语料,添加NLP标注,提取候选关系对,以及一个mention相互间关系的稀疏特征
- 对数据和规则的远程监督。接下来使用不同的方法来为数据提供监督,便于机器学习模型来学习权重
- 学习和推断。指定模型高层次的配置
- 误差分析和调试
0.准备
0.1 声明预测什么
应该告诉DeepDive我们想要预测的随机变量,保存在DDlog这一语言编写的文件中
%%file app.ddlog
# 本程序的目的是预测给定的两个mention是否为夫妻关系
has_spouse?(
p1_id text,
p2_id text
).
这回生成一个has_spouse表
0.2 设定数据库
接下来,DeepDive会把所有的数据:输入、中间结果、输出都保存在关系数据库中(一般为Postgresql)
1.数据处理
本节,将会产生统计学习问题的传统输入:候选夫妻关系,这些关系通过一系列特征集合表示。我们要预测候选夫妻关系是否为真实关系
有下面四个步骤:
- 加载原始输入数据
- 添加NLP标注
- 提取候选关系实体对
- 提取每个候选对的特征
1.1 加载原始输入数据
第一个任务是下载和加载语料库,并放到数据库中的articles表
最好保存每篇文章的id和内容。通过articles表中定义schema来实现
%%file -a app.ddlog
## Input Data #################################################################
articles(
id text,
content text
).
DeepDive使用一个脚本把原始语料库转换为一个名字转换的tsj文件中。
这个脚本会读取JSON格式的原始语料,然后分割成id和context两个部分,保存成TSJ形式
使用这个脚本会将原始语料库转换为数据库中的article表。由两列组成:id和content
加载到数据库中之后,可以查看数据库的数据
!deepdive query '|10 ?- articles(id, content).'
1.2 添加NLP标注
接下来使用Stanford的CoreNLP来为content添加有用的标注和结构。
这些步骤包括把文章分为句子以及单词。此外还有单词原型(lemma)、词性(POS)、实体识别(NER),句子依存关系等标注
这些在app.ddlog中定义输出的模式
%%file -a app.ddlog
## NLP markup #################################################################
sentences(
doc_id text,
sentence_index int,
tokens json,
lemmas json,
pos_tags json,
ner_tags json,
doc_offsets json,
dep_types json,
dep_tokens json
).
这里将会生成一个sentence表
接下来定义一个DDlog函数输入doc_id 和 content ,以上面的格式输出每一行.
这个函数作为一个脚本(nlp_markup.sh)来对articles中每一行来进行NLP标注,并且把结果附加到行的后面。
在执行这个脚本之前,需要启动CoreNLP服务器。
执行完之后,查看添加NLP标注后的一个样本。
1.3 提取候选关系集
抽取所有的people
首先定义person表的schema
%%file -a app.ddlog
## Candidate mapping ##########################################################
person_mention(
mention_id text,
mention_text text