Wikipedia CirrusSearchのダンプデータを利用する
2018-07-30

https://www.pexels.com/photo/black-and-white-blank-challenge-connect-262488/

Wikipediaのデータを容易に利用できるCirrusSearchのダンプデータについて紹介します。これを利用することにより、Wikipediaの巨大なXMLデータをパースしたり、Wikipedia Extractorなど既存のツールで前処理することなく、直にWikipediaの各種データにアクセスすることができます。

tl;dr

細かいことは置いておいて、素直にWikipediaの日本語エントリーに書かれているテキストを取得したい場合、

  • ここのCirrusSearchの任意の日付のダンプデータjawiki-YYYYMMDD-cirrussearch-content.json.gzを落としてくる
  • 中に入っているjsonデータをパースして、偶数行の"text"を取得するコードを書く

とすることで、簡単にWikipediaのテキストデータを取得することができます。

CirrusSearchダンプデータの概要

CirrusSearchは、ElasticSearchをバックエンドに構成された検索システムです。このシステムに利用されているデータがダンプデータとして公開されており、そのファイルを利用することで、整形されたテキストを始めとして、外部リンクのリストやカテゴリのリスト等のメタデータが容易に利用できます。また、言語ごとにダンプファイルが分かれているため、日本語のWikipediaのデータだけを対象にすることが可能です。

CirrusSearchのダンプデータは以下から取得します。

Index of /other/cirrussearch/

Wikipediaに関するダンプデータは以下の2つです。

ファイル 内容
jawiki-YYYYMMDD-cirrussearch-content.json.gz Wikipediaの本文(namespace0
jawiki-YYYYMMDD-cirrussearch-general.json.gz Wikipediaのその他情報(namespace0以外)

その他の接頭辞の対応関係は以下の通りです。

CirrusSearchのデータ

CirrusSearchのダンプデータは、1行が1つのjsonとなっており、2行で1つのエントリーを表しています。

奇数行

奇数行にはエントリーに固有のidが記載されています。この_idから該当のエントリーにアクセスするには、https://ja.wikipedia.org/?curid=3240437のようにcuridのパラーメータを指定します。

{
  "index": {
    "_type": "page",
    "_id": "3240437"
  }
}

偶数行

偶数行にはエントリーの情報が記載されています。下記の例では、複数の要素が入った配列や長い文字列は...で省略しています。

{
  "template": [
    "Template:各年の文学ヘッダ",
    ...
  ],
  "content_model": "wikitext",
  "opening_text": "1972年の文学では、1972年(昭和47年)の文学に関する出来事について記述する。",
  "wiki": "jawiki",
  "auxiliary_text": [
    "  1972年 こちらもご覧下さい   社会 政治 経済 ..."
  ],
  "language": "ja",
  "title": "1972年の文学",
  "text": "1972年の文学では、1972年(昭和47年)の文学に関する出来事について記述する。 ...",
  "defaultsort": false,
  "timestamp": "2017-03-28T05:50:27Z",
  "redirect": [],
  "wikibase_item": "Q944470",
  "heading": [
    "できごと",
    ...
  ],
  "source_text": "{{各年の文学ヘッダ|1972}}\n{{Portal|文学}}\n'''1972年の文学'''では、...",
  "version_type": "external",
  "coordinates": [],
  "version": 63522821,
  "external_link": [
    "http://www.1book.co.jp/001351.html",
    ...
  ],
  "namespace_text": "",
  "namespace": 0,
  "text_bytes": 6266,
  "incoming_links": 65,
  "category": [
    "1972年の小説",
    ...
  ],
  "outgoing_link": [
    "Template:各年の文学ヘッダ",
    ...
  ],
  "popularity_score": 4.5278205052139e-08
}  

よく使いそうな項目:

  • text: 整形されたエントリーの本文(タグ等が含まれていない平文)
  • title: エントリーのタイトル
  • category: エントリーに登録されているカテゴリ
  • source_text: mediawiki記法の本文(ウェブ画面でレンダリングするためのタグ等が含まれている)
  • outgoing_link: エントリーのテキストに含まれる外部記事へのリンク

CirrusSearchのデータを扱う

シェルで確認する

シェルから簡易的にダンプデータの中身を確認するには、以下のように圧縮ファイルの中身をjqを利用して整形して表示するのが容易です。

# Linuxの場合
$ zcat jawiki-20171106-cirrussearch-general.json.gz  | jq . | less
# macOSの場合
$ gzcat jawiki-20171106-cirrussearch-general.json.gz  | jq . | less

Pythonでパースする

Pythonでテキストを利用するには、下記のようなコードを利用します。

import json
import gzip

with gzip.open("jawiki-20180611-cirrussearch-content.json.gz") as f:
    for line in f:
        json_line = json.loads(line)
        if "index" not in json_line:
            text = json_line["text"]

ライセンス

本ページはCirrusSearchのデータを一部改変して記載しております。本ページもCirrusSearchと同様に、CC-BY-SAにて公開します。

Creative Commons Attribution-ShareAlike License

参考

このエントリーをはてなブックマークに追加