用Wikidata做實體搜尋的兩種方案

CopperDong發表於2018-03-15

用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"
        },
    }
}
  • 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表示的,需要多次的查詢-解析。
  • 不同種類實體含有的屬性不同

相關文章