知识图谱应用技术总结:实体链接核心技术概述及链接项目开源实践
本文主要介绍实体链接的任务,包括其主要实现方法,供大家一起参考。
零、引言
在典型的知识图谱问答场景中,通常需要从用户的问句中识别出指定的实体,并将该实体准确地链接到知识图谱数据库当中。
例如,在 “李白这首歌是在唱唐朝的李白么?” 这一典型问句中,可以得到两个李白以及唐朝实体链接结果:
又如,用户询问“现在的苹果多少钱”时,需要识别出“苹果”这个实体的价格,但就“苹果”这一实体而言,在百度百科中就有19个不同实体(十分歧义),如蔷薇科苹果属植物、苹果产品公司、韩国2008年康理贯执导电影、Minecraft游戏中的食物类物品等。
需要准确地从这19个中准确的选择蔷薇科苹果属植物这个义项上,并从数据库中获取价格这一属性,作为答案进行返回。
实际上,类似的还有很多,例如在人物实体方面还有李娜(在百度百科中有117个)、姚明(在百度百科中有8个)。
实体链接是实现上述场景功能的重要方式,本文从领域实体链接关键技术出发,对实体链接任务的定义、候选实体提及的生成、候选实体块的匹配、候选实体的消歧等环节进行介绍,并给出了一个基于在线百科知识库的实体链接实现项目。
一、领域实体链接关键技术
1、实体链接任务的定义
与中文词义消歧(WSD)的任务类似,实体链接的目的是将实体提及与知识库中对应实体进行链接,是知识图谱应用过程中的十分基础性的工作,在知识库中找到候选的正确实体描述之后,才能准确无误地提供后续的实体查询、实体推理等下游任务。
实体链接,是指给定一篇文本中的实体指称(mention),确定这些指称在给定知识库中的目标实体(entity),本质上是一个匹配+筛选(消歧)的问题,其核心假设为 :如果两个实体所在的上下文信息一致的话,那么这两个实体就有可能是一个实体。
由于在一般情况下已有实体的数量非常大,一个去比较计算的效率非常低,因此常采用搜素引擎的“召回+排序”的方法,将实体链接划分成实体提及识别(候选实体生成)、目标实体排序与链接(候选实体消歧)两个阶段,先生成一堆实体候选以降低第二阶段的计算量,再对候选实体进行相似性排序,选出正确对应的实体的任务。
2、候选实体提及的生成
实体提及识别,即在给定文本中给出,想要链接的对象,即实体提及在所在文本中的起始、终止位置,也称实体块识别。
与经典的命名实体识别类型不同的是,命名实体识别需要完成实体边界的识别和实体类型的识别两种,实体类型是确定的,而实体链接中的实体类型是没有预设的, 但命名实体识别可以作为实体提及识别的一种方法,如识别出其中的地点、人物或者特定类的实体。
在实现上,一种是利用知识库的同义词库识别所有可能为实体的字段,然后进行筛选判断,另一种是对文本做语法分析,通过词本身及其语法特征识别实体,需要均衡考虑候选片段为实体的可能性和片段之间相互覆盖与选择的问题,比如“吴彦祖国籍是什么”,应该正确地识别“吴彦祖”和“国籍”,而不是识别“祖国”;
1)实体指称映射词典生成
实体指称映射词典在进行实体链接中占据着十分重要的地位,这个映射词典描述了标准实体以及该实体下对应的实体别名、全称、缩写词等。例如:
在进行候选实体发现时,可以利用“研发支出率”、“研发投入率”、“科研投入率”等词进行匹配,并映射到“研发费用率”这一标准实体词之上。为了生成实体指称映射词典,可以通过人工收集、同义词扩展、借助百科中的别名信息等方式进行构建,直接从已有的知识图谱抽取别名,针对已经有用户数据的,将搜索query和点击的答案中存在的实体建立映射关系,设计简称生成规则,如保险行业的保险产品名,把分词后的第一个词作为简称。
2)候选实体块的生成
给定一个句子,可能包含多个待链接的实体集合,这时,需要将所有可能的实体块都识别出来,从一个句子中得到实体块集合的方式有很多种。例如:
1.暴力ngram穷举法。 对句子进行按字或者词进行切分,组合形成若干个n-gram序列,其中n数量的设置可以通过预先统计知识图谱中实体的长度来确定,一般在2和10之间,“北京语言大学”可以分成“北京语言”、“语言大学”、“北京语言大学”等ngram序列;
2.搜索引擎切分方式。 借助分词工具中的搜索引擎切分方式,如jieba分词组件提供了全模式和搜索引擎模式两种切分方式,前者把句子中所有的可以成词的词语都扫描出来,后者在精确模式的基础上,对长词再次切分,提高召回率。也可以预先将目标实体集合作为用户词典进行干预分词。
3、候选实体块的匹配
候选实体块的生成,可以最大化地找出一个给定句子中可能出现的实体序列,在此之后需要过滤出真正有效的候选实体。过滤的方式包括两种:
1)基于提及映射词典的精确匹配。 通过设定输入的文本与词典之间的匹配规则来完成匹配,包括精确匹配和模糊匹配两种,如果命中标准实体或者对应的实体指称词,则返回候选实体结果;
2)基于提及映射词典的模糊匹配。 例如,考虑待处理文本和词典词二者之间是包含或者互包含关系,二者之间是否存在一定程度的重叠,二者符合字符串相似度算法等,以完成过滤;
3)基于提及与候选实体的词向量匹配。 除了显式地使用词典进行匹配之外,还可以词向量之间的匹配,输入文本与词典词都转化为词向量,然后凉凉比对,将大于阈值的进行保留;
4)通用命名实体类型过滤。 通用命名实体通常大规律都会成为有效的候选实体,因此也可以将识别出的命名实体追加到候选实体集合当中。
通常,为了加快匹配的速度,一般会采用信息检索的方式进行辅助,例如,将知识图谱目标实体及其类型信息都存入到elasticsearch当中,然后针对候选实体使用“match phrase”短语匹配的方式进行查询,
4、候选实体的消歧与链接
候选实体排序任务本质上是对实体提及和候选实体进行相似度判定,这可以拆分成候选实体表示、标准实体表示、实体对的相似度判定三个关键步骤。
其中,为候选实体以及目标知识图谱实体构造尽可能丰富的上下文信息,如将候选实体的类型信息、候选实体所在段落的主题信息等融入到上下文信息中,并考虑实体的流行度等信息,以及采用精度更高的相似度计算,是候选实体排序性能保证的关键。
1)基于无监督的候选实体排序
基于无监督的候选实体排序,通过设计打分规则,分别对候选实体和目标实体进行特征表示,然后使用相似度计算的方式得到相似度得分,常用的方法包括基于上下文无关特征的方法以及上下文相关特征的方法。
1.基于上下文无关特征的表示
在上下文信息缺失的情况下,只能利用实体自身的内容和信息来进行特征表示,或者借助wordnet、同义词词林等外部知识库扩充。进行打分排序,例如候选实体与目标实体在用词上的重合度(二者共有的词、字数量)、候选实体的类型是否一致等,以返回的得分作为候选实体的排序得分情况。
2.基于上下文相关特征的表示
利用实体提及与目标实体的上下文进行向量表示。例如,针对实体提及,使用文本的上下文,例如候选实体所在的句子作为实体提及的上下文,并使用经典的向量化方式进行表示;
针对目标实体,以该实体在知识图谱中的定义信息、知识图谱中与该实体相连的实体和谓词集合拼接作为对应的向量表示,如在实体识别链接评测任务中,链接对象为wikipedia,可以使用到的信息包括实体间关系、页面中常见的别名、实体描述、实体页面标题、实体类型等信息。
这种方法没有利用到实体之间的关系,因此,后续采用了基于图的表征方法,利用实体-实体链接和实体-实体提及链接构造成图,使用word2vec/预训练语言模型将实体描述等文本信息处理成实体原始向量,使用DeepWalk或其他Graph Embedding的方法处理得到包含全局结构信息的表示。
2)基于有监督的候选实体分类
基于有监督的候选实体排序方法,将该任务转换为一个端到端的二分类问题或者排序问题,核心思想为标注候选实体与目标实体之间的训练语料,构造正负样本,设计二元分类模型完成分类。
4、领域实体链接的关键问题
1)实体链接的复杂情况
实体连接存在着十分复杂的处理环境。
一方面,实体量巨大(有的是几千万,甚至几百亿)。这不仅对候选实体增加了大量噪音,而且也需要对实体进行相关领域判断。
另一方面,在待链接的实体规模扩大以及形式多样时,实体界限会变得很模糊,例如,通用知识库几乎包含了所有词,包括一些平凡的实体,比如“图片”、“钢笔”,还有一些成语俗语,比如“危言耸听”、“厚德载物”等,但这些实体在实际应用中通常是不希望被识别和链接出来的,这对实体词的判断带来了很大的难度。
2)短文本实体链接的困难
在许多场景下,候选实体并不存在丰富的上下文信息,尤其是在短文本或者超短文本的情况下,有的实体可能就是一个短句。
在大多数情况下,输入文本只是输入一个句子,有时候甚至是一个词组。与针对长文本或者文档的实体识别与链接方法不同的是,短文本输入的上下文信息非常缺乏,并且几乎没有共现实体的信息。
比如“冰与火之歌有多少卷”,在上下文无其他实体的语境中要识别并将“冰与火之歌”链接到小说而不是电视剧。但是现实生活中,大部分的文本信息都是以短文本的方式存在。
3)中英文实体链接的环境差异
现有的大量实体识别与链接工作是基于英文的,把基于英文的方法应用到中文中是有很大难度的。
首先,在特征提取方面,中文实体在字面上缺少很多英文实体具有的明显特征,比如大写、缩写等。
其次,处理中文文本需要处理分词问题。不同的分词结果影响着句子的语义表达结果,而且现在的分词技术也存在着许多缺陷, 分词的错误会对实体名边界的确认造成影响。
最后,中文实体识别还缺少训练数据,虽然有一些评测集,但规模很小。
二、基于在线百科知识库的实体链接实现
一词多义是中文信息处理中一个特别常见的现象,经典的"苹果是水果还是公司"问题一直是困扰大家的一个实际问题,而就“苹果”而言,其义项多达19个,如“苹果产品公司”、“邓丽欣演唱歌曲”等,而在知识图谱构建过程当中,经常会遇到实体链接的问题。
下面项目借助在线百科知识库,输入句子以及待链接的实体,通过获取百科义项,完成链接。
项目地址:
https://github.com/liuhuanyong/WordMultiSenseDisambiguation
1、实现思路
完整的实体链接流程包括实体识别(实体指称识别)和实体链接两个部分,实体识别可以通过基于目标实体名称的精确匹配、基于目标名称与ES搜索排序的实体识别方法,基于序列标注识别等方式完成。
第二个阶段的实体链接是核心部分,为了简要地说明实体链接的流程,本项目将对这一问题进行尝试,实现了一个依靠在线百科知识库的特定句子下词语语义消歧的方法。
如上图所示:
首先,根据给定的待链接实体通过网络请求,获取百科中所记录的多个义项;
其次,获取每个义项对应的页面关键词以及描述信息构造目标上下文,接着,利用词向量相加求平均的方式对上下文进行向量化表示;
最后对词语上下文与义项语义表示相似度计算,并按照得分从大到小排序得到的份最高的实体,完成链接。
2、实现过程
1)收集消歧或者链接词语的多个义项,使用百度百科查询的接口进行解析,返回多个义项的列表。
def collect_mutilsens(self, word):
url = "http://baike.baidu.com/item/%s?force=1" % parse.quote(word)
html = self.get_html(url)
selector = etree.HTML(html)
sens = [''.join(i.split(':')[1:]) for i in selector.xpath('//li[@class="list-dot list-dot-paddingleft"]/div/a/text()')]
sens_link = ['http://baike.baidu.com' + i for i in selector.xpath('//li[@class="list-dot list-dot-paddingleft"]/div/a/@href')]
sens_dict = {sens[i]:sens_link[i] for i in range(len(sens))}
return sens_dict
2)根据列表中的实体义项,获取每个义项对应的描述信息,作为该个义项的意义描述。
(1)获取描述信息
def extract_desc(self, link):
html = self.get_html(link)
selector = etree.HTML(html)
keywords = selector.xpath('//meta[@name="keywords"]/@content')
desc = selector.xpath('//meta[@name="description"]/@content')
return desc, keywords
(2)获取义项上下文
def collect_concepts(self, wd):
sens_dict = self.collect_mutilsens(wd)
for concept, links in sens_dict.items():
link = links[0]
desc, keywords = self.extract_desc(link)
context = ''.join(desc + [' '] + keywords)
concepts_dict[concept] = context
return concepts_dict
3)对实体义项的描述信息进行关键词提取,作为整个义项的一个语义特征表示。
def extract_keywords(self, sent):
keywords = [i for i in anse.extract_tags(sent, topK=20, withWeight=False)]
return keywords
4)调用预训练词向量文件,对实体义项上下文以及消歧或者链接词语的上下文进行向量化表示。
(1)加载词向量
def load_embedding(self, embedding_path):
embedding_dict = {}
for line in open(embedding_path):
line = line.strip().split(' ')
wd = line[0]
vector = np.array([float(i) for i in line[1:]])
embedding_dict[wd] = vector
return embedding_dict
(2)获取单个词的词向量
def get_wordvector(self, word):
return np.array(self.embdding_dict.get(word, [0]*self.embedding_size))
(3)基于wordvector,通过lookup table的方式找到句子的wordvector的表示
def rep_sentencevector(self, sentence):
word_list = self.extract_keywords(sentence)
unknown_embedding = np.zeros(self.embedding_size)
embedding = np.zeros(self.embedding_size)
for wd in word_list:
embedding += self.embdding_dict.get(wd, unknown_embedding)
return embedding/len(sent_len)
(4)利用cosine余弦相似度计算两个上下文的语义相似度,作为链接得分
def similarity_cosine(self, vector1, vector2):
cos1 = np.sum(vector1*vector2)
cos21 = np.sqrt(sum(vector1**2))
cos22 = np.sqrt(sum(vector2**2))
similarity = cos1/float(cos21*cos22)
if str(similarity) == 'nan':
return 0.0
else:
return similarity
(5)对链接的得分按照从大到小排序,返回最终实体链接结果
def detect_main(self, sent, word):
sent = sent.replace(word, '')
concept_dict = self.collect_concepts(word)
sent_vector = self.rep_sentencevector(sent)
concept_scores_sent = {}
for concept, desc in concept_dict.items():
concept_vector = self.rep_sentencevector(desc)
similarity_sent = self.similarity_cosine(sent_vector, concept_vector)
concept_scores_sent[concept] = similarity_sent
concept_scores_sent = sorted(concept_scores_sent.items(), key=lambda asd:asd[1],reverse=True)
return concept_scores_sent[:3]
3、实体链接效果
我们以“苹果”作为待链接实体,并给出相应的上下文进行测试,可以得到如下结果。
1)上下文:苹果发布新产品了。待链接实体:苹果
结果:
[('公司', 0.4309597564421702), ('物品', 0.39608141793731144), ('歌曲', 0.37937766923800026)]
2)上下文:最近连降大雨,种苹果的果农损失惨重。待链接实体:苹果
结果:
[ ('果树', 0.23943442305363207), ('角色', 0.22535153116801097), ('歌曲', 0.21173595044037458)]
总结
本文从领域实体链接关键技术出发,对实体链接任务的定义、候选实体提及的生成、候选实体块的匹配、候选实体的消歧等缓解进行介绍,并给出了一个基于在线百科知识库的实体链接实现项目。
实体链接是当前实体应用的重要技术手段,我们需要从算法和工程两侧多加以关注。
关于该项目的实现源码,可访问:
https://github.com/liuhuanyong/WordMultiSenseDisambiguation
参考文献
1、https://blog.csdn.net/TgqDT3gGaMdkHasLZv/article/details/79244840
2、https://github.com/liuhuanyong/WordMultiSenseDisambiguation
3、http://shuyantech.com/api/entitylinking/
关于我们
老刘,刘焕勇,NLP开源爱好者与践行者,主页:https://liuhuanyong.github.io。
就职于360人工智能研究院、曾就职于中国科学院软件研究所。
老刘说NLP,将定期发布语言资源、工程实践、技术总结等内容,欢迎关注,也可加入老刘说NLP技术会员群,更深入交流。