見出し画像

遊戯王カード14,000枚を自然言語処理するCLI「YGONLP」を2日で作った

この記事で分かること

この記事では,約14,000枚の英語版遊戯王カードを対象に,自然言語処理とデータ分析を用いて以下の問いを調べます.

  • 遊戯王カードのテキストは本当に長くなっているのか

  • 年代によってcandidate TCG first-appearance countは変化しているのか

  • 似た効果テキストを持つカードを検索できるのか

  • 遊戯王カードにはどのような語彙パターンが存在するのか

  • テキスト長とカード価格には関係があるのか

使用したコードは,再現可能なCLI研究プロジェクト「YGONLP」として構築しています.

結論:14,000枚を解析して見えたこと

既存の年別集計は,英語版効果テキストの平均的な長さが後年ほど高い年が多いことを示します.ただし年ごとの値は一様ではありません.同じdatasetで集計したcandidate TCG first-appearance countも年によって変動し,単調な増加ではありません.さらに,TF-IDF類似検索は共通の語彙・定型表現を持つカードを探索でき,価格snapshotではテキスト長と価格の明確でvendorをまたぐ一貫した関係は確認できませんでした.

これらは,対象datasetにおける文章量,candidate TCG first appearance,語彙,価格snapshotの記述的・探索的な観察です.カードの強さ,ゲーム上の難しさ,変化の原因,価格の原因を示すものではありません.2026年は途中年であり,通年との比較には用いません.

以下では,まず何を対象にしたかと年別の分析結果を示し,その後に再現方法と実装上の設計を説明します.

何を調べたか

はじめに

遊戯王には,20年以上にわたって追加され続けてきた大量のカードデータがあります.

カード名,効果テキスト,種類,発売時期などの情報は,自然言語処理やデータ分析の対象として見ることができます.

しかし,例えば,

最近の遊戯王はテキストが長くなった

という感覚的な話は,実際にどの程度正しいのでしょうか.

そこで,感覚ではなく再現可能な形で検証するために,英語版遊戯王カード約14,000件を対象としたCLI研究プロジェクト「YGONLP」を作成しました.

なぜ作ったのか

きっかけは,

最近の遊戯王カードはテキストが長くなっているのではないか?

という素朴な疑問でした.

しかし,このような話題はコミュニティでは頻繁に語られる一方で,定量的な検証を見る機会は多くありません.

そこで,以下のような目的でプロジェクトを開始しました.

  • 「最近の遊戯王はテキストが長い」という感覚を検証する

  • 遊戯王カードを自然言語処理の対象として扱えるか試す

  • 一度きりの分析ではなく,再実行可能な研究環境を作る

  • 欠損値や日付定義を曖昧にせず,分析結果を説明可能にする

目的は「遊戯王の強いカードを予測する」ことではありません.

カードテキストという言語データそのものを対象に,どのような変化や特徴が存在するのかを調べることが目的です.

最初の研究課題

YGONLPで最初に設定した問いは,次のものです.

英語版遊戯王カードの効果テキストのLength Metricsは,時系列でどのように変化してきたか.

ここで重要なのは,「長いテキスト=複雑なカード=強いカード」とは限らないという点です.

本プロジェクトでは,「複雑性」を複数の観点に分けて考えています.

Length Metrics

まず,最も基本的な指標として,テキスト量を測定します.

  • Character count(文字数)

  • Word count(単語数)

  • Sentence count(文数)

これは「どれくらい長い文章なのか」を測るための指標です.

Surface Complexity Metrics

次に,表面的な文章構造を測定します.

例:

  • コロンの数

  • セミコロンの数

  • 括弧の数

  • `once per turn` のような定型表現の出現数

これらは遊戯王特有の効果記述形式を分析するための指標です.

Structural Metrics

さらに,文章内部の構造にも注目します.

例:

  • 条件(condition)

  • コスト(cost)

  • 対象(target)

  • 処理(resolution)

同じ文字数のカードでも,単純な効果と複数段階の処理を持つ効果では構造が異なります.

ただし,本記事で数値として報告するテキスト分析はLength Metricsだけです.Surface Complexity MetricsとStructural Metricsは概念・今後の拡張候補であり,現行の分析結果や図からそれらの複雑性を測定したとは主張しません.

Surface Complexity MetricsやStructural Metricsについては,今後さらに発展させる余地があります.

また,本記事で扱う分析結果について,以下の点には注意が必要です.

  • テキスト長はカードの強さを意味しない

  • テキスト長は実際の裁定難易度を直接表さない

  • 時系列分析は年別の記述統計であり,因果関係や設計上の理由を証明するものではない

つまり,YGONLPが答えようとしているのは,

「最近のカードは強いのか?」

ではなく,

「遊戯王カードという文章データは,時代とともにどのように変化してきたのか?」

という問いです.

使用したデータ

初回取得時のraw datasetは以下の規模でした.

  • 総レコード数:14,468件

  • `tcg_date` が存在するレコード:13,993件

  • `tcg_date` 欠損レコード:475件

図の分析母集団

raw datasetの全レコードが,そのまま各図の母集団になるわけではありません.まず前処理のtarget policyにより効果テキスト分析の対象を選び,measurementでは13,431件の測定recordを得ました.このうち,年別の2図ではUTC cutoff(2026-07-17)までに有効な`tcg_date`を持つ13,179件を集計しています.`tcg_date=null`の234件とcutoff後の日付の18件は,欠損日付を推測せずに年別集計から除外し,metadataに件数を記録しています.

従って,図が示すのは「英語版効果テキストの測定対象のうち,TCG初出候補年を確認できるカード」の年別記述値です.全収集レコード,全印刷,全再録,または公式発売履歴の完全な母集団を表すものではありません.

