Magic: The Gathering + word2vec = "card2vec" 〜M:TGで自然言語処理〜

概要

最近word2vecという単語のベクトル表現を学習して単語の意味を足したり引いたりできるものが流行っていて面白そうだったので試しにMagic: The Gatheringについて学習させてみました.card2vecは勝手に作った造語です.

手順

自然言語処理をなにも知らない私がword2vecを走らせるまで: 最尤日記自然言語処理の最新手法"word2vec"で艦これ加賀さんから乳を引いてみる - あんちべ!を参考にしました.

1. 必要なソフトウェアをインストールする
2. M:TGについて書かれた文章を用意する

とりあえず以下の3つをwget -rとか使いながらダウンロードして,タグなどを消して必要そうなところ(MTG Wikiなら記事の本文,Astral Guildと2chは各書き込みの本文)だけ抽出しました.

これらを繋げた文章(分かち書き前)のサイズが400MBくらいでした.

3. MeCabのユーザー辞書を作る

MeCabのデフォルト辞書には当然M:TG用語は入っていないため,そのままだと単語の区切りがおかしくなりますし,なによりカード名を1つの単語として認識させたかったので,それらが入ったユーザー辞書をMTG Wikiの記事タイトルから作成しました.mecabの辞書に新しい単語を登録する方法 - Hive ColorMeCab: 単語の追加方法などを参考にしました.

基本的にMTG Wikiの記事名を機械的に単語として登録し,日本語名と英語名が併記してあるもの(例:極楽鳥/Bird of Paradise)はさらに両方を登録するようにしました.コストの設定はよくわからなかったので,とりあえず使われやすいように小さい値1を設定してしまいました.後のために,原形のカラムには日本語名を持つものは日本語名を,英語名のみのものは半角スペースを_に置き換えたものを書いておきます.

"ディミーアのギルド魔道士/Dimir Guildmage",,,1,名詞,一般,*,*,*,*,"ディミーアのギルド魔道士",*,*
"ディミーアのギルド魔道士",,,1,名詞,一般,*,*,*,*,"ディミーアのギルド魔道士",*,*
"Dimir Guildmage",,,1,名詞,一般,*,*,*,*,"ディミーアのギルド魔道士",*,*
"Underground Sea",,,1,名詞,一般,*,*,*,*,"Underground_Sea",*,*
4. MeCabで文章を分かち書きする

word2vecは単語が半角スペースで分かち書きされた文章のみを入力として受け付けるので,作成したユーザー辞書を使って文章を分かち書きします.

"Underground Sea"のような半角スペースを含む単語はそのままでは別の2つの単語として扱われてしまい,好ましくありません.また"ディミーアのギルド魔道士/Dimir Guildmage","ディミーアのギルド魔道士","Dimir Guildmage"の3つは同じ1つの単語として学習したほうが効率的だと思われます.分かち書きの前に置換処理をしても良いですが,ここでは分かち書きの際に単語を全て原形に変換してしまうことにしました.

# content.txtをユーザー辞書mtg.dicを使って分かち書きする.単語は原形に直す.
cat content.txt | mecab -u mtg.dic --node-format="%f[6] " --eos-format="\n" > wakati.txt
5. word2vecで学習する

windowの値はデフォルトでは5ですが倍の10にしてみたら精度が少し向上したように感じました.

./word2vec -train wakati.txt -output mtg.bin -window 10 -binary 1
6. 遊ぶ
./distance mtg.bin

として好きな単語を入力するとそれに近いものを表示してくれます.

./word-analogy mtg.bin

として好きな単語を3つ,スペース区切りでA B Cのように入力すると,B-A+Cに近いものを表示してくれます.

結果

M:TG的に)わかりやすい結果だけ載せます.

ノワールのエルフ - クリーチャー + エンチャント =
                                              Word              distance
------------------------------------------------------------------------
                                              繁茂		0.620990
                                        肥沃な大地		0.612975
                                ブランチウッドの鎧		0.605195
                                              怨恨		0.584213
                                        不屈の自然		0.580197

繁茂と肥沃な大地.マナの出るエンチャント.

飛行 - 青 + 黒 =
                                              Word              distance
------------------------------------------------------------------------
                                              絆魂		0.794237
                                              接死		0.784229
                                              威嚇		0.772298
                                          先制攻撃		0.772254
                                        トランプル		0.761075

Top3がまさに黒の得意な能力.

神の怒り - 白 + 黒 =
                                              Word              distance
------------------------------------------------------------------------
                                              滅び		0.871883
                                          突然の死		0.832915
                                              恐怖		0.831339
                                        不敬の命令		0.824064
                                その場しのぎの人形		0.818364

1位は期待通りの黒い神の怒り.

Wood Elemental - クリーチャー + 土地 =
                                              Word              Distance
------------------------------------------------------------------------
                                リスティックの洞窟		0.637866
                                     Sorrow's_Path		0.625077
                                        蒼ざめた月		0.611142
                                  隕石のクレーター		0.601391
                                    テフェリーの島		0.600804

ひどい土地がぞろぞろ.蒼ざめた月は土地ではないが土地が絡んでいるので間違いとも言えない?

アトランティスの王 - マーフォーク + キスキン =
                                              Word              Distance
------------------------------------------------------------------------
                                        聖なるメサ		0.725760
                                      皺だらけの主		0.711722
                                  川の案内者、シグ		0.709027
                                  思考の糸の三人衆		0.708851
                                            動員令		0.706689

キスキンのロードは惜しくも2位.

恐怖 - 黒 + 青 =
                                              Word              Distance
------------------------------------------------------------------------
                                          霊魂放逐		0.810830
                                          神の怒り		0.789171
                                      使い魔の策略		0.782109
                                        妖精の計略		0.777077
                                      海賊の魔除け		0.771080

青にとっては打ち消し=除去.神の怒りも青いデッキで使われるので理解できなくはない.

復活の声 - ドラゴンの迷路 + テーロス =
                                              Word              Distance
------------------------------------------------------------------------
                            太陽の勇者、エルズペス		0.692638
                                嵐の息吹のドラゴン		0.674960
                                            波使い		0.657235
                              ヴィズコーパの血男爵		0.656863
                                      ワームの到来		0.656152

テーロスの高額神話レア?

嬉しさ

自分がやったこと自体はただの人の真似と暇つぶしでしかないですが,TCGのカードの良いベクトル表現が得られると次のような嬉しさがあるのではないかと思います.

  • カード検索やリコメンデーションに使え,デッキ作成支援等に役立つ
  • カードの能力について人間のような抽象化能力を持ったAIが作れる

特にTCGのAIはあまり研究が進んでいない分野だと思うので期待したいところです.