1万件超の登録を実現した
Botノウハウからマッシュアップまで


          高久雅生
       tmasao@acm.org
    saveMLAKシステム担当
    (物質・材料研究機構)


                        1
自己紹介
                  ― わたしとウィキ ―
•   独立行政法人物質・材料研究機構(茨城県つくば市)

    – 科学情報室(主任エンジニア)
    – 専門図書館の運営(システム面でのサポート対応)
• Code4Lib JAPANコアメンバー
    – 図書館におけるウェブ技術の活用
• ウィキ体験
    – ウィキペディアン(2003年から; 最近はブレイク中)
       • ボット経験あり: [[Wikipedia:広域ブロック/rangeblocklist]]
    – QwikWeb(2006年から)
    – Pukiwiki, Hiki, (MediaWiki)
                                                    2
NIMS図書室




          3
2011‐03‐11  15:44頃




                     4
東北関東大震災、saveMLAKとわたし

• 2011年3月11日 14:46:会議室で打合せ中
• 停電・断水・TX運休により帰宅難民
• 筑波大学春日キャンパスだけ通電しているという
  情報を得たため、21時頃に筑波大学に移動、宿泊
• ひたすら夜を徹して、避難所情報や交通情報を提
  供し続けた、つくば市情報システム担当
  (@tsukubais )さんのツイートに感動
• ARG岡本さんのツイートをきっかけに savelibrary の
  活動に参加
 – 自分の被災体験+ウィキ経験+Code4Lib JAPAN+…
                                    5
東北関東大震災、saveMLAKとわたし (2)
• 帰宅してすぐにsavelibrary@ウィキの施設情
  報 を地図にまとめる作業を開始
                          3/12 19:26
• カーリル のマッシュアップを作成、メンテナン
  ス
 – スクレイピング
   • 施設情報(所在地) + Calil緯度経度
   → Google Maps埋め込み (kml)




                                                              7
           http://twitter.com/#!/tmasao/status/46517451839647744
http://maps.google.co.jp/maps/ms?ie=UTF8&hl=ja&brcurrent=3,0x34674e0fd77f192f:0xf542
75d47c665244,0&msa=0&msid=207257696541767388741.00049e3e44f8717e73cf3&z=6
                                                                               8
http://twitter.com/tmasao/status/46523534608039936
                                              9
http://twitter.com/#!/tmasao/status/47334763756920832
                                                  10
Savelibrary時代の地図ボット
• @ウィキ編集画面のHTMLから図書館の被災情
  報をスクレイピング
• カーリル図書館API:
 – 図書館の名称、都道府県、市町村名など
• 図書館の名前と照合してマッチしたものの住所
  を取り出して、人手で緯度経度を付与してKML形
  式に変換




                         11
savelibrary時代の地図ボット
result = ( text == formal ) or
        ( text == short ) or
        ( text.gsub( /[ ・「」¥(¥)]/, "" ) == formal.gsub( /[ ・「」¥(¥)]/, 
"" ) ) or
        ( text.gsub( /¥A.+?県/, "" ) == formal.gsub( /¥A.+?県/, "" ) ) 
or
        ( text.gsub( /[市区町村]立?/, "" ) == formal.gsub( /[市区町村]
立?/, "" ) ) or
        ( text.gsub( /¥s*中央図書館¥Z/, "図書館" ) == formal.gsub( /¥s*中
央図書館¥Z/, "図書館" ) ) or
        ( text.gsub( /¥s*付属図書館¥Z/, "附属図書館" ) == 
formal.gsub( /¥s*付属図書館¥Z/, "附属図書館" ) ) or
        ( text.gsub( /¥s*(中央|本)館¥Z/, "" ) == formal.gsub( /¥s*(中央|
本)館¥Z/, "" ) ) or
        ( text.gsub( /([市区町村])?立?(中央)?図書館¥Z/, '¥1図書館' ) == 
formal.gsub( /([市区町村])?立?(中央)?図書館¥Z/, '¥1図書館' ) ) or
        ( text.gsub( /本館¥Z/, '' ) == formal.gsub( /本館¥Z/, '' ) ) or
        ( text.gsub( /公民館[  ]*図書室¥Z/, '公民館' ) == formal.gsub( /
公民館[  ]*図書室¥Z/, '公民館' ) ) or
        ( text.gsub( /[ ・「」¥(¥)]/, "" ).gsub( /学院大学/, '学院' ) == 
formal.gsub( /[ ・「」¥(¥)]/, "" ).gsub( /学院大学/, '学院' ) ) or
        ( text.gsub( /ケ/, "ヶ" ) == formal.gsub( /ケ/, "ヶ" ) ) or 12