Length Metricsを使う分析1・2はこのmeasurementを入力にします.一方,分析3〜5は前処理済みの14,468件を入力にし,それぞれの目的に応じて空・tokenなしdocumentなどを除外します.分析6は価格snapshotとmeasurementを`card_id`で結合するため,対象数はvendor×card観測数になります.このため,各分析の件数は同じ母集団を表すものではありません.

時系列分析では,カードの初出時期として `tcg_date` を利用しました.

ただし,これは「公式の完全な発売日一覧」ではありません.

本プロジェクトでは,

採用したTCG set情報に基づくTCG初出候補日

として扱っています.

そのため,以下のような処理は行っていません.

  • 欠損した日付の推測

  • 架空の日付による補完

  • OCG初出日へのfallback

  • reprint日や再収録日の利用

不完全なデータを無理に埋めるよりも,「分からないものは分からないまま保持する」ことを優先しました.

分析結果

分析1:カードテキストは長くなっているのか

最初に調べたかったのは,多くのプレイヤーが感じている,

「最近の遊戯王カードはテキストが長くなったのではないか」

という疑問です.

ただし,人間の記憶や印象だけでは,正確な比較はできません.

そこで,英語版カードテキストをデータとして扱い,TCG初出候補年ごとに文章量を比較しました.

観察(Observation)

有効な`tcg_date`を持つ13,179件の測定recordでは,平均`character_count`は2002年の134.138973(331件)から,2010年の203.705373(577件),2020年の417.811765(680件),2025年の471.045714(525件)へと高くなっています.年ごとの変化は一様ではないものの,後年にはより高い平均文字数の年が多く,長期的なテキスト長の増加傾向が観察されます.2026年は途中年の479.229064(406件)です.

解釈(Interpretation)

この観察は,「最近のカードはテキストが長い」という印象を,カード単位の文章量として検討できる形にします.文字数・単語数・文数を並べて見ることで,単一の表記だけに依存せず,時代ごとの文章量を記述できます.一方,Length Metricsは文章量の指標であり,効果処理の複雑さ,カードの強さ,裁定難易度を直接測るものではありません.

方法(Method)

指標

今回の分析では,まずLength Metricsを利用しました.

対象とした指標は以下です.

  • `character_count`

    • 効果テキストの文字数

  • `word_count`

    • 単語数

  • `sentence_count`

    • 文数

単純に文字数だけを見るのではなく,複数の指標で同じ傾向が現れるかを確認します.

集計

カードごとの測定結果を,`tcg_date`から取得したTCG初出候補年ごとに集計しました.

比較では平均値だけではなく,

  • median(中央値)

  • minimum / maximum

  • q1 / q3(第1・第3四分位数)

  • population standard deviation

も確認しています.

これらは各年の分布を要約する記述統計です.年ごとのカード構成やサンプル数の差を調整した推定,仮説検定,因果効果ではありません.短い効果のカードから非常に長い効果を持つカードまで幅広く存在するため,平均値だけで分布全体を代表させないようにしています.

図1:TCG初出候補年ごとの平均`character_count`.対象は有効な`tcg_date`を持つ測定recordであり,2026年はUTC cutoff(2026-07-17)時点の途中年である.

図は上の観察の年別内訳を示します.2026年は途中年のため,通年値との比較には用いません.

この図は年別の記述統計であり,テキスト長が変化した原因や,カードの強さ・ゲームの複雑さとの因果関係を示すものではありません.

この観察で分かること

この分析によって,以下のような傾向を確認できます.

  • 効果テキストの平均的な長さが時代によって変化したか

  • 文字数・単語数・文数で同じ傾向が見られるか

  • 特定年代で急激な変化が存在するか

  • カード種別によって違いがあるか

例えば,

「文字数だけが増えているのか」

それとも,

「文章量以外の構造指標も変化しているのか」

を将来検討するための基礎データになります.現行のLength Metricsだけから,文章構造の複雑化を結論づけることはできません.

この分析だけでは分からないこと

一方で,この分析だけから以下を結論づけることはできません.

  • テキストが長いカードほど強い

  • 最近のカードほど難しい

  • 最近のカードほど競技性が高い

  • テキスト長増加の原因

  • テキスト長と売上・人気の因果関係

文章量の変化と,ゲームデザインや競技環境の変化は別の問題です.

YGONLPが示すのは,

遊戯王カードという文章データが,時間とともにどのように変化してきたか

という記述的な分析結果です.

分析2:candidate TCG first-appearance countはどう変わったか

テキスト長の変化を見る際,もう一つ考える必要がある要素があります.

それは,

そもそも1年間に何枚のカードが登場しているのか

という点です.

例えば,ある時代にテキストが長くなっていたとしても,それが

  • 1枚あたりの文章量が増えた結果なのか

  • 大量のカード追加によって構成が変化した結果なのか

は分けて考える必要があります.

そこで,YGONLPではカードテキストの長さだけではなく,年ごとのcandidate TCG first-appearance countについても分析しました.ここで数えるのは,商品数や印刷数ではなく,採用した日付定義に基づく初出候補です.

観察(Observation)

同じ13,179件の年別集計では,candidate TCG first-appearance countは2002年に331件,2010年に577件,2020年に680件,2025年に525件でした.2020年の値が2025年を上回るように,年別件数は変動しており,後年ほど一貫して増える系列ではありません.2026年の406件は途中年の値です.

解釈(Interpretation)

この系列は,テキスト長の年別変化を,その年にdatasetで観測されるcandidate first appearancesの件数と併せて読むための文脈を与えます.文章量の増加傾向とcandidate countの変化を混同しないために有用です.ただし,年別件数だけからテキスト長の変化の原因を分離・特定することはできません.

方法(Method)

指標

`analyze-releases`では,TCG初出候補年ごとに以下を集計します.

  • `release_count`

    • その年に初出候補となるカード数

  • `cumulative_release_count`

    • その年までの累積カード数

