项目链接
为了实现知识图谱API的高效查询,自己也集成了一些常用API的多线程查询接口,其中包括WikiMedia API、DBpedia Lookup、SPARQL语言查询、Bing搜索引擎、Ask搜索引擎,欢迎大家提出宝贵意见,项目链接如下:
A-BigTree/searchmanage_Wiki
前言
- 维基百科是☞多种语言、内容自由个网络百科全书项目。而维基数据是一个自由的协作式的多语言辅助数据库,用于收集结构化的数据,旨在支援维基百科、维基共享资源以及其他维基媒体运动中的项目。
- 维基数据可以通过多种方式访问:使用内建工具、外部工具或程序接口。
- Wikidata Query和Reasonator是搜索和检查维基数据项的一些流行工具。tools一页有大量有趣的项目可供探索。
- 客户端维基可以使用Lua Scribunto接口访问其页面的数据。您可以使用Wikidata API独立检索所有数据。
- 我们这次利用python调用官方API来实现数据的获取。
官方API使用
- 注意:因为某些原因wiki国内好像访问不稳定,必要请在魔法😀下使用
Wiki官方提供了很多不同功能的接口,具体见其官方文档。
-
url=https://www.wikidata.org/w/api.php -
这里我们使用两个
action,action=wbsearchentities和action=wbgetentities -
action=wbsearchentities:对输入文本进行搜索得到实体id; -
action=wbgetentities:对输入实体id搜索得到该实体的详细信息;
action = wbsearchentities
参数设置
-
action:'wbsearchentities' -
format:'json' -
search: (带查询文本)必须⭐ -
language: (查询语言)必须⭐ -
type: (查询实体类型,默认:'item') -
limit: (结果返回最大数量,默认:7) -
strictlanguage: (是否禁用语言回退)非必须 -
continue: (继续搜索的偏移量,默认:0) -
props: (返回每个实体的这些属性,默认:'url',好像只有url😓)
查询过程
以文本"SEU"为例
import requests
url = "https://www.wikidata.org/w/api.php"
params = {
'action': 'wbsearchentities',
'format': 'json',
'search': "SEU", # 搜索文本
'language': 'en', # 查询语言(英文)
'type': 'item',
'limit': 10 # 返回最大数目
}
# 访问
get = requests.get(url=url, params=params)
# 转为json数据
re_json = get.json()
print(re_json)
json数据解析
该json数据结构较简单,分析如下:
searchinfo:search:"SEU"
search:0..*(结果队列)id(实体id):(目标值)titile(实体id,同id):(目标值)pageid(网页id):(目标值)display:label(实体名称):language(语言):(目标值)value:(目标值)
(description)(实体描述)language(语言):(目标值)value:(目标值)
repository(存储库):(目标值)url(实体链接):(目标值)concepturi(实体概念链接):(目标值)label(实体名称):(目标值)description(实体描述):(目标值)match(该结果的匹配实体出处,即为什么返回该实体):type(查询部分,label? alias(别名)?,description?):(目标值)language:entext:"SEU"
aliases(别名,简称):0..*(列表)- (目标值)
search-continue(返回结果数目):(目标值)success(是否查询成功):1
通过解析我们可以得到一些查询结果的实体id,比如Q3551770,但是我们只能简单知道该实体的名称、描述,如果我们想知道该实体的更多详细信息,比如属性关系等,我们就需要利用下面介绍的action=wbgetentities
action=wbgetentities
参数设置
action:'wbgetentities'format:'json'ids: (带查询实体id,可接受多个用'|'隔开)必须⭐language: (查询语言)非必须
还有更多的参数可以调整设置,不过不是必须的,这里就不再介绍,详情见官方文档
查询过程
以实体id Q3551770为例
import requests
url = "https://www.wikidata.org/w/api.php"
params = {
'ids': 'Q3551770', # 实体id,可多个,比如'Q123|Q456'
'action': 'wbgetentities',
'format': 'json',
'language': 'en',
}
# 访问
get = requests.get(url=url, params=params)
# 转为json数据
re_json = get.json()
print(re_json)
json数据解析
哦哦哦哦哦!重头戏来喽! 通过输出的json格式数据我们发现这个json数据”又臭又长“,看了让人头大。
其实这里的每个实体的数据包含了该实体的全部信息,符合维基百科数据模型,所以想要真正清晰的解析该json数据,就要明白维基百科数据模型层次结构。下面才开始今天真正是主题。
前方高能!
维基百科数据模型(Wikidata datamodel)
- 维基百科数据模型介绍页Help:Wikidata datamodel - Wikidata
- 使用官方API(action=wbgetentities)查询wikidata返回实体json文件时,json数据的基本结构(对应键值)
ch1.基本数据模型(Datamodel)
entities:Qxx:id:Qxxtitile:Qxxtype:itempageid:(目标值)lastrevid:(目标值)label: ---> ch 2(aliases): ---> ch 3(descriptions): ---> ch 4(claims): ---> ch 5(sitelinks): ---> ch 6
Qxxx:- ........
success:1
---> ch2.label(实体名称)
(xx为语言标记,之后不再赘述) 具体见 https://www.wikidata.org/w/api.php?action=help&modules=wbgetentities的Parameters中 language介绍。
labels:xx:language:xxvalue:(目标值)
---> ch3.aliases(别名)
aliases:xx0..(列表)language:xxvalue:(目标值)
---> ch4.descriptions(描述)
descriptions:xxlanguage:xxvalue:(目标值)
---> ch5.claims(属性)⭐
(Pxx为属性编号)
claims:Pxx:0..*(列表)mainsnaksnaktype:valueproperty:Pxxhash:(目标值)datatype: --> ch 5.1datavalue: --> ch 5.2
type:statement(qualifiers-order): --> ch 5.3(qualifiers): --> ch 5.4(references): --> ch 5.5
--> ch5.1 datatype(数据类型)
- wikidata目前确定的数据类型共17种,每种数据类型对应一种值类型(valuetype)(List of all data types available - Wikidata,Help:数据类型 - Wikidata),列表如下:
| Datetype | json键值 | Valuetype |
|---|---|---|
| Commons media (参考维基共享资源上的文件,图片等) | commonsMedia | string |
| Globe coordinate (地理位置,经纬度) | globe-coordinate | globecoordinate |
| Item (内部链接到另一个项) | wikibase-item | wikibase-entityid |
| Property (指向属性的内部链接) | wikibase-property | wikibase-entityid |
| String (不需要翻译成不同语言或数字格式的字符链,数字和符号) | string | string |
| Monolingual text (未翻译为其他语言的字符串,当地语言编写的位置实体名称,某种标识符,化学式或拉丁学名) | monolingualtext | monolingualtext |
| External identifier (表示外部系统中使用的标识符的字符串) | external-id | string |
| Quantity (代表一个十进制数字,以及有关该数字的不确定性区间的信息,以及一个测量单位) | quantity | quantity |
| Time (以格里高利或朱利安日历存储日期) | time | time |
| URL (用于标识某种外部资源,可能是某种外部网站的链接) | url | string |
| Mathematical expression (显示为数学公式的格式化字符串) | math | string |
| Geographic shape (参考维基共享资源上的地图数据文件命名空间) | geo-shape | string |
| Musical Notation (描述遵循 LilyPond 语法的音乐的字符串) | musical-notation | string |
| Tabular data (参考维基共享资源上的表格数据文件命名字符串) | tabular-data | string |
| Lexeme (对于引用另一个 Lexeme 的 Lexemes 的陈述) | wikibase-lexeme | wikibase-entityid |
| Form (对于 Lexemes 上的陈述,这些陈述引用了其他 Lexeme 上的 Forms 以表明它们的关系) | wikibase-form | wikibase-entityid |
| Sense (对于在其他 Lexemes 上引用 Senses 的 Lexemes 的陈述) | wikibase-sense | wikibase-entityid |
--> ch5.2 valuetype(值类型)
- 确定datatype(数据类型)后,可以知道valuetype(值类型),从而确定
value的结构层次; - 由ch5.1可知,17种datatype(数据类型)对应共6种valuetype(值类型);
wikibase-entityid(维基数据实体id值)
datavalue:type:wikibase-entityidvalue:entity-type(实体类型):itemnumeric-id(实体id):(目标值)(id)(类型+id,如Q5,P31):(目标值)
globecoordinate(地理位置)
datavalue:type:globecoordinatevalue:latitude(纬度):(目标值)longitude(经度):(目标值)precision(精度):(目标值)globe(观测星球实体链接):(目标值)
time(时间)
datavalue:type:timevalue:time(时间):(目标值)precision(精度):(目标值)before(给定时间后可能有多少个单位的显式整数值):(目标值)after(给定时间前可能有多少个单位的显式整数值):(目标值)timezone(时区信息作为与 UTC 的偏移量(以分钟为单位)):(目标值)calendarmodel(作为 URI 给出的显式值):(目标值)
string(字符串)
-
datavalue:-
type:string -
value:(目标值)
-
monolingualtext(未翻译文本)
datavalue:type:monolingualtextvalue:text(文本信息):(目标值)language(语言):(目标值)
quantity(十进制数字)
datavalue:type:quantityvalue:amount(主值):(目标值)lowerBound(下界误差):(目标值)upperBound(上界误差):(目标值)unit(默认为“1”的字符串的隐含部分):"1"
--> ch 5.3 qualifiers-order(限定词顺序)
qualifiers-order:0..*(列表)Pxx- ......
--> ch 5.4 qualifiers(限定词)
qualifiers:Pxx:0..*(列表)snaktype:valueproperty:Pxxhash:(目标值)datatype: --> ch 5.1datavalue: --> ch 5.2
--> ch 5.5 references(引用)
references:0..*(列表)hash:(目标值)snaks-order:0..*(列表)Pxx- .......
snaks:Pxx:0..*(列表)snaktype:valueproperty:Pxxhash:(目标值)datatype: --> ch 5.1datavalue: --> ch 5.2
---> ch6.sitelinks(外部链接)
sitelinks:xxwiki:site:xxwiki(badges):0..*(列表)id(目标值)
title:(目标值)
xxwikivoyage:site:xxwikivoyage(badges):0..*(列表)id(目标值)
title:(目标值)
commonswiki:site:commonswiki(badges):0..*(列表)id(目标值)
title:(目标值)
Example
{
"entities": {
"Q3551770": {
"pageid": 3380864,
"ns": 0,
"title": "Q3551770",
"lastrevid": 1653372026,
"modified": "2022-06-03T07:33:09Z",
"type": "item",
"id": "Q3551770",
"labels": {
"en": {
"language": "en",
"value": "Southeast University"
}
},
"descriptions": {
"en": {
"language": "en",
"value": "university in Nanjing, China"
}
},
"aliases": {
"en": [
{
"language": "en",
"value": "SEU"
}
]
},
"claims": {
....
},
"sitelinks":{
...
},
"success": 1
}
部分claims
"claims":
{
"P159": [
{
"mainsnak": {
"snaktype": "value",
"property": "P159",
"hash": "5491d0bd1b2b30b9e4747254d508f277795a3c7f",
"datavalue": {
"value": {
"entity-type": "item",
"numeric-id": 16666,
"id": "Q16666"
},
"type": "wikibase-entityid"
},
"datatype": "wikibase-item"
},
"type": "statement",
"qualifiers": {
"P625": [
{
"snaktype": "value",
"property": "P625",
"hash": "2d91cc4e510689c095172344a17b0a0bee41fa4b",
"datavalue": {
"value": {
"latitude": 32.057777777778,
"longitude": 118.78888888889,
"altitude": null,
"precision": 0.0001,
"globe": "http://www.wikidata.org/entity/Q2"
},
"type": "globecoordinate"
},
"datatype": "globe-coordinate"
}
]
},
"qualifiers-order": [
"P625"
],
"id": "Q3551770$b269c8db-4c49-d2c9-628e-393a5c0d9b65",
"rank": "normal"
}
],
"P856": [
{
"mainsnak": {
"snaktype": "value",
"property": "P856",
"hash": "0d857dd8262d0b6729ea3b911c534d0075fbb77d",
"datavalue": {
"value": "http://www.seu.edu.cn/",
"type": "string"
},
"datatype": "url"
},
"type": "statement",
"id": "Q3551770$8ed363d2-400b-f684-a881-bd02902fe19d",
"rank": "normal"
}
],
"P910": [
{
"mainsnak": {
"snaktype": "value",
"property": "P910",
"hash": "1f3b85ac00b0aa7408defdb9e93dbf9278752b73",
"datavalue": {
"value": {
"entity-type": "item",
"numeric-id": 8781146,
"id": "Q8781146"
},
"type": "wikibase-entityid"
},
"datatype": "wikibase-item"
},
"type": "statement",
"id": "Q3551770$6C7F1667-F717-4374-A48D-4A0838D77B41",
"rank": "normal"
}
]
}
sitelinks
"sitelinks":
{
"cswiki": {
"site": "cswiki",
"title": "Jihov\u00fdchodn\u00ed univerzita",
"badges": []
},
"dewiki": {
"site": "dewiki",
"title": "Universit\u00e4t S\u00fcdostchinas",
"badges": []
},
"enwiki": {
"site": "enwiki",
"title": "Southeast University",
"badges": []
},
"frwiki": {
"site": "frwiki",
"title": "Universit\u00e9 du Sud-Est",
"badges": []
},
"ganwiki": {
"site": "ganwiki",
"title": "\u4e1c\u5357\u5927\u5b66",
"badges": []
},
"idwiki": {
"site": "idwiki",
"title": "Universitas Tenggara",
"badges": []
}
}
综上,我们已经清楚了维基百科数据模型的解析的方法啦,可以愉快获得我们想要的数据啦! 😊 如果看完觉得博主写的不错,请给博主点赞关注收藏鼓励一下哦🤭