先日の日記で1行もコードを書かずに、将棋におけるディープラーニングについて考察した。
コードを書いて実験しないとただの机上の空論になるのでコードを書いて検証してみたいと思う。
といっても、将棋のプログラムの実装は行ったことがない。
一からコードを書くのはしんどいので、とりあえず使えるライブラリを探して使用していきたいと思う。
python-shogiのインストール
Pythonでディープラーニングのフレームワークを使用したいので、Pythonで扱えるライブラリがよい。
Python向けの将棋のライブラリとして、python-shogiが見つかった。
pypi.python.org
pipからインストールが可能になっている。
pip install python-shogi
でインストールできる。
しかし、Windowsでインストールしようとすると、
UnicodeDecodeError: 'cp932' codec can't decode byte 0x81 in position 2239: illegal multibyte sequence
というエラーが表示されて、インストールできなかった。
GitHubからリポジトリをクローンしてきて、setup.pyの25行目を以下の通り編集(「, encoding='utf-8'」を追加)し、
description = open(os.path.join(os.path.dirname(__file__), 'README.rst'), encoding='utf-8').read()
pip install --no-cache-dir -e .
でインストールした。
GitHubにプルリクエストを送ったので、そのうち修正してもらえるかもしれない。(※2017/4/9 マージしていただきました。)
棋譜のスクレイピング
棋譜サイトから棋譜のデータをスクレイピングして集める。
使用した棋譜サイトは、直リンクでは棋譜がダウンロードできず、ボタンクリックをしてCSA形式で棋譜データが表示できるようになっていたので、SeleniumとPhantomJSを使用して棋譜データを抽出した。
from selenium import webdriver driver = webdriver.PhantomJS(executable_path='C:/bin/phantomjs-2.1.1-windows/bin/phantomjs.exe') driver.get('https://xxxxxxx') driver.implicitly_wait(10) csa_export = driver.find_element_by_id('xxxxx') csa_export.click() csa_txt = driver.find_element_by_css_selector('xxxx').text
このような感じに記述することで取得できる。
棋譜の再生
取得したCSA形式の文字列を、python-shogiで再生する。
import shogi import shogi.CSA kifu = shogi.CSA.Parser.parse_str(csa_txt)[0] moves = kifu['moves'] board = shogi.Board() board.push_usi(moves[0]) board.push_usi(moves[1]) board.push_usi(moves[2]) ...
盤の駒は以下のようにして取得する。
board.piece_at(shogi.I4)
持ち駒は以下のようにして取得する。
hand = board.pieces_in_hand hand_b = hand[shogi.BLACK] # 先手 for p in hand_b.keys(): print("piece: {0}, num: {1}".format(shogi.Piece(p, shogi.BLACK).symbol(), hand_b[p]))
以上のようにして、教師データの準備ができる。
本日はここまで。
次回、方策のニューラルネットワークを記述する予定。