さらに,

  • 年 × `card_type`

による内訳も確認できます.

集計

カードごとの`tcg_date`から年を取得し,年単位で集計します.

ただし,ここでも日付情報を無理に補完しません.

以下のカードは別途記録します.

  • `tcg_date`が存在しないカード

  • 現在日時点で未来の日付を持つカード

  • 現在年の途中までのデータ

特に現在年については,1年分のデータが揃っていないため,

partial year(途中年)

として扱います.

図2:TCG初出候補年ごとのoverall `release_count`.斜線の2026年はUTC cutoff(2026-07-17)までの途中年であり,他年との年間件数比較には注意が必要である.

図は上のcandidate countの年別内訳を示します.2026年は途中年の406件であり,他のfull yearと同列には比較しません.

この件数は,採用した`tcg_date`に基づくdataset上のcandidate TCG first-appearance countであり,総カード供給量,printing数,reprint数,公式release volume,テキスト長変化の原因を示すものではありません.

この観察で分かること

この分析によって,以下を確認できます.

  • dataset上でcandidate TCG first-appearance countがどう変化したか

  • テキスト長の年別変化を,同じdataset上のcandidate countと併せて記述できるか

  • 特定のカード種別が増加しているか

例えば,

「最近のカードは長文化した」

という結果が得られた場合でも,

  • カード1枚あたりの文章量が増えた

  • 登場カード数そのものが増えた

という2つの可能性があります.

release count分析は,この2つを混同しないための文脈を与えます.ただし,年別件数だけでテキスト長変化の原因を分離・特定することはできません.

この分析だけでは分からないこと

ただし,この分析はあくまでdataset上の初出候補数です.

以下を意味するものではありません.

  • 商品の発売回数

  • ブースターパック数

  • 個別printing数

  • reprint数

  • 公式release eventの完全な再現

  • 将来のカード追加数

また,`tcg_date`は採用したTCG set情報に基づく初出候補日であり,公式データベース全体の完全な発売履歴そのものではありません.

そのため,この分析は,

遊戯王カードデータセット上で,candidate TCG first-appearance countがどのように変化したか

を見るためのものです.

分析3:似た効果テキストを探す

遊戯王カードには,似たような効果処理や文章表現を持つカードが数多く存在します.

例えば,

  • 同じような条件文を持つカード

  • 同じ召喚方法に関係するカード

  • 過去カードを参考に作られたようなカード

などです.

しかし,14,000枚以上のカードを人間がすべて比較することは現実的ではありません.

そこで,自然言語処理の手法を利用して,

効果テキストの文章として近いカードを検索できるか

を試しました.

観察(Observation)

既存の検索では,`Astrograph Sorcerer`(card ID `76794549`)に対し,`Chronograph Sorcerer`がraw cosine similarity 0.874417で最上位になりました.続く上位結果にもPendulum関連カードが含まれます.この出力は,queryと結果が共有する重み付き語彙や定型表現を具体的に確認できる例です.

解釈(Interpretation)

14,000枚以上の文章から,人間が手作業では探しにくい「似た表現を持つカード」をたどる入口になります.ただし,高いscoreは似た語彙パターンを表すだけで,同一の効果,同じ戦略上の役割,相互に使えるカードであることを意味しません.

方法(Method)

類似検索には,TF-IDFとcosine similarityを利用しました.

処理の流れは以下です.

  1. queryカードを含む候補カードの正規化済み効果テキストを,lowercaseしたword unigramのTF-IDFベクトルへ変換する

  2. queryベクトルと各候補ベクトルのcosine similarityを計算する

  3. query自身と空テキストを除き,正のscoreを高い順(同値は`card_id`昇順)に返す

使用した設定は以下です.

  • TF-IDF Vectorizer

  • word unigram

  • Unicode対応token pattern

  • lowercase有効

  • L2 normalization

  • IDF smoothing有効

  • sublinear TFは無効

この表現は語の重みづけに基づく語彙的な検索であり,意味ベクトル,ルール処理の同一性,カード間の全組合せを意味的に比較するモデルではありません.

入力母集団と除外

この例の入力は前処理済みの14,468件です.query自身と空テキストを除外し,正のraw cosine similarityを持つカードから上位20件を返しています.`tcg_date`は検索の絞り込み条件ではなく,検索結果にrelease statusを付記するためだけに利用しています.

検索条件

CLIでは,カードを指定して検索できます.

例:

ygonlp search-similar \
  --input-metadata <preprocessing-metadata-json> \
  --card-id <card-id> \
  --top-n 10

検索対象は前処理済みJSONLのみを利用します.

そのため,

  • APIへの再アクセスは行わない

  • 同じ入力なら同じ結果になる

  • 生成結果を再現できる

という設計になっています.

結果の読み方

この検索で得られるsimilarity scoreは,

文章としてどれくらい似ているか

を表します.

つまり,

  • 同じ単語を多く共有する

  • 共有する語彙の重みが近い

  • 同じ定型表現を含む

カードほど高いscoreになります.ここで測定しているのはword unigramの重なりであり,語順や構文そのものではありません.

具体例:Astrograph Sorcererを検索する

既存の類似検索出力では,`Astrograph Sorcerer`(card ID: `76794549`)をqueryとして,正のraw cosine scoreが高い順に20件を返しています.

| 順位 | 類似カード | card_type | release status | similarity score |
|---:|---|---|---|---:|
| 1 | Chronograph Sorcerer | Pendulum Effect Monster | released | 0.874417 |
| 2 | Astrograph Sorcerer, the Starfrost Magician | Pendulum Effect Monster | future_dated | 0.639925 |
| 3 | Odd-Eyes Arcray Dragon | Pendulum Effect Fusion Monster | released | 0.636476 |
| 4 | Supreme King Gate Zero | Pendulum Effect Monster | released | 0.635436 |
| 5 | Supreme King Z-ARC | Pendulum Effect Fusion Monster | released | 0.622448 |

