見出し画像

デッキ名自動生成マシーンを作ってみた

はじめに

とある日、いつものように Twitter を監視する業務に没頭していると、みれ (@milles_ptcg) さんのツイートが目に留まりました。

記事を読んでみると、いくつかのルールをもとにポケモンカードのデッキ名を自動生成するアルゴリズムのお話でした。
デッキ名の自動生成は「ポケモンカード×データサイエンス」のお題としてとても魅力的で、“これは自分でもやってみなきゃならねぇ!”と意気込んだわけです。

デッキの命名規則を整理する

「ヒトカゲとともだちデッキ」のようなユニークなデッキ名が溢れていた時代はどこへやら、近年は「レシリザリザテル(レシラム&リザードンGX/リザードン&テールナーGX)」のように、代表的なカードの名前を並べてデッキ名とするのが慣習のようです。

参考:【ありがとう平成】現代のデッキの名前を1990年代っぽくしてみた

“代表的なカードの名前を並べる”といった方針をベースに、私の独断と偏見により、デッキ名としてピックアップするカードの選定基準を考えてみました。

(1) 1~3種類のポケモン(+1種類のトレーナーズ/特殊エネルギー)
(2) 役割を問わず、採用枚数が多いカード
(3) (2) のうち、以下のカードは除く
    a. どのデッキにも採用されている汎用カード
    b. 進化ポケモンの進化前として採用されているカード
(4) 採用枚数は多くないが、差別化要素になるカード

(1) デッキごとにデッキ名に含めるポケモンの数はまちまちで、そのデッキを代表するポケモンの種類により、1種類のもの(「ミュウミュウ(ミュウツー&ミュウGX)」など)から3種類くらい(「ルガゾロペル(ルガルガンGX/ゾロアークGX/ペルシアンGX)」など)までの幅があります。

デッキ名にトレーナーズを含む例には、「ルミタン」などのバトルシャトレーヌを採用した「シャトレック(バトルシャレーヌ/レックウザGX)」や、ドロー系サポートのかわりに「ブルーの探索」で展開する「ブルー型●●」デッキなどがあります。
特殊エネルギーの例としては、「カウンターエネルギー」を積極的に活用する「カウンター型●●」の他、「レインボーエネルギー」による多色構築もその一つといえそうです。

(2) デッキを代表するカードがピン差し(1枚採用)なんてことはそうそうなく、採用枚数が比較的多いことがほとんどです。
デッキ名に含めるか否かにカードの役割はあまり関係なく、バトル場で活躍するメインアタッカー(「レシラム&リザードンGX」など)だけでなく、ベンチに広げるエネルギー加速要員(「カラマネロ」など)やドローエンジン(「ゼブライカ」など)も対象になり得ます。

(3) 一方、「カプ・テテフGX」「ジラーチ」のような、あまりにも頻繁に使われているカードは、デッキ名に含まれにくい傾向があります。
また、進化ポケモンを場に出すことを目的に採用されている進化前のポケモンについても、特段の理由がなければ省略するのが自然といえそうです。

(4) 同じ「ゾロアークGX」メインのデッキでも、「ジュゴン」「ユキメノコ」のように1~2枚だけ差されたカードによって、そのデッキの特色が出てくることもあります。
そういった意味では、差別化要素になるカードは、採用枚数が少なくともデッキ名に取り入れたいところです。

カードの代表的っぽさを計算する

上で定めた選定基準を満たすカードを代表的っぽいとしたとき、デッキに採用されている各カードについてどれだけ代表的っぽいかを示すスコアを計算できればデッキ名を生成できそうです。

このような計算には、ずばり情報検索やトピック分析の分野で用いられる TF-IDF が使えそうだと考えました。

TF-IDF による特徴語の抽出

Wikipedia によれば、

tf-idfは、文書中に含まれる単語の重要度を評価する手法の1つであり、(中略)tf(英: Term Frequency、単語の出現頻度)とidf(英: Inverse Document Frequency、逆文書頻度)の二つの指標に基づいて計算される。
(中略)idfは一種の一般語フィルタとして働き、多くの文書に出現する語(一般的な語)は重要度が下がり、特定の文書にしか出現しない単語の重要度を上げる役割を果たす。

とあります。

TF-IDF の具体的な定義には様々なバリエーションが見られますが、機械学習ライブラリの scikit-learn に実装されている TF-IDF は、以下の数式で表されます。

画像1

すなわち、ある文書 d について TF-IDF が大きくなる単語 t とは、(A) 文書 d に数多く出現し(B) 単語 t が出現する文書自体は少ないものである、と言い換えることができます。

例えば、ある小説に含まれる各単語の TF-IDF を計算すれば、TF-IDF の値が大きいものから順に、その小説を特徴づける単語として取り出すことができます。

