読者です 読者をやめる 読者になる 読者になる

TadaoYamaokaの日記

山岡忠夫 Home で公開しているプログラムの開発ネタを中心に書いていきます。

将棋でディープラーニングする

先日の日記で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

というエラーが表示されて、インストールできなかった。

ソース(python-shogi-1.0.1.tar.gz)をダウンロードしてきて、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]))

以上のようにして、教師データの準備ができる。

本日はここまで。
次回、方策のニューラルネットワークを記述する予定。