この例では,`Chronograph Sorcerer` が最上位でした.scoreは正規化済み効果テキストのword unigram TF-IDFベクトル間のraw cosine similarityであり,語彙や定型表現の重なりを表します.

2位のカードは検索時点のUTC cutoffより後の`tcg_date`を持つため,`future_dated`として表示されています.release statusは検索結果の付帯情報であり,similarity scoreの計算条件そのものではありません.

この順位は,カード効果の同一性やゲーム上の互換性を示すものではありません.特に,上位にPendulum関連カードが並ぶことは,共通の語彙・表現が多い可能性を示すにとどまります.

この分析で分かること

この分析によって,

  • 似た効果文章を持つカード

  • 共通するテンプレート表現

  • 人間が見落としやすい文章上の類似

を発見できます.

大量のカードテキストから,

「このカードと似た文章のカードは何か」

を探索する用途に利用できます.

この分析だけでは分からないこと

一方で,文章の類似度はゲーム上の意味とは一致しません.

この分析結果から,

  • 効果が同じ

  • コンボできる

  • 同じデッキに入る

  • 強さが近い

  • 競技的価値が同じ

とは判断できません.

例えば,同じ「カードを破壊する」という表現を含んでいても,

  • 発動条件

  • 対象

  • タイミング

  • コスト

  • 裁定

によってゲーム上の意味は大きく異なります.

TF-IDFによる類似検索は,

遊戯王カードテキストという文章データの構造を探索するための手法

として利用しています.

分析4:遊戯王で頻出する語彙を調べる

遊戯王カードの効果テキストには,長い歴史の中で繰り返し使われてきた表現があります.

例えば,

  • 特定の処理を表す定型句

  • 多くのカードで共通する単語

などです.

そこで,カードテキスト全体を対象として,

遊戯王の効果テキストでは,どのような単語や表現が頻繁に利用されているのか

を分析しました.

観察(Observation)

英語stopword除去済みのunigram分析では,14,467件の対象documentのうち,`card`は11,326件,`monster`は10,672件,`turn`は8,764件に出現しました.`effect`,`special`,`summon`,`target`も多くのdocumentに現れます.これらは,個別カードの内容ではなく,corpus全体で広く共有される語彙を示します.

解釈(Interpretation)

frequencyとdocument frequencyを分けることで,ある語が少数のカードで繰り返されるのか,多くのカードに分散して現れるのかを区別できます.これは遊戯王カードテキストの文章上の共通語彙を把握するために興味深い一方,頻出語を公式mechanic,重要度,カード強度として読むことはできません.

方法(Method)

語彙分析には,scikit-learnの`CountVectorizer`を利用しました.

対象とする分析は以下です.

  • unigram分析

    • 単語単位の頻度分析

  • bigram分析

    • 2単語の組み合わせ分析

  • document frequency分析

    • 何枚のカードに出現するかの分析

単純な出現回数だけではなく,

「多くのカードに共通して使われる表現」

を見るために,document frequencyも確認します.

stopwordの扱い

遊戯王カードでは,

  • the

  • you

  • this

  • card

のような一般的な語も大量に登場します.

これらは分析目的によってはノイズになるため,

  • stopwordなし

  • stopwordあり

の両方を比較できるようにしています.

stopwordなしでは,実際のカード文章で頻出する表現を見ることができます.

一方,stopwordありでは,より特徴的な語彙を確認しやすくなります.

入力母集団と除外

この全corpus unigram集計の入力は前処理済みの14,468件です.空documentは0件で,tokenization後にtokenが残らない1件を除外し,14,467件を集計しました.年別・`card_type`別の比較はこの出力では行っていません.

具体例:頻出する語彙

既存の英語stopword除去済みunigram分析では,14,467件の対象documentから次の語が高頻度で現れました.ここでのfrequencyはcorpus内の総出現回数,document frequencyはその語を1回以上含むcard document数です.

| 語 | frequency | document frequency | カードテキスト上で示す特徴 |
|---|---:|---:|---|
| `card` | 28,844 | 11,326 | カードそのものを参照する語彙が広く使われていること |
| `monster` | 23,492 | 10,672 | モンスターを参照する語彙が広く使われていること |
| `turn` | 13,502 | 8,764 | ターンを参照する記述が多くのcard documentに現れること |
| `effect` | 11,811 | 7,134 | 効果を参照する語彙が広く現れること |
| `special` | 10,537 | 7,073 | `special`という単語が広く使われていること |
| `summon` | 9,814 | 6,877 | `summon`という単語が広く使われていること |
| `target` | 6,858 | 5,006 | `target`という単語を含む記述が多くのcard documentに現れること |

この表はunigramの集計なので,`special`と`summon`が同じ文脈で連続して現れることまでは示しません.そのような定型句や語順を確認するには,検証済みbigram出力を別途用意する必要があります.

また,頻度が高いことは,その語が公式mechanic分類,ゲーム上の重要度,カードの強さを表すことを意味しません.ここで示しているのは,正規化済み英語カードテキストにおける語彙上の出現パターンです.

この分析で分かること

語彙分析によって,以下のような特徴を調べられます.

  • 遊戯王カードに特徴的な語彙

  • 多くのカードで共有される語彙

  • 単なる頻出語と,多くのdocumentに出現する語の違い

年別やカード種別ごとの語彙傾向を調べるには,groupごとの検証済み出力を別途用意する必要があります.

この分析だけでは分からないこと

ただし,頻出する語が必ずしも重要なゲームメカニクスを表すわけではありません.