savelibraryからsaveMLAKへ
• このボット用スクレイピングスクリプトを活かし
  て、移行用データを作成(atwiki2mediawiki.rb)
 – 都道府県単位から、各図書館施設ページ単位へ
 – テキストを@ウィキ書式からMediaWikiへ変換
 – (@ウィキ上の図書館リストの書式スタイルに揺れ
   があるのに気付かず、あちこち抜けてしまい、編集
   者のみなさんに迷惑かけました…)



                                 13
saveMLAKにおける施設ページ
• 図書館、博物館、文書館、公民館
• 不特定多数の手によって編集されたページ
• 基本情報+αはさまざまな「リスト」データを元に一
  括登録 (createpage)
• 新規登録以外にも、編集労力・人手を省力化でき
  ることは多い
 – 「カテゴリ」(cat)
 – 「よみ」(check_yomi)
 – 「緯度経度」(geocode)
• MediaWikiは編集・検索等のAPIがある。
• Pywikipediabot!!!
                             14
一括登録用ボット: createpage.py
•   一件一ページ単位の登録
•   重複登録を防ぐ、上書き登録を防ぐ
•   サーバ負荷への対応
•   館種ごとに一括登録用データを提供してもらい作業
    – 元データリストごとに難しさが違う
      • 元リスト側でも頻繁に更新が続いている(グーグル避難所情報)
      • リスト調査後に市町村合併…(公民館名鑑)
    – M: 85% (4565/5385)  「インターネットミュージアム」由来
    – A: 41% (66 / 160) 「国立公文書館リンク集」ほか由来
    – K: 91% (5732 / 6278) 「グーグル避難所マップ」、「全国公民
      会連合会」
• 一括登録されたページの一覧と、すでにページに情報
  があるため、重複/上書きを避けて更新しなかったペー
  ジリストを出力
                                            15
公民館リストデータの登録
• グーグル避難所情報
 – http://shelter‐info.appspot.com/maps
   • (Google Fusion Tables)
 – 基本情報(名称、住所、緯度経度、電話番号)
 – 避難者情報(定員、避難者数)
 – 483箇所
• 公民館連合会による『公民館名鑑』調査リスト
 – 基本情報(名称、住所、電話番号)
 – 5249箇所
                                          19
一括登録ボットだけではダメで・・・
• 基本情報の抜け
  – カテゴリ:きちんと付いていないとリスト化できない…
  – よみ:カテゴリ一覧が悲しいことに
  – 緯度経度:地図に反映できない
• どのページに追記が必要か?という情報が必要
  → リストする。
• ある程度自動化/省力化が必要
  → カテゴリの自動付与:cat.py
  → Geocoding (Google Maps API) 
  → よみ入力補助
• Pywikipediabot
                                   20
編集支援ボット (1)
  緯度経度情報を住所から自動補完
• Google Maps API から自動追記
• 自動でGeocodingできないものはリストページ作業
  待ちとしてリスト化
 – [[利用者:Masao/NoGeocode]]
 – 市町村合併や住所誤字を除けばおおむね自動化可能
• 課題:GMaps APIの利用制限(IPアドレスあたり、
  2500件/日まで)

                             22
編集支援ボット (2)
              よみの入力補助
• 現状でよみ情報がはいっていない項目を都道府県単位
  で一覧化
  • [[利用者:Masao/Yomi_check]]
./check_yomi.py ‐cat:博物館 ‐input
Yomi for SLランド 3Dホラー館那須駅? SLらんど3Dほらーかんなすえき

>>> SLランド 3Dホラー館那須駅 <<<
‐ |よみ=
+ |よみ=SLらんど3Dほらーかんなすえき

Do you want to accept these changes? ([y]es, [N]o) y

Yomi for かかみがはら航空宇宙科学博物館?
                                                  23
…
活用例(マッシュアップ)
• 例: [[津波浸水地域]]
 – Semantic MediaWiki からのデータ出力機能を利用
   • [[特別:問い合わせ]]
 – saveMLAKのKML出力データを、浸水域マップをした
   東京大学生産技術研究所 沢田・竹内研究室の成
   果とマッシュアップ

他にも、アイデアさえあ
れば、もっともっと活用
できるはず!
災害復旧支援を!
                                  24
25
まとめと今後の課題
• MLAK施設リストデータの確保を:オープンデータの必
  要性
