OpenRefineで学校データをウィキデータにアップしてみる


公立学校の基礎情報はたいてい管理自治体のウェブサイトで公開されています。ここでは南房総市の小学校一覧を例に[OpenRefine](http://openrefine.org/)を使ってインポートしてみます。
# 1 [OpenRefine](http://openrefine.org/)の概要とインストール
機械可読なCSVデータといえども、データ量が増えるにつれて表記の揺れや数値単位の混在など、首尾一貫性の無い値が含まれることがよくあります。OpenRefineはこうした「乱雑な」データを整形したり、異常値を検出したりして、有意な統計解析などを行う前処理としてのデータクレンジングを行うツールです。
表記揺れの中には、スペースを除去したり、文字を補ったりする単純な文字列操作だけでは補正しきれず、マスターデータ的な原本に当たって正しいとされる名前を参照しなければならないものもあります。原本側で参照用のエンドポイントを公開しているものであれば、こうした照合(reconcile)作業もOpenRefineで行うことができます。中でもウィキデータは照合先としてだけではなくデータの登録先としても使用することができます。
インストールは非常に簡単でJREとOpenRefineをインストールするだけです。インストールのやり方は[こちらの記事](https://qiita.com/keita69sawada/items/5f47d1a8ff078e67ee3f)などを参照してください。
実行ファイルを開くとブラウザ上でOpenRefineが立ち上がります。
![](https://i.imgur.com/MPDjirX.png)
言語は初期値として英語が設定されているので、まずこれ(Language settings)を日本語にしてひとまず準備完了です。
（2019/11/30時点で最新のOpenRefine3.3betaではアプリを終了すると言語設定が保存されず初期値に戻ってしまうので、起動の都度言語を日本語に設定し直す必要があります）

# 2 [南房総市のウェブサイト](https://www.city.minamiboso.chiba.jp/0000000882.html)に掲載されている小学校一覧
![](https://i.imgur.com/rmzEFEO.png)

# 3 前処理
## 3.1 貼り付け
上記南房総市ウェブサイトの掲載内容をコピーしていったんGoogle spread sheetに貼り付けます。
OpenRefine上での編集が難しい内容などはここで前処理を行います。
## 3.2 URL抽出
学校名称から張られているリンクを抽出して別カラム（学校URL）に貼り付けます。
手作業（右クリック）で個々に取り出すこともできますが、件数が多くなると対応しきれなくなるので、[こちら](https://rakuzanet.jp/linktitle-extraction.html)で提供されているExcelマクロを使って抽出します。（他にやり方があればそちらでどうぞ）。
![](https://i.imgur.com/afkoI5d.png)
![](https://i.imgur.com/fQoYlKd.png)
# 4 OpenRefine上での編集
## 4.1 プロジェクトの作成
上記3.2の結果をコピーしてOpenRefineに貼り付けで「次へ」「プロジェクトを作成」。
![](https://i.imgur.com/7x76fva.png)
![](https://i.imgur.com/hhc6P8B.png)
![](https://i.imgur.com/qOvjHPR.png)
## 4.2 名称
名称はきっちり揃っているのでそのまま6で使います。
「南房総市」を外した名称で、略称というカラムを作り、6で使います。名称欄の▼より「カラム編集」＞「このカラムに基づいてカラムを追加」
![](https://i.imgur.com/gKbCPPm.png)
編集スクリプトの記述画面が現れます。
![](https://i.imgur.com/qzMMXbY.png)
「略称」というカラム名をGRELでスクリプトを書いて作成します。value内に基にしたカラムの値が入っています。
![](https://i.imgur.com/CaEgLJ5.png)

`substring(value,3)`

略称欄が追加されました。
![](https://i.imgur.com/8n3sT75.png)
## 4.3 所在
先頭に「千葉県」を補います。ここではカラムを追加せずに直接上書き編集します。
所在欄の▼＞「セル編集」＞「変換」
![](https://i.imgur.com/hFINyMd.png)
`"千葉県"+value`
![](https://i.imgur.com/Smq3ZBG.png)
先頭に「千葉県」が追加されました。
![](https://i.imgur.com/kCsaUzp.png)
## 4.4 座標
所在をもとに[「CSISシンプルジオコーディング実験」](http://newspat.csis.u-tokyo.ac.jp/geocode/modules/geocode/index.php?content_id=1)のAPIで座標値を取得します。
所在欄▼>「カラム編集」＞「URLでカラムを追加...」
![](https://i.imgur.com/8aukSE7.png)
カラム名「座標」。フェッチ間隔の遅延：1000ミリ秒。
`"http://geocode.csis.u-tokyo.ac.jp/cgi-bin/simple_geocode.cgi?addr="+value`
![](https://i.imgur.com/0HoYyxv.png)
座標値が取得できた。
![](https://i.imgur.com/ypkJM7z.png)
なお「CSISシンプルジオコーディング実験」は実験の位置付けで、位置がややずれている場合もありますのでご注意ください。
## 4.5 座標値
「座標」欄の▼＞「カラム編集」＞「このカラムに基づいてカラムを変換」
![](https://i.imgur.com/EhcSy66.png)
`value.parseXml().select("latitude")[0].xmlText()+", "+value.parseXml().select("longitude")[0].xmlText()`
![](https://i.imgur.com/JwXMhjg.png)
緯度経度だけを取り出して座標値欄に出力できました。
![](https://i.imgur.com/oQzo61Y.png)
## 4.6 問い合わせ
国際電話番号表記に合わせて整形します。
![](https://i.imgur.com/wZoQigc.png)
`"+81-"+substring(value,1,4)+"-"+substring(value,5,7)+"-"+substring(value,8,12)`
![](https://i.imgur.com/CMOV3Vi.png)
# 5 ウィキデータ照合
# 5.1 項目有無の確認
ウィキデータに登録する際には同じ項目を重複作成しないように気をつける必要があります。ラベルに相当する値でウィキデータ照合を行うことで、既存項目があればそのQ番号と紐付け、無ければ新規項目の印を付けることができます。
名称欄▼で「照合（名寄せ）」＞「照合(reconcile)を開始」
![](https://i.imgur.com/dicaNoX.png)
![](https://i.imgur.com/NcJGXYj.png)
「サービスを追加」で以下のウィキデータ日本語のサービスURLを設定
<del>`https://tools.wmflabs.org/openrefine-wikidata/ja/api`</del>
`https://wdreconcile.toolforge.org/ja/api`(2020/7/11変更)
![](https://i.imgur.com/CDz3jRt.png)
![](https://i.imgur.com/rJBQ7UW.png)
Wikidata(ja)を選択
![](https://i.imgur.com/4I8BjPY.png)
ここでは照合対象をクラスなどで絞り込めるのですが、どういうクラスで登録されているか分からない場合は、クラスを決めずにウィキデータ全体を検索します。名称だけで一致する候補をピックアップするので、いちばん似ているものだけを表示するために照合候補の最大件数を1件として「照合を開始」。
![](https://i.imgur.com/DrpSSlT.png)
同一のものを指す名称（ラベル）を持つウィキデータ項目があれば名称欄からQ番号にリンクが張られて青字になるのですが、今回は全て新規項目なので「新しい項目を作成」を選びます。チェックがひとつのボックスを選ぶとその行だけ、チェックがふたつのボックスを選ぶと以下の行に同じ名称があれば同様の選択が自動的に行われます。照合し直したい場合は青字の「マッチを検索」を選びます。ここではチェックがひとつのボックスを選んでひとつずつ確認します。
![](https://i.imgur.com/MrWayox.png)
6件全てに「New」と表示され、新規項目とみなされました。
## 5.2 基本的なプロパティを設定
[小学校](https://www.wikidata.org/wiki/Q9842)というクラスでよく使われているプロパティを
[Wikidata Class Browser](https://bambots.brucemyers.com/WikidataClasses.php?id=Q9842&lang=ja)で探してみます。
![](https://i.imgur.com/Lu2FiUz.png)
![](https://i.imgur.com/fEZnjdI.png)
国、位置する行政区画、所在地などがよく使われているようです。ここではまだカラムが無いもののうち値が明らかな「国」「位置する行政区画」「分類」を設定します。
OpenRefineでは単純にカラムを追加する機能が無いので、名称欄に基づいて各カラムを作成する操作を行います。
![](https://i.imgur.com/yzvJVOp.png)
![](https://i.imgur.com/PN1v73j.png)
「位置する行政区画」「分類」も同様に追加します。なお、「分類」の値は[「小学校(Q9842)」](https://www.wikidata.org/wiki/Q9842)でも正しいのですが、より詳細なサブクラス[「日本の小学校(Q5358913)」](https://www.wikidata.org/wiki/Q5358913)があるので、ここではそちらを使います。
![](https://i.imgur.com/O1khk3E.png)
３つのカラムと各行の値を追加できました。
# 5.3 項目型の値にQ番号を紐付ける
プロパティの値が項目型である場合にはウィキデータにアップロードする前にQ番号と紐付けておく必要があります。追加した3つのカラムでその操作を行います。
![](https://i.imgur.com/Sj3KR0k.png)
![](https://i.imgur.com/aVq6Ntx.png)
以下同様にして3つのカラムをQ番号と紐付けました。（青字になっています）
![](https://i.imgur.com/NPi2lc8.png)
# 5.4 説明
上記5.2で説明欄が抜けていたので追加
![](https://i.imgur.com/W0Jlh4n.png)
# 6 ウィキデータのスキーマ作成
表形式で整形したデータをウィキデータにアップロードするにはウィキデータの構造（スキーマ）を定義する必要があります。
![](https://i.imgur.com/8f56f1F.png)
準備したカラムが上部に表示されます。各カラムをウィキデータのラベル、説明、別名、プロパティ、プロパティ値などに紐付けます。修飾子や出典もここで設定できます。
![](https://i.imgur.com/sUg6bAI.png)
# 6.1 用語(Term)：見出し部
「項目追加」でラベル、説明、別名を登録します。上段にある事前に作成したカラム名から「名称」をドラッグしてスキーマの「項目を入力」欄にドロップします。
![](https://i.imgur.com/Y4mfO3J.png)
次に「Term追加」で「用語(Term)」の下の「別名▼」のところで「ラベル」「説明」「別名」をそれぞれ1行ずつ登録します。その際「lang」には「ja」を手入力し、その右側の空欄には値、すなわち上段カラムより「名称」「説明」「略称」をそれぞれドラッグ＆ドロップします。すると以下のようになります。
![](https://i.imgur.com/XSK97W8.png)
# 6.2 ステートメント：詳細部（文）
ウィキデータの登録画面とよく似た画面で、プロパティ－値の文、修飾子、出典などを追記して行きます。値が入る欄には事前に準備した上部のカラムか、文字列を直接入力します。
まずプロパティ欄にはウィキデータ入力画面と同様に、プロパティのラベルを手入力し、表示された候補リストより対象を選びます。
![](https://i.imgur.com/hDQLLs7.png)
次にその値が入っているカラム「分類」を上段よりドラッグ＆ドロップします。
![](https://i.imgur.com/17uiRUn.png)
以下同様にして、上段カラムの値を代入する場合はドラッグ＆ドロップで、文字列を直接入力する場合は値の欄に直接手入力します。
![](https://i.imgur.com/I8UNk9x.png)
![](https://i.imgur.com/Rjhx4ad.png)
![](https://i.imgur.com/3I8NoVD.png)
# 6.3 エラー確認
致命的なエラーがある場合は該当箇所が赤くなり次に進めません。赤い箇所が無ければ上段の「項目」タブを選んで警告エラーが出ている場合はその内容を確認します。
![](https://i.imgur.com/30uYCuc.png)
無視して進んでも問題無い内容であることを確認し、問題があれば「スキーマ」タブに戻って修正します。
「プレビュー」タブを選ぶと、項目を登録するイメージが確認できます。
![](https://i.imgur.com/KGu4lGO.png)

# 7 ウィキデータへアップロード
画面右上で「Wikidataへアップロード」を選んでアップロードします。
![](https://i.imgur.com/zHYtg7k.png)
ウィキデータにログインしていない場合はログイン要求が来るのでログインします。
![](https://i.imgur.com/DLRFNXp.png)
左下「編集サマリー」欄に編集の概要（南房総市の小学校を登録）を入力して「編集項目のアップロード」
![](https://i.imgur.com/CNZ6K9I.png)
画面上部に登録処理の進捗率が表示され、100%になったらウィキデータへの登録完了です。
更新状況はウィキデータ画面右上の「投稿記録」より確認できます。
![](https://i.imgur.com/dYvCURq.png)

OpenRefineによるウィキデータ照合・アップロードに関する詳細は[Wikidata:Tools/OpenRefine](https://www.wikidata.org/wiki/Wikidata:Tools/OpenRefine/ja)や@yayamamoさんの[「OpenRefineを用いてWikidataの項目と照合する」](https://qiita.com/yayamamo/items/eade3e5788e6f359bce7)もご参照ください。編集スクリプト「GREL」のチュートリアルは[こちら](https://github.com/OpenRefine/OpenRefine/wiki/GREL-Functions)です。