この分析だけでは,

  • その語が公式mechanic名であるか

  • その表現がゲーム上重要か

  • その語を含むカードが強いか

  • デッキやテーマとの関係

  • 文脈を考慮した意味

までは判断できません.

語彙分析は,

遊戯王カードという大規模テキスト集合に存在する言語的特徴を探索する手法

として利用しています.

分析5:探索的トピック分析

大量のカードテキストを眺めていると,遊戯王にはさまざまな効果表現のパターンが存在することが分かります.

しかし,14,000枚以上のカード文章を人間がすべて分類することは困難です.

そこで,自然言語処理による探索的手法として,

カードテキスト中に存在する語彙パターンを自動的にグループ化できるか

を試しました.

観察(Observation)

8 topicの既存出力では,Topic 0に`atk`,`fusion`,`monsters`,`card`,`def`が,Topic 1に`card`,`deck`,`hand`,`cards`が,Topic 7に`damage`,`opponent`,`monster`,`card`が現れました.同時に`1`や`s`のようなtokenも上位に含まれます.モデルは,文章集合の中で共起しやすい語の分布を,このような複数のパターンとして出力しました.

解釈(Interpretation)

これは,人手で事前分類していない大規模corpusから,読んで調べるべき語彙上のまとまりを見つける手がかりになります.一方,topicは公式mechanic,archetype,ゲーム上の役割ではありません.数字や単独文字tokenの存在も,結果をゲーム概念として過剰に解釈せず,現在のtokenizationの限界と併せて読む必要を示します.

方法(Method)

トピック分析には,Latent Dirichlet Allocation(LDA)を利用しました.

処理の流れは以下です.

  1. 空・tokenなし文書を除いた正規化済みテキストを,lowercaseしたunigramの`CountVectorizer`でdocument-term count matrixへ変換する

  2. batch learningのLDAに,指定したtopic数・最大iteration・固定random seedを与える

  3. 推定された各topicの上位語と,topic比率が高い代表cardを出力する

使用した手法は以下です.

  • `CountVectorizer`

  • `LatentDirichletAllocation`

  • 固定random seed

  • 指定したtopic数

  • topic index順による出力

固定seedを利用することで,同じ入力・同じライブラリ実装・同じparameterから同じ分析結果を再生成できるようにしています.topicはmodel index順に出力し,公式名や人手による意味ラベルは付けません.

入力母集団と除外

このLDAの入力は前処理済みの14,468件です.空documentは0件で,tokenization後にtokenが残らない1件を除外し,14,467件を8 topicで分析しました.`tcg_date`や`card_type`によるgroup分けは行っていません.

結果の見方

LDAによって得られるtopicは,

「遊戯王公式が定義したカテゴリ」

ではありません.

あくまで,

データ中で共起しやすい単語群

です.

そのため,出力された上位語を読んでもtopicに確定的な名前を与えません.

例えば,

  • 特定の召喚方法に関連する語

  • 特定の処理に関連する語

  • 特定のカード群で頻出する表現

のような特徴が見える可能性があります.

具体例:LDAが出力する語彙パターン

この実行ではtopic数を8に設定しています.以下はmodel topic index `0`,`1`,`7`の出力例です.topic indexはmodelの出力順であり,重要度順や公式分類ではありません.

各topicの上位語はraw component weightの降順,代表カードはそのカードにおけるraw document-topic proportionの降順です.

Topic 0

| 上位語 | raw component weight |
|---|---:|
| `atk` | 0.064518 |
| `fusion` | 0.044133 |
| `monsters` | 0.041155 |
| `card` | 0.040966 |
| `def` | 0.033937 |

| 代表カード | card ID | raw document-topic proportion |
|---|---:|---:|
| Megarock Dragon | 71544954 | 0.970781 |
| Hidden Temples of Necrovalley | 70000776 | 0.958257 |
| Reptilianne Spawn | 21179143 | 0.956171 |

Topic 1

| 上位語 | raw component weight |
|---|---:|
| `card` | 0.072445 |
| `1` | 0.071628 |
| `deck` | 0.070840 |
| `hand` | 0.064345 |
| `cards` | 0.062290 |

| 代表カード | card ID | raw document-topic proportion |
|---|---:|---:|
| Sylvan Komushroomo | 99641328 | 0.975656 |
| Sylvan Lotuswain | 73136204 | 0.974969 |
| Spellbook Library of the Crescent | 40230018 | 0.974249 |

Topic 7

| 上位語 | raw component weight |
|---|---:|
| `damage` | 0.085690 |
| `opponent` | 0.085470 |
| `monster` | 0.080965 |
| `card` | 0.074813 |
| `s` | 0.062327 |

| 代表カード | card ID | raw document-topic proportion |
|---|---:|---:|
| Doble Passe | 79997591 | 0.972609 |
| Arcana Force XIV - Temperance | 60953118 | 0.971725 |
| Welcome to the Jungle | 300302076 | 0.968728 |

`1`や`s`のような数字・単独文字tokenは,現在のtokenizationとCountVectorizerの出力に含まれる語です.これらをゲーム上の概念として解釈せず,前処理・語彙表現上の限界として扱います.

ここで示す上位語と代表カードは,英語stopwordを除去したunigramの語彙分布パターンです.raw component weightとraw document-topic proportionは,公式mechanic,archetype,ゲーム上の役割,カードの強さや重要度を表す値ではありません.

この分析で分かること

探索的トピック分析によって,以下を調べられます.

  • カードテキスト内の語彙パターン

  • 共起して現れる語彙パターン

  • 大量データから発見できる仮説

  • 人間が事前に分類していない文書の語彙上のまとまり

例えば,

「遊戯王カードの文章にはどのようなパターンが存在するのか」

という問いに対して,データから探索的な手がかりを得られます.

この分析だけでは分からないこと

