Magic: The Gathering + word2vec = "card2vec" 〜M:TGで自然言語処理〜
概要
最近word2vecという単語のベクトル表現を学習して単語の意味を足したり引いたりできるものが流行っていて面白そうだったので試しにMagic: The Gatheringについて学習させてみました.card2vecは勝手に作った造語です.
手順
自然言語処理をなにも知らない私がword2vecを走らせるまで: 最尤日記,自然言語処理の最新手法"word2vec"で艦これ加賀さんから乳を引いてみる - あんちべ!を参考にしました.
2. M:TGについて書かれた文章を用意する
とりあえず以下の3つをwget -rとか使いながらダウンロードして,タグなどを消して必要そうなところ(MTG Wikiなら記事の本文,Astral Guildと2chは各書き込みの本文)だけ抽出しました.
- MTG Wikiの記事(/wiki/以下)
- Astral Guildの書き込み(フリートークとデッキ診断)
- 2chのTCG板のMTG関連スレの書き込み(スレタイに【MTG】と入ってるものをunkar.orgから)
これらを繋げた文章(分かち書き前)のサイズが400MBくらいでした.
3. MeCabのユーザー辞書を作る
MeCabのデフォルト辞書には当然M:TG用語は入っていないため,そのままだと単語の区切りがおかしくなりますし,なによりカード名を1つの単語として認識させたかったので,それらが入ったユーザー辞書をMTG Wikiの記事タイトルから作成しました.mecabの辞書に新しい単語を登録する方法 - Hive Color,MeCab: 単語の追加方法などを参考にしました.
基本的に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
テーロスの高額神話レア?