✓ ミステリー ⇒「トリック」「殺人」「犯人」など
✓ SF ⇒「人工知能」「アンドロイド」「火星」など
✓ 学園モノ ⇒「高校」「先輩」「文化祭」など

TF-IDF では、単に出現頻度の高い単語(「私」「男」「はい」など)を並べるのではなく、どの小説にも共通して出現する単語の優先順位を下げ、「トリック」「人工知能」「高校」のような特徴的な単語に重きが置かれるように工夫されています。

参考:【python】TF-IDFで重要語を抽出してみる

ポケモンカードへの適用

TF-IDF をポケモンカードの世界に取り入れると、以下のようになります。

ある文書 d について TF-IDF が大きくなる単語 t とは、(A) 文書 d に数多く出現し(B) 単語 t が出現する文書自体は少ないものである。

あるデッキ d について TF-IDF が大きくなるカード t とは、(A) デッキ d に数多く採用され(B) カード t が採用されたデッキ自体は少ないものである。

上で挙げたカードの選定基準のうち、(2) については (A) で、(3a) と (4) については (B) で網羅できているといえます。
また (1) については、各カードを TF-IDF の大きい順に並べ替え、ポケモンとトレーナーズ/特殊エネルギーとでそれぞれ別の閾値(足切りライン)を設けることで対応できそうです。
残る (3b) については、後述するルールによって進化前のポケモンを取り除くこととしました。

デッキ名自動生成マシーン

TF-IDF を計算するには、デッキ名を名付けたいデッキだけでなく、なるべく多くのデッキをかき集めておく必要があります。
今回は、Twitter からポケモンカードゲーム公式デッキ構築ツールで作成されたデッキコードを含むツイートを収集し、約3,000デッキをデータ化しました。

具体的なアルゴリズムは、以下のようになります。
ソースコードは GitHub に公開しているので、興味がある方は見てみてください。

ⅰ. デッキ名を名付けたいデッキに採用されている各カード (※1) について、TF-IDF を計算する (※2)
ⅱ. TF-IDF が大きいカードから順にデッキ名候補に加え、デッキ名候補にあるカードの総採用枚数が20枚(≠20種類)を超えるまでこれを繰り返す
ⅲ. デッキ名候補に含まれるカードのうち、より TF-IDF が大きい、
    a. ポケモン → 3種類までをデッキ名に含める (※3)
    b. トレーナーズ/特殊エネルギー → いずれか1種類をデッキ名に含める

※1…基本エネルギーを除く。
※2…同名カードは(ワザや特性が違っても)すべて同一のものとして扱い、エキスパンションの違いは無視する。
※3…デッキ名候補内で進化ラインが揃っている場合、進化前のポケモンはデッキ名に含めない。

PJCS 2019 筆者使用デッキ

まずは、6月の PJCS 2019 で筆者が使用したデッキから。
元ツイートではデッキ名を「おしながすサファイザー」としていますが、代表的なカードの名前を並べるとするなら「ヌオー/ファイヤー&サンダー&フリーザーGX」あたりでしょうか。

筆者:ヌオー/ファイヤー&サンダー&フリーザーGX
デッキ名自動生成マシーン:フリーザー/ファイヤー&サンダー&フリーザーGX/ヌオー/ユニットエネルギー草炎水

トレーナーズ/特殊エネルギー枠から「ユニットエネルギー草炎水」がデッキ名に選定されています。
「ファイヤー&サンダー&フリーザーGX」がデッキ名に含まれていれば十分な気もしますが、水単色の「フリーザー/ヌオー」との差別化要素として重要だと判断されたようです。

CL京都 2019 優勝デッキ

せっかくなので、みれ (@milles_ptcg) さんの結果との比較も行ってみたいと思います。

画像2

まとめサイト:レシラム&リザードンGX
みれ (@milles_ptcg) さん:レシラム&リザードンGX/ジラーチ/フーパ
デッキ名自動生成マシーン:レシラム&リザードンGX/ミルタンク/溶接工

2枚採用されているジラーチがデッキ名から外された一方で、ピン差しである「ミルタンク」がデッキ名に含まれました。
「溶接工」との相性がよく、当時の環境にマッチしていた「ミルタンク」の採用は、他の「レシラム&リザードンGX」デッキと一線を画する重要な差別化要素となるので、グッドな命名結果だといえそうです。

CL京都 2019 準優勝デッキ

画像3

まとめサイト:ルカリオ&メルメタルGX/フーパ/アンノーン
みれ (@milles_ptcg) さん:レジギガス/フーパ/ルカリオ&メルメタルGX
デッキ名自動生成マシーン:レジギガス/フーパ/プレイヤーズセレモニー