一方で,LDAの結果を公式分類として扱うことはできません.

この分析だけでは,

  • topicが公式mechanicを表す

  • topic数が正解である

  • topicが必ず意味的カテゴリになる

  • archetypeやデッキタイプと一致する

  • ゲーム上の役割を分類できる

とは言えません.

また,LDAは文章中の単語分布を利用する手法であり,カード効果のルール処理やゲーム上の意味を理解しているわけではありません.

そのため,この分析は,

遊戯王カードテキストに存在する言語的パターンを発見するための探索的分析

として位置づけています.

分析6:価格とテキスト長の関係

最後に,カードデータと外部データを組み合わせた分析として,

カードのテキスト量と市場価格には関係があるのか

を探索しました.

観察(Observation)

2026-07-16の検証済みsnapshotでは,`character_count`とのPearson相関はいずれのvendorでもほぼゼロでした.Spearman相関はvendorごとに異なり,CoolStuffIncでは0.231893,eBayでは0.013691でした.このsnapshot範囲では,テキスト長と価格の明確で一貫したvendor横断の関係は確認できませんでした.

解釈(Interpretation)

この結果は,文章量だけを価格の単純な説明として扱えないことを示します.vendor別に値を保持することで,通貨,観測対象,価格分布が異なるデータを無理に一つの市場指標へ統合せずに比較できます.ただし,これはテキスト長が価格へ普遍的に影響しないことの証明ではありません.

方法(Method)

遊戯王では,

  • 強力なカード

  • 人気テーマのカード

  • 希少なカード

などが高価格になることがあります.

一方で,テキストが長いカードほど高価なのか,という問いは別途検証する必要があります.

そこで,カード価格snapshotとテキスト指標を結合し,記述的な分析を行いました.

価格データ

価格情報は,YGOPRODeck APIから取得可能なvendor別価格情報を利用しています.

対応vendor:

  • Cardmarket(EUR)

  • TCGplayer(USD)

  • eBay(USD)

  • Amazon(USD)

  • CoolStuffInc(USD)

ただし,以下の点には注意が必要です.

  • vendorごとに通貨が異なる

  • 通貨換算は行わない

  • vendor間の価格統合は行わない

  • printing・edition・rarity・condition単位の価格ではない

つまり,この分析で扱う価格は,

特定snapshot時点に取得したカード単位のvendor価格情報

です.

集計

価格snapshotと,カードテキスト測定結果を`card_id`で結合します.

その上で,以下を確認します.

  • vendor別価格分布

  • `character_count`とのPearson相関

  • `character_count`とのSpearman相関

  • 文字数bucket別の価格統計

Pearson相関では線形関係を,

Spearman相関では順位関係を確認します.

zero priceの扱い

価格データでは,価格情報が存在しない場合があります.

また,`0.00`は欠損値の代替ではなく,APIが返したゼロ値として保持します.ただし,無料配布,取引量,在庫,価格の正しさを意味するものではありません.

そのため,

  • coverage上では保持する

  • 既定では統計・相関計算から除外する

  • `--include-zero`指定時のみ分析対象に含める

という方針にしています.

結果の根拠

検証済みの価格分析outputでは,2026-07-16時点の72,340件のvendor×card価格snapshot観測を用いました.このうちmeasurementと`card_id`で結合できた67,155件から,APIが返したゼロ値の6,928件を統計・相関計算では除外し,非zeroの60,227件のvendor×card観測で`character_count`との関係をvendor別に確認しました.

| vendor | 通貨 | 非zero分析件数 | Pearson | Spearman |
|---|---|---:|---:|---:|
| Amazon | USD | 11,016 | 0.050700 | 0.103470 |
| Cardmarket | EUR | 13,198 | 0.001081 | 0.105573 |
| CoolStuffInc | USD | 11,530 | 0.023273 | 0.231893 |
| eBay | USD | 11,300 | -0.005576 | 0.013691 |
| TCGplayer | USD | 13,183 | -0.001765 | 0.104492 |

Pearson相関はいずれのvendorでもほぼゼロに近く,Spearman相関にはvendorごとの差がありました.例えば,CoolStuffIncのSpearman相関は0.231893でしたが,eBayでは0.013691でした.このsnapshot範囲では,テキスト長と価格の間にvendorをまたいで明確で一貫した関係を確認できませんでした.

この観察で分かること

この分析によって,

  • snapshot時点での価格とテキスト長の関係

  • 文字数が多いカード群の価格傾向

  • 線形・順位相関の有無

を確認できます.

例えば,

「長い効果テキストを持つカードほど高価格なのか」

という問いに対して,データから探索できます.

この分析だけでは分からないこと

ただし,この分析から以下を結論づけることはできません.

  • テキストが長いから高価格になる

  • 高価格カードほど複雑な効果を持つ

  • テキスト長が価値を決める

  • rarityや環境需要を除いた純粋な効果価値

  • 将来価格

  • 適正価格

カード価格は,

  • 需要

  • 供給量

  • rarity

  • 大会環境

  • コレクション需要

  • 再録状況

など多くの要因によって決まります.

また,この分析の価格はカード単位・vendor別のversion横断最小値であり,printing,edition,rarity,conditionごとの価格ではありません.rarity,需要,再録状況,大会環境などを統制していないため,テキスト長だけで価格を説明することはできません.

そのため,この分析は因果関係を求めるものではなく,

遊戯王カードの文章的特徴と,市場データ上の価格指標にどのような関係が見られるか

を探索するためのものです.

分かったこと・分からないこと

年別のLength Metrics,release count,類似検索,語彙・topic,価格の各分析は,入力データに対する記述・探索のためのものです.ここまでの結果を読む際は,次の限界を保ったまま解釈する必要があります.

カードの強さ

テキストが長いカードが,必ず強いとは限りません.

