百度知识图谱大赛
人物关系网的搭建和展示——FolkNet系统介绍
##1 系统实现功能 用户在搜索真实/小说/影视作品中的人物时,向用户推荐与其搜索的人物具有一定关联的人物,这里的关联是指与该人物具有一定的社会关系或实际联系的人物。并绘制“人物关系图”,帮助用户更全面的了解其搜索人物的背景及关系网络。
##2 系统简介 传统的人物关系标定是由人工干预辅助机器学习和专家系统协同实现的,而我们系统的核心是基于众包实现的人物关系标定。首先根据我们的推荐算法挖掘用户检索人物的相关人物,并将这一人物组进行分类,划分人物领域,并推送到贴吧和知道团队由人工进行标定。最后根据用户之间的不同关系对人物关系网络的边采取不同颜色,并可由用户自行筛选感兴趣的关系绘制关系图谱。主要的工作流程有:
- 挖掘相关人物:收集相关性强的人物对
- 人工关系标定:收集用户对关系的描述
- 关系可视化:对关系图谱的定制与可视化处理
我们系统的特点是:
- 使用众包的方式收集数据:
- 相关人物贴吧、知道团队中的活跃数据作为数据的志愿提供者(可以推广到贴吧内所有成员以及知道活跃的高采纳的回答者)
- 更有效、更直观的展现方式:
- 关系关键词分析,关系好坏一眼看出
- 能体现人物之间隐含的关系:
- 相比于传统的语义理解,由人工理解并标定的关系更准确
- 往往能挖掘隐含的关系
- 有利于训练深度的语义理解网络:
- 可以生成海量的人物标定数据集,用于后续训练深度网络
##3 算法介绍 确定人物之间的关系涉及到数据挖掘、自然语言处理、语义理解等多个领域,具有一定的难度;我们设计的方法则另辟蹊径,通过潜在的高质量用户来确定不同人物之间的关系。首先我们挖掘目标人物的百科词条,直接使用对于百科中格式较好的,有明确定义的各项属性来寻找相关人物之间的关系;另一方面,对于与目标人物具有较高相关度而具体关系尚未明确的,用众包的方法收集关系。因此我们确定人物关系的算法涉及到两个部分,一是对与目标人物有明确关系的人物的挖掘,二是确定目标人物与关系尚明确的高相关人物的关系。 ###3.1 FolkRe算法——查找相关人物 人物之间的关联这种关系比较复杂,因此需要通过多方面的数据来挖掘这种关联性。我们认为以下两个方面可以体现人物i,j之间的关联:
-
**相似性:**在短时间内,搜索人物i的用户中有多少比例的用户也搜索了用户j;比例越大,代表人物i,j之间越有关联
-
**相关性:**人物i,j同时出现在同一张页面上的频率;频率越高,代表人物i,j之间越有关联
设C为人物i,j的关联性,则有以下公式:
C = αC1 + βC2
其中C1、C2为不同情况下的关联值,α、β为归一化因子。 C1为搜索人物i的用户中也搜索了用户j的比例;C2为包含i,j的网页中,i、j出现在同一页面的频率。
FolkRe算法主要负责针对某一特定人物,结合以上三个方面寻找与其高关联性的人物,并返回固定的数据格式:
人物i, 人物j, 关联值
###3.2 FolkLabel算法——确定“关系标签”
算法简介
通过FolkRe可以确定与人物i具有最高的关联性的N个人物(简称为TopN人物,下文亦如此),但有时具有比较强的关联不一定代表二者会有具体的社会关系等,相对应的,具有比较紧密关系的人也许并不会有太强的关联性,比如搜索“谢霆锋”时,其父“谢贤”并不一定会出现在我们推荐的相关联人物中,结果往往是和谢霆锋具有更多新闻的其他公众人物。二者具有直接的社会关系,我们称这样的关系为“直接关系”;另外,也许两个人物的关联性并不是特别强,但却存在具体的关系,比如两个比较热门但关联性不高的人祖籍、生日、学校等可能一致。二者通过一定的属性连接起来,我们称这样确定的关系为“间接关系”。
除“直接关系”和“间接关系”外,人物之间还有很多关系百度百科和其他人物资料库并未全面涵括,从网上大量的文本中获取关系信息又难度较大,因此我们采用了一定的人工干预进行确定。我们主要利用百度的用户,以添加“关系标签”的形式来对人物关系进行确定。
FolkLabel算法主要完成关系人物挖掘和确定关系标签这两个功能。其中,关系人物挖掘函数用于在现有的百科数据库中寻找与用户有明确定义格式的直接联系或间接联系的用户(简称为TopC人物,下文亦如此);而标定关系标签函数则借助海量百度用户的力量,通过人工手段对人物i与TopN人物之间进行关系标签的标定。
算法流程
FolkLabel算法主要分为三部分:
- 第一部分是挖掘过程,根据现有的百科词条中的词条属性,直接寻找人物i与其相关人物之间的关系;
- 第二部分是推送过程,推送过程分为分类过程与推荐过程,根据人物i以及其相关人物所属的领域,将其分类,并推送到相关的贴吧和知道用户,由贴吧和知道的高质量用户人工确定关系标签;另一方面,根据用户搜索的历史,将人物i和其相关人物推荐给用户,由高质量的个体用户人工确定关系标签。
- 第三部分是关系标签收集过程,起初收集高质量用户对人物关系的描述,并从用户描述中提取标签。
对于挖掘过程来说,所有的数据都可以在百度百科中检索。以标准的人物百科名片为例,我们感兴趣的只有几个属性,如 出生日期
,出生地
,家乡
,毕业院校
,配偶
,妻子
,丈夫
,儿子
,父亲
,母亲
,好友
设所有我们感兴趣的这些属性集合设为注:还需要从百度百科获取更多的这种属性数据
Atr
;而属性集Atr
根据是否直接提供有关系的人,还能够分为直接属性集AtrD
(如:配偶
,儿子
,父亲
,母亲
,好友
等)和间接属性集AtrA
(如出生日期
,出生地
等)。首先我们查找人物i的AtrD属性集,查看与其有具体关系的人物并返回,如果没有AtrD属性则返回空值;接下来我们查找人物的AtrA属性,在TopN人物中和百度热搜榜单“人物”榜单中查找与人物i具有相同AtrA属性的人,并返回满足条件的全部TopN人物和热搜榜单中排名最高的用户。
对于推送过程,首要问题是确定该将人物关系推送给谁,也就是确定兴趣人群。一般来讲,对人物i所在相关领域比较有了解或很有兴趣的人群会有足够的热情和知识解决关系的标定,这类人群一般集中在贴吧和知道两个社区,尤其是高质量的用户标定的结果一般来说会更可靠。我们将人物i与TopN人物根据所在的领域和话题分类,比如出自某篇小说、某部电影、学科、国家等,并将这些人物推送到相应的贴吧、知道,由贴吧和知道的高质量用户人工标定“关系标签”。之所以选择贴吧和知道这两个区域的用户,是因为这两个来源是和目标人物信息的集聚地,这两个集聚地都有许多了解相关领域的高质量用户。贴吧的高质量用户,一般是贴吧中等级比较高的用户,对相关领域有一定的了解,知道的高质量用户则是百度知道中相关领域等级和回答采纳率较高的达人。二者标定好人物i和TopN相关人物的“关系标签”后,前者由贴吧大小吧主审核,而后者则由知道的相关领域管理员团队审核。
此外,对于推荐过程,还需分析用户的搜索记录数据。
下面着重介绍一下各个部分的细节。
挖掘过程
-
百度百科中的关系人物挖掘
首先挖掘人物i的百科词条
- 如果词条中有在
Atr
集合中的属性(即有直接属性),先判断其是直接还是间接属性。- 如果是
AtrD
属性,则将人物i与其对应人物以及AtrD
属性值以一定格式返回给KV_TopC; - 如果是
AtrA
属性,在TopN人物中和百度热搜榜单“人物”榜单中查找与人物i具有相同AtrA属性的人,返回满足条件的全部TopN人物和热搜榜单中排名最高的用户,同时将AtrA
属性值对应的关系或空集(查询失败)返回KV_TopC。
- 如果是
- 如果词条中没有在
Atr
集合中的属性,则返回空集给KV_TopC。
- 如果词条中有在
分类过程
-
标定关系标签
人工的标签标定方式主要有以下两个方法:
-
**挖掘现有词条:**查询人物i与TopN的百度百科名片,寻找具有相同值的属性,通过比较简单的语义理解判断有关联的人物之间的关系。
-
**人工标定:**将人物i与TopN人物,以及人物关系标签,一并推送给对应的人物/小说/电影的贴吧,由贴吧中海量熟知人物关系的网友以固定的数据格式进行人物之间关系的标定。同时贴吧用户也可以反馈和人物i具有关联的其他人物并同时添加标签。
-
结合以上二者,用于确定人物i与TopN人物关系标签的算法即为FolkLabel算法。FolkLabel算法主要负责标签标签数据的搜集、汇总和整理。在确定好人物i、TopN人物以及关系标签后,组织为固定的数据格式:
人物一, 人物二, 关系
,即 i, TopN(i,j), Re(i,j)
##4 需要数据
- 用户搜索记录的历史数据
- 一些小说/电影/新闻文本
- 人物的词条
- 一些关系标签
##5 项目实现: 难点:冷启动,建立关系数据库,用户查询-响应机制,关系标签组织,贴吧标定标签形式 ###5.1 启动流程: 应该分为社会人、虚拟人(影视/小说)两种人物关系网络
社会人:
- 冷启动时的人物,主要是目前的百度热搜榜单“人物”榜单上每个领域Top50热门的人物
- 针对每个人物用FolkRe寻找关联人物TopN,并利用FolkLabel算法确定人物i及不同组合的关系标签,至此,第一层关系网络可以确定
- 对出现在网络里的TopN人物,进行迭代,可以确定多层关系网络,如果TopN中出现了未收录在百度百科中的人物时,则将其从下次进行迭代的TopN人物中剔除
- 最后,社会人物关系网络会形成以少数热门知名人物为巨型节点的无尺度网络。
虚拟人:
- 冷启动时的人物,主要是目前的百度热搜榜单娱乐榜中的电影、电视剧、动漫以及小说榜上每个领域Top50热门影视剧、小说中的主要角色。
- 针对每个人物用FolkRe寻找关联人物TopN,并利用FolkLabel算法确定人物i及不同组合的关系标签,至此,第一层关系网络可以确定
- 对出现在网络里的TopN人物,进行迭代,可以确定多层关系网络,如果TopN中出现了未收录在百度百科中的人物时,则将其从下次进行迭代的TopN人物中剔除
- 最后,虚拟人物关系网络会形成以少数热门知名人物为巨型节点的无尺度网络。
数据库的维护和更新如下:
- 我们将相关性 C 值达到一定数量的(或者TopN)的关系记录下来,写入数据库“关系表”。
- 当相关贴吧的活跃成员请求页面时,推送人物对到页面
- 活跃成员如果填写了关系描述并提交,则写入“关系描述记录表”
- 对大量的“关系描述记录表”中的记录进行分析,抽取关键词,更新“关系表”中的关系描述
###5.3 关系标签 一开始的话我们应该让用户自己写描述,然后收集到的描述多了之后再尝试自动从中抽取出标签,再然后就可以让用户选择标签。
众包的方法一开始没有数据的时候先由用户进行描述,当然可以给他建议说最好用什么样的方法、格式进行描述。然后在数据多起来之后尝试对描述进行处理,抽取标签,然后可以让用户在描述关系时可以直接选择标签。 ###5.4 关系网络的绘制 绘制对应的人物关系网络图,人物关系网络图和原有的“知心推荐”的列表的人物并不一定是一致的,关系网络图更着重体现与用户所检索的人物有实际联系、关系的人物。因此要分开显示于原右侧推荐栏上方,以缩略图形式展现数据。用户点击缩略图后可以进入单独的关系网络页面,显示更为立体全面的关系网络。
绘制关系网络,需要知道关系网络中TopN人物与人物i的关联性,以及二者之间的关系。其中,TopN人物与人物i关联性越高,其所在的节点也就越大;而两个节点对应的边是无权的,边上显示二者的关系。因此,最后绘制关系网络时需要两组数据:
-
每个TopN人物节点的大小:
人物i, 关联值
-
每个TopN人物节点的大小:
人物一, 人物二, 关系
以百度Echarts绘制乔布斯的人物关系网络为例,数据的组织格式为(部分):
nodes:[ {category:0, name: '乔布斯', value : 10}, {category:1, name: '丽萨-乔布斯',value : 2}, {category:1, name: '保罗-乔布斯',value : 3}, {category:1, name: '克拉拉-乔布斯',value : 3} ], links : [ {source : '丽萨-乔布斯', target : '乔布斯', weight : 1, name: '女儿'}, {source : '保罗-乔布斯', target : '乔布斯', weight : 2, name: '父亲'}, {source : '克拉拉-乔布斯', target : '乔布斯', weight : 1, name: '母亲'}, {source : '劳伦-鲍威尔', target : '乔布斯', weight : 2}, {source : '史蒂夫-沃兹尼艾克', target : '乔布斯', weight : 3, name: '合伙人'} ] }
###5.5 用户界面 标签多了之后我们可以有更多的呈现方法。通过对关键词的分析,确定两个人的关系属于“好”或“坏”或“中间”三类,并分别在连接边上用不同的颜色表示出来,这样的网络就更加直观。用户可以进一步对知识图谱进行定制、编辑,比如只显示亲属、只显示好的关系等。
###6 关于我们