用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:

https://www.wikidata.org/w/api.php?action=wbsearchentities&search=Fudan&language=en&limit=20&format=json

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表示的,需要多次的查詢-解析。
  • 不同種類實體含有的屬性不同
發佈了143 篇原創文章 · 獲贊 176 · 訪問量 385萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章