みれさんの結果と同様、「アンノーン」を抽出できていません。
採用枚数が1枚のみで、「アンノーン」自体はそこまでマイナーなカードではないため、当然の結果といえます。
「アンノーン」の場合、“そのカード自体がゲームの勝利条件になる”という、現行レギュレーションの中でも特異な性質を持っており、採用枚数によらずデッキ名に含めたい人間の直感との乖離が見て取れます。

その他

その他、Twitter から収集したデッキの中から、いくつかピックアップして紹介します。
元のデッキ名が名付けられていないので、比較対象として筆者の方で適当に命名してみました。

画像4

筆者:ジラーチ/サンダー/ウルトラビースト
デッキ名自動生成マシーン:サンダー/ジラーチ/エレキパワー

先ほどの例でデッキ名から外されていた「ジラーチ」ですが、この例ではデッキ名に含まれる結果となりました。
いわゆる「ジラサンUB」デッキだと考えられるため、デッキ自動生成マシーンが「ジラーチ」を無視しなかったのは評価できます。
一方、「ウルトラビースト」らしさは一切抽出することができず、“複数カードの共通要素をデッキ名に含める”パターンにボロ負けした感じです。

画像5

筆者:バトルシャトレーヌ/レックウザGX
デッキ名自動生成マシーン:レックウザGX/ラジュルネ

バトルシャトレーヌの一員である「ラジュルネ」をデッキ名に含んでおり、いわゆる「シャトレック」をうまく再現できています。
ポケモンのカードのみならず、トレーナーズ/特殊エネルギーを扱えるようにしたアルゴリズムの好例といえるでしょう。

画像6

筆者:ミュウツー&ミュウGX/レシラム&リザードンGX
デッキ名自動生成マシーン:ミュウツー&ミュウGX/レシラム&リザードンGX/ユニットエネルギー草炎水

いわゆる「ミュウミュウ」デッキで、他のデッキと比較して非常に多くのGXポケモンがピン差しされているのが特徴です。
デッキ名自動生成ツールが取り上げたポケモンは、「ミュウツー&ミュウGX」「レシラム&リザードンGX」の2種類のみですが、「ユニットエネルギー草炎水」によって、炎タイプ以外の存在を匂わせているのがクールです。

おわりに

いかがでしたか?

個人的には、煩雑なルールベースアルゴリズムに頼ることなく、それなりに納得のいく結果を出すことができ、(良い意味で)枯れた技術の強力さを感じました。
とはいえここがゴールではなく、デッキ名自動生成の試みとしては、以下のような伸びしろが考えられます。

カード間の類似度にもとづく差別化要素の定義

炎デッキにおける「溶接工」や雷デッキにおける「エレキパワー」のような、デッキタイプによっては“採用されて当たり前”なカードは、十分な差別化要素とはいえない、という考え方です。
具体例でいうと、“「フェローチェ&マッシブーンGX」自体はそんなに珍しくないけど、「ヌオー」との組合せは珍しいからデッキ名に含める”とか、反対に“「ヌオー」と「フリーザー」はよく一緒に採用されてるから、「ヌオー/フリーザー」じゃなくて単に「ヌオー」とだけ表記する”みたいなことをしたいと思っています。

進化ラインに関する事前知識(「ヌオー」は「ウパー」から進化する)を与えることなく、(3b) の選定基準を解決できたらより一層スマートですね。

複数カードの共通要素を考慮した採用枚数の評価

上の「ジラサンUB」の例では、採用されているすべての「ウルトラビースト」がピン差しだったために、デッキの「UB」要素を抽出することができませんでした。
“「ウツロイド」が1枚、「マッシブーン」が1枚、…”、と数えるのではなく、“「ウルトラビースト」が合わせて4枚”、というように数えることができれば、このパターンにも対応できる可能性があります。

ワザや特性の名前による表記(カードプールに同名カードが複数ある場合)

上にもしれっと書いていましたが、今回の実験では、同名カード(例えば、「マーシャドー(やぶれかぶれ)」と「マーシャドー(リセットホール)」など)を区別できていません。
データ収集元である公式デッキ構築ツールから簡単に取得できた情報がエキスパンションくらいで、単にエキスパンションで区別するだけでは「カプ・テテフGX」のような再録カードに対応できなかったため、思い切って同名カードをすべて丸め込んだのでした。

また、ワザや特性の違いで同名カードを区別すると、複数カードの共通要素を考慮した採用枚数の評価と同じ問題にハマってしまうおそれがあると考えました。
上の問題を解決できた暁には、同名カードを区別して再検証したいと思います。

最後までお読みいただき、ありがとうございました!

この記事が気に入ったらサポートをしてみませんか?