前回の記事(Google Chromeの拡張機能 Web Scraperを使って棋譜DB2でWebスクレイピング)ではWebScraperを使った棋譜DB2の棋譜リンク(URL)の取得手順を紹介しました。
そもそもなぜリンク一覧が必要かというとCSVなどのリスト形式からなら簡単に順番に棋譜を取り込んでいけるからです。それにはマクロという面倒くさい操作を自動化してくれる便利なソフトを使用します。例えば「棋譜DB2」の前身の「棋譜でーたべーす」からなら割と簡単に棋譜の取り込みができていました。下の図が「棋譜でーたべーす」(魚拓より・現在は閉鎖されている)の新着棋譜ページでしたがこの一覧をコピーしてテキストエディタやエクセルに貼り付けマクロを実行させるだけで棋譜が取り込めます。これを「棋譜DB2」でもやらせたいがためのWebScraperでのリンク一覧抽出でした。
*以下はWindows環境下での作業になります。HiMacroEXと秀丸がWindows用ソフトですがMac、Linuxの方にも代替ソフトはあると思います。
URLとファイル名の抽出
それでは始めていきます。
今回は新しく「棋譜DB2」サイトからWebScraperを使って新着の棋譜から3ページ分、floodgateの直近の棋譜から10ページ分のURLを抽出しました。WebScraperの設定は下のようになります。「新着棋譜」、「floodgate」など決まった棋譜しか取得しないのであれば下の図のように設定を作っておいてページ数だけを変更すれば楽です。
あとファイル名を分かりやすい名前に変えることもまとめてやってしまいたいと思います。
棋譜一覧ページのリンクのidをlinkとします。前回はここ、titleでした。一貫性がなくてすみません、ここはlinkだけを取得したいための設定だからlinkとしました。
そして今回は前回のおさらいになるので応用編という事でファイル名を分かりやすくするために一工夫してみます。
棋譜それぞれのリンクページのタイトルをファイル名にしたいと思います。それとファイル名の先頭を日時にします。そのほうが棋譜整理しやすいからです。時系列でソートさせることができます。パソコンでデータベースに登録して使う分にはファイル名など何でも構いませんが、例えば外出先でラーメン食べているときにふと「昨年の羽生さんと菅井さんのタイトル戦を見たい」と思ったとするときにスマホだと検索機能が貧弱なために探しずらい、そういったときにファイル名から探せるというのがあります。あとファイル名がしっかりしていたほうが棋譜の収集意欲が掻き立てられます。そしてファイル名を変える最大の理由は棋譜の整理がしやすいからです。ファイル名はやはり人間に理解できる文字列であってほしいからです。WebScraperで取得するCSVファイルのリンクページのタイトルも棋戦名が2つあったり不満点があります。あと段位も要らない気がします。このあたりの細かい修正はテキストエディタの秀丸の置換機能を使ってやっていきます。
WebScraperの設定に戻ります。今回はidをtitleとしてTypeはテキストのみ抽出できればいいのでTextとします。
気をつけるのはSelectorの設定です。この例だと「2018-03-23 NHK杯」をSelectで選択して次に「阿部健治郎 七段 vs. 橋本崇載 八段 第68回NHK杯1回戦第5局」を選択したときにエラーが出ました。複数の要素を選択したときにエラー出るようです。「ポッキーのような棒」にチェックを入れると複数要素選択可能になります。これで日付と対局者名と棋戦名入りのデータが取り出せることになります。これが将来のファイル名になります。
Sitemap shogidb2タブ
↓
「Selector graph」で階層を視覚的に確認してみます。色々設定いじくってると訳が分からなくなってくるので時々ここを確認してみたらいいと思います。
_rootが新着棋譜とfloodgate棋譜のページネーション、linkが棋譜一覧ページの中のリンク、titleが各棋譜ページのタイトルテキストになっています。
Sitemap shogidb2タブ
↓
Browse
で確認します。間違って違う部分を取得してしまったということがないように。今回はスクレイピングに時間が掛かる(棋戦情報を取得したいためにそれぞれの棋譜ページを一つ一つ開く必要があるから)ために時間が掛かるのでやり直しにならないように確認は重要です。
Sitemap shogidb2タブ
↓
Scrape
でLet’s Scraping!
新着の棋譜から3ページ分、floodgateの直近の棋譜から10ページ分で総数が195棋譜。
URLとタイトルテキスト取得に掛かった時間は14分30秒です。
秀丸でのテキスト編集
csvファイルをここではテキストエディタの秀丸で開きます。エクセルがインストールされていればエクセルで開くと思います。以下は個人的に使いやすい秀丸での作業を紹介してます。以下は秀丸での操作。
表示→タブストップ→CSVモード(カンマ区切り)でタブごとに揃えて見やすくします。
テキストを全選択して、編集→変換→ソートで取得した順に並び替えます。
不要な列を削除します。必要なのはURLとタイトルだけです。ここで日付の後の「wdoor+floodgate-300-10F」も消しておきます。下の図は矩形選択を使って選択しているところ。ちなみにfloodgate棋譜のファイル名「wdoor+floodgate-300-10F」について少し調べてみました。wdoorがサーバー名、300-10Fの意味はFがフィッシャークロックルール(自分の手番が回ってくるごとに10秒加算)、持ち時間300秒(5分)という意味のようです。
左がURL、右がファイル名と綺麗に左右に分かれてレイアウトされました。ここからさらにファイル名を細かく指定していきます。重度の棋譜収集マニアしかこんなことはしないかも知れませんが参考までに記載します。はじめにやりたいことは「vs.」を「VS」に、日付の後の棋戦名を消す、段位を消す、名前の間の空白を消す、といったことです。具体的には秀丸の置換機能を利用します。本来これは手作業で一つ一つ実行していきますが、まとめて実行する秀丸用のマクロがあります。「変換リストによる連続置換」というマクロで別にリスト化された処理を一度に実行するものです。それを使って綺麗に整形されたファイル名がこちら。
だいぶ分かりやすい表記になったと思います。美しいですね。旧棋譜データベースのファイル名のフォーマットと似てます。ファイルのソートも思いのまま、必要最小限の情報だけ残しました。気になる全角数字を半角数字に変換したい欲求は秀丸の置換を使ってできそうなのですが後回しにしてしまってます。いずれ時間を見つけて一気に処理したいです。ここまででマクロを使って自動化させる準備は整いました。
マクロ実行
マクロツールにはさまざまありますがここではHiMacroExというフリーソフトを使います。具体的な手順としては秀丸でリンクをクリック→ブラウザで各棋譜のページを開く→棋譜の書き出しリンクをクリック→棋譜を全選択&コピー→別に立ち上げてある秀丸に貼り付け→日時秒名で保存になります。ブラウザはIE、Firefox何でも構いませんがここではGoogle Chromeを使います。棋譜の書き出しでCSA形式、KIF形式、KI2形式の三種類が用意されてるのでどれかを選びます。CSA形式はコンピュータ将棋ファイル記述形式、KIF形式、KI2形式は柿木将棋の形式で広く普及しています。KIF形式が持ち時間が記載されたもの、KI2形式がされてないものです。ここではCSA形式を採用します。3つ試してエラーが無かったのがCSA形式だったからです。kif、ki2だと確かNHK杯の棋譜でエラー出たような気がします。次に日時秒名で保存ですがこれも秀丸のマクロを使います。「秀丸 日時秒 保存」などで検索すると色々出てきます。そもそもなぜ日時秒名で保存かというと保存するときにファイル名の指定で悩んだからです。あと日時秒名ならソートで順番にファイルが並びます。順番にファイルが並ばせることが重要で後で一括リネームするためです。
それでは先ほどのURLとファイル名のリストをマクロにかけていきます。
結果、195棋譜のマクロ処理に要した時間は34分でした。もちろん環境によって時間は変わります。高速に安定して動作させるためには常駐ソフトを切ったり不要ファイルをクリーンアップをしたりしますが、めんどくさいので私は棋譜取り専用のパソコンを用意してます。
下準備もありますから200局近い棋譜の取得にWebScraperでの作業と合わせて1時間近く掛かっている事になります。プログラムを組まないでやるとなるとこのぐらいが限界だと思います。これを手作業でやるとしたらコピペ作業をひたすら繰り返すわけですが5~6時間掛かると思います。一つの棋譜取得が30秒だから単純計算で1時間半しか掛からないと思うのは間違いで人間は計算通りには行きません。実際は休憩も入れないといけないし気分転換もしなければならない、取り掛かるのに凄いエネルギーが要るし終わった後はグッタリ疲れる。腱鞘炎になりそうになりながらキーボードとマウスを操作し目薬を差しながら画面を見続けて作業するのは辛いものです。それから開放されると思えば1時間ぐらいどうってことはありません。
マクロでの作業が終わったら一括リネームさせます。それにはここではフリーソフトHiRename(HiMacroExと同じ作者さん)を使います。こそのソフトは好きなテキストエディタを指定できるので秀丸にしておきます。そのあとcsa→ki2変換は柿木将棋を使います。これで自分の好きなファイル名で好きな形式で棋譜を保存することができました。
最後に既存の取得済み棋譜との重複をチェックするソフト(バイナリ比較ソフト)を入れておいたほうがいいかも知れません。フリーソフトでいっぱいあります。棋譜データベースには重複チェックの機能があるのでそれを使ってもいいと思います。
ダウンロードしたCSVファイル(取得リスト)も捨てないで取っておけば次回作業する際の目安になります。
一連の作業の動画
それではこれまでの作業の動画をおいて置きます。インパクトを狙うなら動画をトップに持って来るべきでした。まあ棋譜採りなどというマニアックな事はやらない人はやらないので。一部の人だけに見てもらえばいいと思ってます。
棋譜DB2将棋棋譜取得作業①
棋譜DB2将棋棋譜取得作業②
棋譜DB2将棋棋譜取得作業③
棋譜DB2将棋棋譜取得作業④
まとめ
あと記事を見返してみて全体的に秀丸よりの操作になっていると感じました。それぞれの作業がWebScraperが3、HiMacroEXが3、秀丸が4ぐらいの配分でしょうか?これは秀丸が優れたソフトでテキストデータを扱いやすいことと、私が以前、印刷会社に勤めていたときに文書編集に秀丸をよく使っていたために慣れているからだと思います(印刷会社では長い文章はイラストレーターなどに流し込む前にテキストエディタで整形する)。なのでこの配分は個人によって手段が変動すると思います。例えばエクセルのエキスパートならほとんどの作業を関数やVBA(エクセルのマクロ)を使ってやる感じなのかも知れません。あとプログラミング知識のある人ならスクリプト組んでやるでしょうしそのほうが正確だと思います。理想の世界を自分の手で作っていく能力は憧れですが私はもう覚えるよりも忘れるスピードのほうが早いのでプログラミングはキツいです。
それより今、考えていることは大量の棋譜の活用法です。例えばコンピュータ将棋研究Blogのsuimonさんはコンピュータ将棋の豊富な実戦例を活用されて「コンピュータ発!現代将棋新定跡」を執筆されました。プロ間では一局ごとに新手は出るし、例えば相掛かりなどは数年前とは別物になっていて移り変わりが余りに早く、正直アマチュアに覚える意味があるのか疑問だったのですが、これはコンピュータ将棋を参考にしたということで興味をそそられる内容です。この本をきっかけに最新定跡を学習できるはずです。ただ個人的に興味あるのはどちらかというと本の構成とかfloodgate棋譜の活用法です。棋書も長らく購入してませんでしたがこれは今から楽しみな本です。
例えば以下の話は推測であり妄想です。かなり昔の話ですが七冠王を取った頃の羽生さんが「将棋の終盤は、八百幾つかのパターンに類型化できる」と言っていたことがありました。当時は?と思ってましたが最近、floodgateの棋譜を眺めていると終盤の類型化は出来なくもないと感じます。というか当時羽生さんはパソコンを使ってそれをやっていたかも知れない。あくまでも妄想です。名著の金子タカシ氏の「寄せの手筋200」みたいな感じで寄せだけでなくもっと総合的な戦術、例えば「自玉をZにして勝つ」「攻めを受け切って勝つ」「と金を寄せて勝つ」「駒得を活かして勝つ」「細い攻めを繋げて勝つ」「相手玉を囲いから上部に追い出して勝つ」「入玉して勝つ」みたいにしてfloodgate棋譜から分類できるのではと。あまり細分化すると訳が分からなくなるから200ぐらいに留めたほうがいいんでしょうか。自動で抽出するプログラムも作れるのかも知れないけど、この部分はAIにやらせるより人間がやったほうが楽しい気がしてます。チームでやったらもっと楽しいでしょうね。
自然界のリスはドングリを集めて隠した場所を忘れるそうですが、棋譜を集めることもリスがドングリを集める事に似ていて集めるだけで活用されなければ意味がないとも言えます。まあ無理に意味を求めなくても大量の棋譜を眺めてニヤニヤしたりウットリしたりしてもいい訳ですが。リスもそんな感じでドングリを集めているかも知れませんし。でもその中に例えば「森を広げるプロジェクト」を考えたリスがいて一日に1個のドングリを意識的に毎回違った場所に埋めれば将来、森はドングリの木で一杯になり自分の子孫の繁栄に繋がります。そのリスが「棋譜でーたべーす」や「棋譜DB2」の管理人さんなのかも知れません。