用Wikidata做實體搜尋的兩種方案
用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"
},
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
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表示的,需要多次的查詢-解析。
- 不同種類實體含有的屬性不同
相關文章
- 一種基於圖片搜尋影片的方案
- 實用的檔案搜尋工具:ProFind for MacMac
- 實現高可用的兩種方案與實戰
- 50_初識搜尋引擎_上機動手實戰常用的各種query搜尋語法
- 開放搜尋開源相容版,支援Elasticsearch做搜尋召回引擎Elasticsearch
- WPF中 ContextMenu 尋找父物體的一種方案Context
- 雲搜尋服務在APP搜尋場景的應用APP
- 微信全文搜尋耗時降94%?我們用了這種方案
- 給大家分享一個 python 做的搜尋引擎Python
- redis的兩種持久化方案Redis持久化
- Windows搜尋功能最佳化:啟用全新Related解決和改善Windows搜尋體驗Windows
- 直播開發app,實時搜尋、搜尋引擎框APP
- SAP UI5應用裡搜尋功能的實現UI
- 基於 Kafka 的實時數倉在搜尋的實踐應用Kafka
- Apache Doris在京東搜尋實時OLAP中的應用實踐Apache
- 單頁應用SPA做SEO的一種清奇的方案
- 用 Algolia DocSearch 輕鬆實現文件全站搜尋Go
- 如何解決使用mac聚焦搜尋無法搜尋軟體的情況Mac
- 基於 Electron 做視訊會議的兩種實現方式
- 直播軟體開發,實現模糊搜尋的程式碼分析
- 資料遷移方案 + Elasticsearch在綜合搜尋列表實現Elasticsearch
- 助你掌握搜尋神器,10個實用的Elasticsearch查詢技巧Elasticsearch
- 大資料HBase在阿里搜尋中的應用實踐大資料阿里
- SAP Fiori應用的搜尋問題
- Elasticsearch搜尋功能的實現(五)-- 實戰Elasticsearch
- 海量資料搜尋---demo展示百度、谷歌搜尋引擎的實現谷歌
- 圖的廣度優先搜尋和深度優先搜尋Python實現Python
- vue2實現搜尋結果中的搜尋關鍵字高亮Vue
- 用Python實現一個大資料搜尋引擎Python大資料
- 用PHP來實現二分搜尋樹(BST)PHP
- Kali Linux搜尋軟體包Linux
- MySQL用LIKE特殊字元搜尋MySql字元
- Angular input / ion-input ion-searchbar 實現軟體盤換行 改 搜尋 並且觸發搜尋方法 Android iOS適用AngularAndroidiOS
- 谷歌用快取重複的請求 搜尋加過載入速度提升兩倍谷歌快取
- mac搜尋軟體推薦:HoudahSpot 補丁啟用版Mac
- 直播軟體搭建,利用精準搜尋最佳化使用者搜尋體驗
- Elasticsearch(ES)的高階搜尋(DSL搜尋)(上篇)Elasticsearch
- Elasticsearch(ES)的高階搜尋(DSL搜尋)(下篇)Elasticsearch