カードの強さには,

  • 効果そのもの

  • 発動条件

  • 環境との相性

  • デッキ構築との関係

  • 採用率

  • 大会結果

など,多くの要素が関係します.

YGONLPが測定しているのは文章データの特徴であり,競技性能ではありません.

ゲーム上の難しさ

長い文章は一見複雑に見えます.

しかし,

  • 短いが裁定が難しいカード

  • 長いが処理が単純なカード

も存在します.

文章量だけで,実際のプレイ難易度や裁定難易度を判断することはできません.

テキスト長増加の原因

時系列分析によって,

「ある年代から平均テキスト長が増加した」

という傾向を発見できたとしても,

「なぜ増加したのか」

までは,この分析だけでは分かりません.

原因として考えられるものには,

  • カードデザインの変化

  • 効果処理の複雑化

  • ルール整備

  • テーマ設計の変化

  • 商品展開の変化

など,複数の可能性があります.

遊戯王そのものの評価

また,YGONLPは,

  • 面白いカードか

  • 良いデザインか

  • 昔の方が良かったか

  • 最近の方が優れているか

といった評価を行うものではありません.

このプロジェクトの目的は,価値判断ではなく,

遊戯王カードという文章データに,どのような変化や特徴が存在するのかを調べること

です.

データ分析は,感覚を否定するためのものではありません.

むしろ,人間が感じている「最近長くなった気がする」という感覚を,別の角度から検証するための道具として利用しています.

方法・再現性

何ができるのか

YGONLPでは,カードデータを取得・検証・加工し,文字数・単語数・文数の測定,年別・カード種別別の時系列分析,年別release count分析,TF-IDFとcosine similarityによる類似テキスト検索,unigram・bigramによる語彙分析,LDAによる探索的トピック分析,vendor別価格snapshot,価格とテキスト長の相関分析をCLIとして再実行できます.


図3:YGONLPの処理と分析コマンドの依存関係.矢印はデータの入力関係であり,すべての分析が`summary`の後段にあることを意味しない.

データをどう集めたか

データソースには YGOPRODeck API v7 の英語版遊戯王OCG/TCGカードデータを利用しました.初回取得は原則として単一リクエストで行い,以降の分析では保存済みdataを入力としてAPIへ再アクセスしません.カード単位の逐次・並列・大量リクエストは行わず,取得条件と取得日時をmetadataに保存します.

データ管理方針

Gitで管理するのはソースコード,テストコード,分析仕様書,実行方法です.raw dataset,前処理済みJSONL,分析結果CSV・Markdown,価格snapshotはローカル生成物として扱います.これによりリポジトリを軽量に保ちながら,同じ処理を再実行できます.

データ権利と再配布

カード名,カードテキスト,画像,価格などの元データには,それぞれの権利者・データ提供者の利用条件が適用されます.本リポジトリはコード,仕様,集計図だけを管理し,raw data,カードテキスト,価格snapshot,分析用CSV/JSONLを再配布しません.データを取得・再利用する際は,YGOPRODeck APIおよび各vendorの利用規約,ならびに関連する権利関係を利用者自身で確認してください.

再現可能性をどう守ったか

YGONLPで重視しているのは,同じ入力から同じ手順で同じ結果を再生成できることです.各段階はmetadataを入力境界とし,入力ファイル,checksum,record count,実行日時,parameter,使用ライブラリversion,出力ファイル情報を記録します.これにより「このCSVはどの処理から生成されたのか」を追跡できます.

JSONLの固定キー順,`card_id`順,集計結果の順序,丸め規則,random seedを固定します.再現できるのは同じコード,依存ライブラリ,parameter,保存済み入力,UTC cutoffを用いた場合です.外部APIの内容,価格snapshot,ライブラリ実装,または取得時点が変われば,再実行結果も変わり得ます.

安全なデータ更新とテスト

出力はatomic保存し,正常なcacheを優先します.失敗した生成物は有効dataとして扱わず,`--force`指定時のみcacheを無視します.`--dry-run`は通信やファイル変更なしで実行予定・入力・出力先・cache状態を確認します.`verify-preprocess`はschema,キー順,`card_id`の一意性・並び順,metadataとの整合性を検証し,`cleanup-preprocess`はデフォルトでは候補表示のみを行います.

外部APIや実dataに依存しない固定入力テストにより,欠損値処理,日付処理,集計,出力形式,異常系を検証します.YGONLPは「一回動いた分析コード」ではなく,データ取得から分析までを再実行できる小規模な研究基盤を目指しています.

制作メモ

作っていて一番難しかったこと

YGONLPを作る上で,一番難しかったのは,単に分析手法を実装することではありませんでした.

本当に難しかったのは,

「何を測定したのか」を明確に定義すること

でした.

例えば,

「カードの発売日」

という言葉だけでも,実際には複数の意味があります.

  • OCGで初登場した日

  • TCGで初登場した日

  • 収録パックの発売日

  • 再録された日

どれを採用するかによって,分析結果の意味は変わります.

そのため,YGONLPでは,

  • 採用する日付の定義

  • 欠損値の扱い

  • 推測補完を行うかどうか

  • 分析対象外のデータ

を明示するようにしました.

また,自然言語処理では,

「似ている」

「複雑」

「特徴的」

といった言葉を簡単に使えてしまいます.

しかし,これらは人間の感覚に依存します.

そこで,

  • 類似度とは文章上の類似度である

  • topicとは語彙分布上のgroupである

  • 複雑性とは定義した指標上の複雑性である

というように,測定対象を限定しました.

データ分析では,複雑なモデルを作ることよりも,

何を意味している数字なのかを説明できること

の方が重要だと感じました.

今後やりたいこと

現在のYGONLPは,まず「遊戯王カードを大規模テキストデータとして扱えるか」を確認するための基盤作りを目的としています.

