Wikidata的JSON版本数据结构以及一些相关的信息记录。
下载
Wikidata官方版本下载地址。
基本每隔几天都会更新一次,里面有几种格式的数据,包括JSON dump (.json文件),RDF dump (使用Turtle和NTriples格式的.nt和.ttl文件),XML dump (在另一个地址里)。
另外wikidata从2018年开始增加了一种namespace为lexeme的item,官方解释为:
In linguistics, a lexeme is a unit of lexical meaning. Similarly, Wikidata's lexemes are items with a structure that makes them more suitable to store lexicographical data. Besides storing the language to which the lexeme refers, they have a section for forms and a section for senses.
意思似乎跟中文中的义原 (sememe) 比较像,这些新的数据也以三种格式保存在前面的地址。
目前 (2022.01.26) 最新版的wikidata JSON版本的压缩包已经到达接近70G,解压之后有几百G,而且是存在一个文件里的,比较难以处理。如果想用较少数据熟悉一下wikidata可以下载以前的版本)。只是下载速度会比较慢。
JSON文件结构
wikidata的JSON文件结构具体说明见这里。
上层结构
Wikidata里主要保存两类entity,分别是item和property,其中item用于记录各类实体,property用于表述实体的属性,二者的区别首先由属性type
决定,其次property没有sitelinks,但多了datatype。
item上层结构如:
|
|
property上层结构如:
各项内容说明如下:
- id:表示该实体的唯一性ID,其中item以Q开头,property以P开头;
- type:表示该实体为item或property;
- datatype:property实体适用的数据类型;
- labels:不同语言中的label (即不同语言中对这个entity的表述方式);
- descriptions:不同语言中对这个entity的描述;
- aliases:不同语言中对这个词的其他表述方式 (或者理解为同义词);
- claims:关于该实体的statement (若干,每个由一个property作为key,可以理解为该实体的一条属性);
- sitelinks:多个包括该实体 (item) 的网页链接。
Labels, Descriptions and Aliases
下面给出一个具体的labels、descriptions和aliases的例子:
|
|
其中每个元素都由一个language属性和实际的value组成,其中aliases以语言作为key,每个语言下对应的是一个该语言的同义词的list (表中每个元素仍然符合上述规则)。
Statements
下面给出一个statements的例子:
|
|
其结构是一个以property id为key的map,每个statement (或称为claim) 表示当前实体的一个属性 (property),其中包括的信息如下:
- id:用于表示该statement的全局单一的随机ID;
- type:只能填statement (历史版本中也可能填claim);
- mainsnak:用于表示与当前property相关的value的Snak,注意其中包括的property要与作为key的property一致;
- rank:表示该值是否会在query中显示 (preferred, normal or deprecated);
- qualifiers:对主要value的补充描述 (例如测量时间等);
- references:记录mainsnak中数据的来源。
注意:在历史版本的wikidata中,statement和claim有所区别,前者有reference而后者没有。但新版中二者不做区分。
Snak
下面给出一个statements中的mainsnak的例子:
|
|
其中包括信息有:
- snaktype:value, somevalue or novalue,其中value表示具体的值,另外两个则表示当前snak有某个未知值或者没有值;
- property:相关property的id;
- datatype:数据的类别,所有类别定义,来自property的datatype;
- datavalue:只有当snaktype为value时有这一项,表示property具体的值。
Data Values
下面给出data value的例子:
|
|
其中包括两个主要属性:
- type:描述值的数据类型,该类型只用于处理文本。例如一个link的data type可能是
url
,但value中的type应该是string
; - value:具体的值,可能是数字,字符串或更复杂的结构。
接下来具体介绍几种value的类别。
string
|
|
string
类型的value只包括简单的字符串常量。
wikibase-entityid
|
|
wikibase-entityid
类型的value包括:
- entity-type:目标entity的类别 (item or property);
- id:目标entity的唯一ID;
- numeric-id:ID的数字部分。(注意:并不是所有的entity都有数字ID,因此建议使用id)
globecoordinate
|
|
globecoordinate
(全球坐标) 类型的value包括:
- latitude:纬度;
- longitude:经度;
- precision:准确率;
- globe:对应地点的URI (例如Q2 = earth);
- altitude:DEPRECATED。
quantity
|
|
quantity
类型的value包括:
- amount:具体值,开头正负号表示值的正负性;
- upperBound/lowerBound:上下界,必须同时出现,如果未给出说明该值的不确定性未知;
- unit:单位的URI。(例如这里的Q712226 = square kilometer,如果没有单位则为”1”)
time
|
|
time
类型的value包括:
- time:具体时间;
- timezone:时区;
- calendarmodel:日历模型的URI,例如gregorian or julian;
- precision:To what unit is the given date/time significant,用数字代号表示;
- before/after:目前未使用。
其他
其他没有涉及到的还有Qualifiers,References和Sitelinks,其基本信息已经在开头介绍了,具体信息见英文说明。
利用方法
三元组
总的来说,如果只希望抽取三元组的话,应该关注item
类别的entity,然后从其claims里面逐个判断每个property,property的Snak的datavalue的type是wikibase-entityid
的表示这一个property描述的是当前item和另一个item之间的关系。抽取这类item-property-item信息作为三元组 (后面需要根据item/property的label属性将其转化为不同语言中的表示)。
qwikidata
qwikidata是一个用于读取wikidata数据的Python library。安装方法如下:
使用API
下面是一个qwikidata使用API获取信息的例子:
读取本地JSON文件
下面是一个读取本地Wikidata JSON文件的例子 (例子中实现的是搜索职业为政客的人):
|
|
Wikipedia
wikipedia是一个用于获取Wikipedia信息的Python library。
安装方法如下:
下面是一个使用wikipedia获取相应title的信息的例子,其中summary对应的应该就是整个data.content里的第一段 (一般是对这个title的总结性描述),可以通过参数sentences
控制显示summary的前几句。另外在查询其他语言的title之前需要先用set_lang
转换语言,支持的所有语言数量可以用wikipedia.languages()
查询。
|
|
下面是上述例子的输出:
|
|
另外需要注意的是如果输入的title有歧义 (即可能对应多个wikipedia页面) 或者不存在,上述的命令都会报错。
结合Wikidata使用
Wikidata的labels下面每个元素是一个language
和value
组成的结构,其中value
对应的应该就是wikipedia里的title,而language
也就是对应的语言。因此对labels里的每个language-value
对直接调用上面例子里的search(value,language)
就可以获取对应的data。
|
|