用Wikidata做實體搜索的兩種方案
Wikidata 是一個可協同編輯的知識庫,是繼2006年的維基學院之後,第一個新的維基媒體基金會項目。這一項目與維基共享資源的工作方式類似,將爲其他維基計劃及各語種維基百科中的信息框、列表及跨語言鏈接等提供統一存放的數據,該項目在2012年10月30日投入使用。
Wikidata 的所有數據都是對外公開的,官網對外提供了兩類數據獲取方式:在線API和數據庫下載。在線API提供了方便的調用接口,數據庫下載可以獲取完整的數據庫備份。
利用Wikidata做實體搜素時,針對這兩類數據獲取方式,相應的有兩種方案:在線方法和離線方法。
1 在線方法
利用Wikidata提供的在線API可以很方便地實現在線實體搜索,過程可以分爲三步:
- 實體id確定
- 實體信息獲取
- 實體信息解析
- 相關實體信息獲取
1.1 實體id確定
這一步利用用戶輸入的查詢關鍵字確定對應的實體id。可以直接調用MediaWiki API,並且可以指定返回的數據格式(json等)。返回的數據裏包含查詢到的實體id。
例如搜索Fudan時,可以直接HTTP GET以下url:
1.2 實體信息獲取
在得到實體的id之後,可以直接利用此id通過MediaWiki API獲取實體的詳細信息,並且可以指定返回格式。例如獲取實體Q495015的詳細信息可以HTTP GET以下url:
https://www.wikidata.org/w/api.php?action=wbgetentities&ids=Q495015&format=json&languages=en
1.3 實體信息解析
得到指定格式的實體信息之後,需要對實體信息進行解析,具體方法可以參考第三章。
1.4 相關實體信息獲取
解析實體信息之後,會得到與此實體相關的其他實體(實體id)以及關係屬性(屬性id),通過相關實體的實體id和屬性id可以進一步得到相關實體信息:相關實體信息可以直接用id查詢,屬性信息可以解析屬性詳情頁。例如屬性P580的詳情頁爲https://www.wikidata.org/wiki/Property:P580。
2 離線方法
在線方法雖然實現起來方便快捷,但是Wikidata並不能保證所有的請求都按時返回,甚至請求可能會被堵塞(參考API:Etiquette)。因此在需要發起大量請求時在線方案不適用。
Wikidata提供了完整的數據庫下載,因此可以下載完整的數據庫,然後搭建自己的實體搜索服務。大致可以分爲3步:
- 數據下載
- 數據導入
- 搭建搜索服務
2.1 數據下載
Wikidata提供多種格式的數據下載,具體可以參考Wikidata:Database download。
2.2 數據導入
將數據導入本地數據庫,如MySQL、MongoDB等。json格式的dump每行爲一個實體,數據導入比較方便,但是數據量非常大(json格式的dump大小爲57G,包含1800萬行),數據導入將非常耗時。
2.3 搭建搜索服務
基於本地服務器搭建搜索服務。搜索時數據的解析可以參考第三章。用關鍵字搜索實體id的接口可以直接調用Mediawiki的在線API,或者自己實現。
3 數據解析
Wikidata存儲的是實體以及實體之間的關係,具體的數據結構可以參考官方文檔Wikibase/DataModel.
3.1 綜述
典型的json格式的數據如下:
Q5816: {
"pageid": 6892,
"ns": 0,
"title": "Q5816",
"lastrevid": 287405642,
"modified": "2015-12-31T09:46:04Z",
"type": "item",
"id": "Q5816",
"labels": {
"en": {
"language": "en",
"value": "Mao Zedong"
},
"zh-hans": {
"language": "zh-hans",
"value": "毛澤東"
}
},
"descriptions": {
"en": {
"language": "en",
"value": "Chairman of the Communist Party of China"
},
"zh-hans": {
"language": "zh-hans",
"value": "中國共產黨中央委員會主席"
}
},
"aliases": {
"en": [
{
"language": "en",
"value": "Mao Tse-tung"
},
{
"language": "en",
"value": "Chairman Mao"
}
]
},
"claims": {
"P109": [
{
"mainsnak": {
"snaktype": "value",
"property": "P109",
"datavalue": {
"value": "Mao Zedong signature.svg",
"type": "string"
},
"datatype": "commonsMedia"
},
"type": "statement",
"id": "Q5816$618e6d2e-43ba-5d72-16d2-fda07ffca933",
"rank": "normal",
"references": [
{
"hash": "167445151e65821ce4e9d2141afbb3dafb53b8e5",
"snaks": {
"P143": [
{
"snaktype": "value",
"property": "P143",
"datavalue": {
"value": {
"entity-type": "item",
"numeric-id": 30239
},
"type": "wikibase-entityid"
},
"datatype": "wikibase-item"
}
]
},
"snaks-order": [
"P143"
]
}
]
}
],
},
"sitelinks": {
"afwiki": {
"site": "afwiki",
"title": "Mao Zedong",
"badges": [ ],
"url": "https://af.wikipedia.org/wiki/Mao_Zedong"
},
}
}
3.2 頂級字段
json格式的entity頂級字段有:
- id: 實體id。
- type: 實體類型。
- labels: 不同語言描述的實體標籤。
- descriptions: 不同語言的實體描述。
- aliases: 不同語言描述的實體別名。
- claims: 以屬性分組的實體聲明(claims)或者陳述(statements)。
- sitelinks: 各種網站上關於此實體的描述。
- lastrevid: 當前json文件的版本。
- modified: 當前json文件的發佈日期。
每個entity都有識別碼(id)、標籤(label)、描述(description)、別名(aliases),使不同的entity得以區分。而entity中的具體數據被稱爲claim,一個entity可以有許多 claim。
3.3 Claims 以及 Statements
claim 包含一條主體信息(main Snak)以及一些修飾信息(qualifier Snaks)。statement是含有參考資料(reference)的claim。每個claim總是與一個屬性(property)關聯(claim是關於此property的)。並且在一個實體中可以有多條claim與同一property關聯。
claim含有以下字段:
- id: 識別碼,只能保證當前數據庫中唯一,不包含其他信息。
- type: claim的類型,目前只有statement和claim兩種。
- mainsnak: 如果claim含有type值,那麼它具有mainsnak字段包含與property相關的主體信息。
- rank: 表示claim是否應該顯示在查詢結果中,爲preferred, normal 或者 deprecated.
- qualifiers: 修飾信息,一般爲主體信息的上下文信息,每一條都與一個屬性(property)關聯。
- references: 如果claim是statement,那麼會有一個參考資料的列表。
3.4 解析示例
3.1節中的json字段,除了claims頂級字段,其它信息都可以直接提取利用。
claims字段下爲一個字典,字典的鍵爲屬性(property),示例中只有一個key:P109。通過屬性頁P109屬性頁可以知道此屬性表示簽名。
與此屬性關聯的claim只有一個,mainsnak爲此claim的主體信息,datavalue中的value爲”Mao Zedong signature.svg”,表示實體毛澤東的簽名文件文件名爲”Mao Zedong signature.svg”。另外此claim的type爲statment,因此含有一個參考資料列表-references。mainsnak中的datavalue也可以爲其它關聯實體(提供實體id)。
3.5 解析難點
- 屬性都是以屬性ID表示的,不能直接解析屬性的含義
- 關聯實體是以實體ID表示的,需要多次的查詢-解析。
- 不同種類實體含有的屬性不同