最近读到一篇不错的关于构建知识图谱的综述,做一下总结和读后感。
背景
在讲知识图谱前,首先得理解一下下游任务(诸如搜索技术)的难点。对于给定的输入query,如果检索系统中有较大的语料库(问答预料或文章数据),使用语义匹配查找近似query的历史FAQ或文章title,或许可以找到query的答案。但往往输入的query在语言描述上不够完备,那在这种情况下应该怎么办呢?
传统的搜索可能会先对query进行分词。对于检索系统中的语料,用倒排索引做好索引,再根据BM25等算法对分词结果中的词进行召回、排序。这一系列过程都会引入很多工程上的技巧,比如:建索引时过滤掉停用词;构建业务相关的词典加入分词器与索引中;改善排序算法的权重。
以上描述的搜索系统,都是基于关键词匹配的,也就是说只有语料中包含query的关键词,才会被系统检索到。显然这样基于关键字匹配的系统,会大大限制搜索的范围。换言之,仅使用分词后的query去匹配语料的系统,无法理解query所包含的语义信息。
要真正理解query所包含的语义信息,往往我们需要看到query所关联或者引申出的背后含义,而这一步则需要让系统有人类一样的抽象、总结、推理、改写、联想的能力。为了让机器拥有这样的能力,很重要的一点是让它们能接触到人类习以为常的背景知识,而这就是知识图谱能够发挥作用的地方。
概念
知识图谱本质上是一个语义网络,其中的节点代表实体或是概念,边代表实体(或概念)与另一个实体之间的语义关系。知识图谱在体系层面有三种组织分类:Ontology、Taxonomy和Folksonomy。
Ontology可以理解为:表示某个系统中实体以及其类型、属性、关系等的语义模型。Ontology定义的模型/规则,加上data,就构成了knowledge graph。
Taxonomy是一个具有层级结构(hierarchy)的分类,广泛地用来表示互联网上的网络结构,比如:文件列表(想象一下本地文件左侧展示的文本目录)、购物网站搜索的分类、百科网站的目录(含一级标题,二级标题等)。换言之,taxonomy中的节点,往往是以Hypernym-Hyponym关系构建的。
Folksonomy则是非层级(hierarchy)的结构,全部节点以标签分类。虽然灵活,但缺少了语义的精确性。
构建
构建知识图谱,第一部可以考虑从现有的半结构化、非结构化和公开的结构化数据库中获取数据。但整合数据时,需要做到概念消歧义、实体对齐等工作。
以维基百科为例,它就是高质量的半结构化数据,每个实体词都有丰富的context。段落的标题提供了结构化信息。为了抽取段落中的结构化信息,可能需要用到:命名实体识别、关系抽取、属性抽取、指代消解等技术。
Taxonomy可以理解为一个具有IsA关系的树状结构,但结构化目录所提供的IsA(或者说上下位关系)并不多,如何从非结构化数据或者半结构化数据的段落中抽取IsA关系就成了一个难点。
如段落中的某句话是:小明是一个运动员。如果和抽取小明IsA运动员就是一个典型的非结构化数据中关系抽取的问题。
Taxonomy构建技术
由于语料的篇幅、主题、内容、排版、质量存在巨大差异,通过模板设计抽取方式很难具有好的效果和迁移性。另一方面,语言多样性和跨领域消歧义也给这个任务带来了很大的挑战。
目前主流的方法包含两个步骤:
- 利用模板或者分布式表示从文本中抽取IsA关系对
- 从抽取的关系对中,推演出完整的taxonomy结构(taxonomy induction)
基于模板的方法(pattern-based)
通过设计类似于:“[C] such as [E]”,“[C] and [E]”的模板,可以从文本中找到符合这些句式的上下位关系对。模板方法一般召回率低,同时由于位置常用语、错误表达、抽取不全、歧义等问题,也可能导致模板抽取失败。
提高召回
第一类直观方法是,对模板进行扩展(pattern generalization),如给不同的实体类型设计不同的模板,通过冠词、助词的替换增加新的模板。也有一些自动学习模板的方法,比如通过句法依赖分析(dependency parsing),来查找可以作为模板的句法依赖路径。
为了提升自动学习的效率,可以考虑替换句子中的低频实体词,通过聚类的方法挑出general的pattern。类似的,也可以将depedency parsing中,随机替换path中的pos tag,ontological type或实体词。
第二类方法是迭代抽取。主要目的是防止一些general的pattern被重复多次抽取。
第三类方法是上位词推断(hypernym inference)。这类方法的主要思想是,语义相近的词,是否会具有相同的关系对。比如y是x的上位词,且x与x'意思相近,那y可能也是x'的上位词。有工作通过训练HMM模型,来预测句子迁移的预测。
提高准确率
通常可以用基于统计的方式来衡量抽取的准确率。如给定(x,y),系统可以计算它们的互信息;或者用似然概率表示y是x的上位的概率,通过最大似然估计得到这个概率值;也可以通过贝叶斯分类的预测结果、外部数据验证等方式。
基于分布式表示(distributional representation)的方法
NLP中常说的分布式表示一般是指词向量、句向量等表示学习的结果。这类方法大致有两个步骤:
- 获得种子数据集(key term)
- 用无监督或者有监督方法扩充关系对
key terms的抽取
种子数据集可以通过设计严格的pattern得到,这种方法可以在数据量较大时使用。但当数据量小时,由于pattern的局限性,只能抽取到少量数据,不利于后续训练。类似地,也可以使用序列标注或NER进行抽取,再加上规则过滤。对于垂直领域的taxonomy,可以结合某些统计数据进行过滤,如TF,TF-IDF,领域权重等。
扩充关系对
第一类方法是聚类,核心是如何设计距离评价指标。对于某个关系对(x,y),可以使用cosine,Jaccard,Jensen-Shannon divergence来衡量它们的距离。抽取的feature可以是两个词在语料中的共现频数、点互信息等。
第二类方法是有监督学习,比如classification或ranking。常见的做法是,将(x,y)关系对中的词输入预训练好的word embeddings(或单独的embedding layer)中,再将它们的word embedding拼接在一次,送入SVM或logistic regression中作二分类预测。然而这类模型很容易学习到semantic similarity(语义相似性),而非上下位关系。
除了分类器,也可以构建ranking model,称为上位词生成(hypernym generation):寻找与向量x的上位词最接近的向量y。
taxonomy induction
在抽取得到关系对后,下一步jiu是如何把它们进行整合,得到完整的taxonomy。常规方法是增量学习(incremental learning):初始化一个seed taxonomy,然后将新的关系对补充到其中。这个构建的方法也可以看成是聚类。比如有很多关系对先组成子树,再通过聚类将子树合并。
也可以从图结构出发,寻找入度为0的节点,这有很大可能是taxonomy的顶部(root);找到出度为0的节点,它们大概率是底部instance;再通过最长路径找到root到instance的path。
最后还需要对taxonomy进行清理,删去错误的关系对。一个典型的特征是观察是否存在环状结构。另一个问题是语义消歧,尤其当关系对是通过传递性扩充出来时,可能由于实体词指代或语义不清,导致传递发生错误。作者还给出了一些工业界上的方法,比如包括收集用户的搜索、点击日志,解析UCG内容,从中获取信息帮助消岐,并且反哺给知识图谱。
作者接下来举了两个例子中英文图谱构建的例子。
Probase构建
Probase强调probabilistic taxonomy,通过统计每个上下位词关系对的共现频数,来表示它们的确信度。构建过程大致分为两步:
- 利用Hearst Patterns获得原始语料中的上下位词候选对
- 根据上下位关系合并关系对,形成树状结构。根据横向或纵向合并原则,将子树合并成完成的图谱。横向合并的原则时,当两颗子树的儿子们非常相似;纵向合并则发生在,当某个节点y的子树,与x的某个节点z的子树相似时。
中文图谱构建
中文更为灵活,往往单纯的模板抽取召回率很低,因此需要考虑映射模型与模板相结合的方法。作者介绍了论文“Predicting hypernym-hyponym relations for Chinese taxonomy learning”中的方法。
记一个taxonomy为,其中是实体向量,表示关系。现在从外部数据源中抽取了一些关系对U,需要学习一个算法,将U中的关系对补充到T中。步骤如下:
- 将taxnomy中已有的关系对作为训练集,映射到词向量空间
- 根据词向量,训练线性映射模型(piecewise linear projection)
- 将模型应用到外部数据U上,加上规则筛选出新的关系对
- 将关系对补充到训练集中,迭代训练。
由于单一线性映射模型效果有限,作者先根据与训练的词向量,通过k-means将上下位词关系对聚类到不同的cluster中,对于不同类别的关系对,采用不同的线性映射模型。
参考:
https://zhuanlan.zhihu.com/p/69360094
Predicting hypernym-hyponym relations for Chinese taxonomy learning, Wang et.al. Knowledge and Information Systems