构建知识图谱一般有以下两种方式:
- 自顶向下(Top-Down):即首先为知识图谱定义数据模式,数据模式从最顶层概念构建,逐步向下细化,形成结构良好的分类层次,然后再将实体添加进概念
- 自底向上(Bottom-Up):即首先对实体进行归纳组织,形成底层概念,然后逐步往上抽象,形成上层概念。该方法可基于行业现有标准转换生成数据模式,也可基于高质量行业数据源映射生成
自底向上的方式适合构建通用领域知识图谱,以及数据、业务非常之复杂的某些行业领域知识图谱;而自顶向下的方式适合构建垂直行业领域知识图谱
1. 一些概念
根据自顶向下的概念,首先需要定义数据模式(schema)。一个知识图谱的 schema 就是相当于一个领域内的数据模型,包含了这个领域里面有意义的概念类型以及这些类型的属性。任何一个领域的 schema 主要由类型(type)和属性(property)来表达。schema主要是去定义需求,哪些数据对我们的限定领域应用有用,才往上构建。
(1)域(domain)
域的概念是凌驾于所有类型之上,对于域的定义应该尽量的抽象,不应该具体,同时域与域之间应尽量做到相互独立,不交叉。例如,省份就不应该是一个域的概念,在思考是否应该把一个概念当做域时,需要考虑到该概念是否能够继续向上抽象
例如:省份;城市;国家;县等等,他们同属于地理位置域。在明确域的概念时,应该定义好域的边界,这样比较容易区分不同域之间的区域划分。
(2)本体
用于描述事物的本质,是对于特定领域真实存在的实体的类型、属性,以及它们之间的相互关系的一种定义。本体层是基于特定领域的概念的定义,包括概念的属性,概念之间的关系,一般概念之间的关系是一种父子关系,也有叫做上下位的关系。事实层是具体的真实存在的实体,包括实体的属性以及实体之间的关系,每个实体都会映射到本体层相应的概念。
(3)实体
它是客观世界的事物,是构成知识图谱的基本单位(这里实体指个体或者实例)。实体分为限定类别的实体
(如常用的人名、地名、组织机构等)以及开放类别实体
(如药物名称、疾病等名称)。实体识别是识别文本中指定类别的实体。
(4)关系
指两个或多个实体之间的某种联系,知识图谱通过关系将无数分散的实体节点联系起来,并且描述了这些实体之间的语义关系,它是语义搜索的基石
2. 定义电影数据集数据模型
2.1 数据介绍
数据来源于openKG上开源的一份从豆瓣上爬取的电影数据,总共 4587 条,每条数据表示一部电影,格式如下所示:
{
"id": 25746375,
"title": "我是路人甲",
"url": "http://movie.douban.com/subject/25746375/",
"cover": "http://img3.douban.com/view/movie_poster_cover/lpst/public/p2252471054.jpg",
"rate": 7.4,
"director": ["尔冬升"],
"composer": ["尔冬升"],
"actor": ["万国鹏", "王婷", "沈凯", "徐小琴", "林晨", "魏星", "蒿怡帆", "蒿怡菲", "覃培军", "王昭", "张文斌", "林俭", " 耿立树", "张喜来", "周鹏", "寇骏", "姜涛", "袁咏仪", "方中信", "刘伟强", "冯德伦", "吴彦祖", "尔冬升", "麦兆辉", "庄文强", "方平", "张静初", "许鞍华", "林更新", "蒋梦婕", "陆剑明"],
"category": ["剧情", "喜剧"],
"district": ["China_中国大陆"],
"language": ["汉语普通话", "粤语", "浙江方言"],
"showtime": 2015.0,
"length": 134.0,
"othername": ["I Am Somebody"]
}
每一部电影都有14个键值对,包括电影id、电影名称、电影在豆瓣上的地址、电影封面图片地址、豆瓣评分、导演(列表形式,可能有多个)、编剧(列表形式,可能有多个)、参演者(列表形式,可能有多个)、电影类型(列表形式,可能有多个)、上映地区(列表形式,可能有多个)、电影语言(列表形式,可能有多个)、上映时间、电影时长、电影别名(列表形式,可能有多个)
2.2 定义数据模型
电影领域 schema 初步定义如下图所示:

将电影名作为实体,将电影类型、时长、语言和别名定义为该类型实体的属性;将地区定义为实体,暂时没有给他定义属性;将人名定义为实体,将性别、出生年月、国籍和职业身份作为它的属性,当然在已有的数据里,只能提取职业身份属性,其他属性后期可以去百度百科上爬取人物信息作为图谱知识库的补充。在关系的定义上,根据三个实体类型,两两之间可以定义出这些关系:执导、出演、上映于;用三元组表示为<人,执导,电影>
,<人,参演,电影>
,<人,编剧,电影>
,<电影,上映于,地域>
。考虑到演员参演电影有领衔主演和主演之分,还可以将“参演”这一关系细分为“领衔主演”、“主演”以及“客串”之分,但是显然数据不支持这么细分,默认将参演者名单的前两个认为是领衔主演,而将其他的认为是主演