• 次に編集すべきページを推定するための一覧ページ
• 情報集約作業のたすけになるよう
 – 小人さん( 編集者)のための、縁の下の力持ち的なボット
   を目指して…。MasaoBotは one of them … 
 – たとえば 、ボットクン(kumo‐botkun)
 – 「高度に発達した編集者はボットと区別がつかない」


• (ソースコード)
 – http://github.com/masao/saveMLAK/
                                       26

1万件超の登録を実現したBotノウハウからマッシュアップまで

  • 1.
    1万件超の登録を実現した Botノウハウからマッシュアップまで 高久雅生 tmasao@acm.org saveMLAKシステム担当 (物質・材料研究機構) 1
  • 2.
    自己紹介 ― わたしとウィキ ― • 独立行政法人物質・材料研究機構(茨城県つくば市) – 科学情報室(主任エンジニア) – 専門図書館の運営(システム面でのサポート対応) • Code4Lib JAPANコアメンバー – 図書館におけるウェブ技術の活用 • ウィキ体験 – ウィキペディアン(2003年から; 最近はブレイク中) • ボット経験あり: [[Wikipedia:広域ブロック/rangeblocklist]] – QwikWeb(2006年から) – Pukiwiki, Hiki, (MediaWiki) 2
  • 3.
  • 4.
  • 5.
    東北関東大震災、saveMLAKとわたし • 2011年3月11日 14:46:会議室で打合せ中 •停電・断水・TX運休により帰宅難民 • 筑波大学春日キャンパスだけ通電しているという 情報を得たため、21時頃に筑波大学に移動、宿泊 • ひたすら夜を徹して、避難所情報や交通情報を提 供し続けた、つくば市情報システム担当 (@tsukubais )さんのツイートに感動 • ARG岡本さんのツイートをきっかけに savelibrary の 活動に参加 – 自分の被災体験+ウィキ経験+Code4Lib JAPAN+… 5
  • 6.
    東北関東大震災、saveMLAKとわたし (2) • 帰宅してすぐにsavelibrary@ウィキの施設情 報 を地図にまとめる作業を開始 3/12 19:26 • カーリル のマッシュアップを作成、メンテナン ス – スクレイピング • 施設情報(所在地) + Calil緯度経度 → Google Maps埋め込み (kml) 7 http://twitter.com/#!/tmasao/status/46517451839647744
  • 7.
  • 8.
  • 9.
  • 10.
    Savelibrary時代の地図ボット • @ウィキ編集画面のHTMLから図書館の被災情 報をスクレイピング • カーリル図書館API: – 図書館の名称、都道府県、市町村名など • 図書館の名前と照合してマッチしたものの住所 を取り出して、人手で緯度経度を付与してKML形 式に変換 11
  • 11.
    savelibrary時代の地図ボット result = ( text == formal ) or ( text == short ) or ( text.gsub( /[ ・「」¥(¥)]/, "" ) == formal.gsub( /[ ・「」¥(¥)]/,  "" ) ) or ( text.gsub( /¥A.+?県/, "" ) == formal.gsub( /¥A.+?県/, "" ) )  or ( text.gsub( /[市区町村]立?/, "" ) == formal.gsub( /[市区町村] 立?/, "" ) ) or ( text.gsub( /¥s*中央図書館¥Z/, "図書館" ) == formal.gsub( /¥s*中 央図書館¥Z/, "図書館" ) ) or ( text.gsub( /¥s*付属図書館¥Z/, "附属図書館" ) ==  formal.gsub( /¥s*付属図書館¥Z/, "附属図書館" ) ) or ( text.gsub( /¥s*(中央|本)館¥Z/, "" ) == formal.gsub( /¥s*(中央| 本)館¥Z/, "" ) ) or ( text.gsub( /([市区町村])?立?(中央)?図書館¥Z/, '¥1図書館' ) ==  formal.gsub( /([市区町村])?立?(中央)?図書館¥Z/, '¥1図書館' ) ) or ( text.gsub( /本館¥Z/, '' ) == formal.gsub( /本館¥Z/, '' ) ) or ( text.gsub( /公民館[  ]*図書室¥Z/, '公民館' ) == formal.gsub( / 公民館[  ]*図書室¥Z/, '公民館' ) ) or ( text.gsub( /[ ・「」¥(¥)]/, "" ).gsub( /学院大学/, '学院' ) ==  formal.gsub( /[ ・「」¥(¥)]/, "" ).gsub( /学院大学/, '学院' ) ) or ( text.gsub( /ケ/, "ヶ" ) == formal.gsub( /ケ/, "ヶ" ) ) or 12
  • 12.
    savelibraryからsaveMLAKへ • このボット用スクレイピングスクリプトを活かし て、移行用データを作成(atwiki2mediawiki.rb) – 都道府県単位から、各図書館施設ページ単位へ – テキストを@ウィキ書式からMediaWikiへ変換 – (@ウィキ上の図書館リストの書式スタイルに揺れ があるのに気付かず、あちこち抜けてしまい、編集 者のみなさんに迷惑かけました…) 13
  • 13.
    saveMLAKにおける施設ページ • 図書館、博物館、文書館、公民館 • 不特定多数の手によって編集されたページ •基本情報+αはさまざまな「リスト」データを元に一 括登録 (createpage) • 新規登録以外にも、編集労力・人手を省力化でき ることは多い – 「カテゴリ」(cat) – 「よみ」(check_yomi) – 「緯度経度」(geocode) • MediaWikiは編集・検索等のAPIがある。 • Pywikipediabot!!! 14
  • 14.
    一括登録用ボット: createpage.py • 一件一ページ単位の登録 • 重複登録を防ぐ、上書き登録を防ぐ • サーバ負荷への対応 • 館種ごとに一括登録用データを提供してもらい作業 – 元データリストごとに難しさが違う • 元リスト側でも頻繁に更新が続いている(グーグル避難所情報) • リスト調査後に市町村合併…(公民館名鑑) – M: 85% (4565/5385)  「インターネットミュージアム」由来 – A: 41% (66 / 160) 「国立公文書館リンク集」ほか由来 – K: 91% (5732 / 6278) 「グーグル避難所マップ」、「全国公民 会連合会」 • 一括登録されたページの一覧と、すでにページに情報 があるため、重複/上書きを避けて更新しなかったペー ジリストを出力 15
  • 15.
    公民館リストデータの登録 • グーグル避難所情報 –http://shelter‐info.appspot.com/maps • (Google Fusion Tables) – 基本情報(名称、住所、緯度経度、電話番号) – 避難者情報(定員、避難者数) – 483箇所 • 公民館連合会による『公民館名鑑』調査リスト – 基本情報(名称、住所、電話番号) – 5249箇所 19
  • 16.
    一括登録ボットだけではダメで・・・ • 基本情報の抜け – カテゴリ:きちんと付いていないとリスト化できない… – よみ:カテゴリ一覧が悲しいことに – 緯度経度:地図に反映できない • どのページに追記が必要か?という情報が必要 → リストする。 • ある程度自動化/省力化が必要 → カテゴリの自動付与:cat.py → Geocoding (Google Maps API)  → よみ入力補助 • Pywikipediabot 20
  • 17.
    編集支援ボット (1) 緯度経度情報を住所から自動補完 • Google Maps API から自動追記 • 自動でGeocodingできないものはリストページ作業 待ちとしてリスト化 – [[利用者:Masao/NoGeocode]] – 市町村合併や住所誤字を除けばおおむね自動化可能 • 課題:GMaps APIの利用制限(IPアドレスあたり、 2500件/日まで) 22
  • 18.
    編集支援ボット (2) よみの入力補助 • 現状でよみ情報がはいっていない項目を都道府県単位 で一覧化 • [[利用者:Masao/Yomi_check]] ./check_yomi.py ‐cat:博物館 ‐input Yomi for SLランド 3Dホラー館那須駅? SLらんど3Dほらーかんなすえき >>> SLランド 3Dホラー館那須駅 <<< ‐ |よみ= + |よみ=SLらんど3Dほらーかんなすえき Do you want to accept these changes? ([y]es, [N]o) y Yomi for かかみがはら航空宇宙科学博物館? 23 …
  • 19.
    活用例(マッシュアップ) • 例: [[津波浸水地域]] – Semantic MediaWiki からのデータ出力機能を利用 • [[特別:問い合わせ]] – saveMLAKのKML出力データを、浸水域マップをした 東京大学生産技術研究所 沢田・竹内研究室の成 果とマッシュアップ 他にも、アイデアさえあ れば、もっともっと活用 できるはず! 災害復旧支援を! 24
  • 20.
  • 21.
    まとめと今後の課題 • MLAK施設リストデータの確保を:オープンデータの必 要性 • 次に編集すべきページを推定するための一覧ページ • 情報集約作業のたすけになるよう – 小人さん( 編集者)のための、縁の下の力持ち的なボット を目指して…。MasaoBotは one of them …  – たとえば 、ボットクン(kumo‐botkun) – 「高度に発達した編集者はボットと区別がつかない」 • (ソースコード) – http://github.com/masao/saveMLAK/ 26