今後は,さらに以下のような分析へ発展させたいと考えています.

キーワード傾向分析(実装済みの今後の分析拡張)

`graveyard`,`GY`,`banish`,`search`のように明示したregexを,candidate TCG first-appearance yearごとに数える仕組みを実装しています.この分析が答えようとするのは,「各語を1回以上含むcard documentの比率や出現数は,年ごとにどう変化するか」です.欠損日付とcutoff後の日付は除外し,各年のdocument ratioとoccurrence countを分けて集計します.

ただし,このリポジトリには記事へ引用できる検証済みのkeyword trend出力が保存されていません.そのため本記事では,これを発見済みの結果として扱いません.将来,固定した入力・cutoff・regex定義による出力を検証したうえで,語の出現比率という観察として報告できます.その場合も,語の頻度だけからゲームデザインの意図や特定mechanicの重要度を結論づけることはできません.

Archetypeテキストprofile(実装済みの今後の分析拡張)

前処理recordの`archetype` metadataを用い,archetypeごとのprofileを生成する機能を実装しています.profileにはcard count,average character count,average word count,average sentence count,card type distributionを含めます.これは「archetype metadataを持つカード群の文章的特徴や種別構成を,同じ測定規則で比較できるか」という問いのための,実装済みの今後の分析拡張です.

今回の検証済み実行では,source records 14,472件のうち,archetype profileの対象は8,738件,`archetype` metadata欠損は5,734件で,651 archetypeのprofileを生成できました.ただし,本記事ではarchetype間の比較結果を「発見」として報告しません.`archetype` metadataが欠損したrecordはprofileから除かれ,archetypeは文章特徴を比較するためのmetadataであって,カードの強さ,戦略的役割,テーマ設計意図を表すものではありません.機能は実装済みですが,追加検証後に将来の分析結果として報告する位置付けです.

より詳細な文章構造分析

現在実装しているLength Metricsに加えて,より細かい構造分析を行いたいです.

例えば,

  • 条件文の数

  • コスト表現の数

  • 対象指定の数

  • 効果処理段階の数

  • 発動タイミング表現

  • 例外処理表現

などを抽出することで,

「単純に長いカード」

「処理構造が複雑なカード」

を区別できる可能性があります.

日本語版カードとの比較

現在の対象は英語版カードです.

しかし,遊戯王のカードテキストは言語によって表現方法が異なります.

例えば,

  • 英語版では文章として表現される情報

  • 日本語版では省略される表現

  • 公式用語の違い

などがあります.

将来的には,日本語版と英語版を比較することで,

「言語によってカードテキストの構造はどう変化するのか」

という問いにも取り組めるかもしれません.

より高度な自然言語処理

現在は,

  • TF-IDF

  • CountVectorizer

  • LDA

といった比較的解釈しやすい手法を中心に利用しています.

今後は,

  • word embedding

  • sentence embedding

  • transformer-based model

  • 大規模言語モデル(LLM)

などを利用した分析も検討できます.

ただし,より高度なモデルを使う場合でも,

「何を測定しているのか」

を説明できることは重要です.

他のゲームデータへの応用

今回の対象は遊戯王カードでした.

しかし,同じ考え方は他のデータにも応用できます.

例えば,

  • 他のカードゲーム

  • ゲーム内説明文

  • ソフトウェアドキュメント

  • 技術文書

など,

大量の文章データを持つ対象であれば,自然言語処理による探索が可能です.

最後に

YGONLPは,遊戯王カードを題材にした小さな自然言語処理プロジェクトです.

しかし,本質的には,

身近なデータに対して,感覚ではなく再現可能な方法で問いを立てる

ことを目的にしています.

普段遊んでいるゲームでも,データとして見直すことで新しい発見があります.

「最近の遊戯王はテキストが長い」

という何気ない感想から始まったこのプロジェクトが,

データ分析や自然言語処理を学ぶきっかけになれば幸いです.

おわりに

「最近の遊戯王カードはテキストが長い」

この感覚は,多くのプレイヤーが一度は感じたことがあると思います.

今回作成したYGONLPでは,その感覚を単なる印象で終わらせず,

  • どのようなデータを使ったのか

  • どのような定義で測定したのか

  • どのような限界があるのか

を明示した上で,自然言語処理とデータ分析によって調べました.

結果として,遊戯王カードは単なるゲームの駒ではなく,

  • 長期間蓄積された文章データ

  • 独自の表現体系を持つ自然言語データ

  • 時代によって変化するデザイン情報

として分析できる対象であることが分かりました.

もちろん,データ分析だけですべての答えが出るわけではありません.

しかし,

「なんとなくそう感じる」

という人間の直感を,

「どのデータを見れば検証できるか」

という問いへ変換することはできます.

YGONLPは,遊戯王という身近な題材から始めた小さな研究プロジェクトです.

もしこの記事を読んで,

「自分の好きなゲームや趣味のデータも分析してみたい」

と思ってもらえたなら,このプロジェクトを作った意味があったと思います.

ソースコードはGitHubで公開しています.

データ分析や自然言語処理に興味がある方は,ぜひ自由に眺めてみてください.

AIツールの利用について

本記事およびYGONLPの開発過程では,文章作成支援,実装支援,コードレビュー,分析結果の確認補助のために,OpenAIのChatGPT,Codex,GPT-Workを利用しました.

ただし,分析設計,データ処理方針,実装内容,結果の解釈,記事として公開する内容については,著者が確認・判断しています.

本記事および公開成果物についての最終的な責任は著者が負います.

謝辞

本記事は本公開前に,私が主催するサークル「GoodGame」メンバー,ならびにYGOCounterのメンバーにレビューをいただきました.この場を借りて感謝申し上げます.ありがとうございました.

いいなと思ったら応援しよう!