MATLAB

【MATLAB】テキストデータを話題の比率として捉える — サッカーJ1監督コメントのトピック分析

はじめに

世の中には、数え切れないほど多くのテキストデータが存在しています。SNSの投稿、レビューやアンケートの自由記述、議事録、問い合わせ履歴など、私たちは日常的に大量のテキストデータに囲まれています。これらのテキストには多くの情報が含まれていますが、そのままでは扱いにくく、全体像を把握するのは容易ではありません。

こうしたテキストデータの分析の目的の一つは、こうした文章の集合から「何について語られているのか」を整理し、その傾向を定量的に捉えることです。文章を話題という単位に分解し、それぞれの話題がどの程度の割合で現れているかを把握できれば、感覚的な印象ではなく、数値として比較や議論ができるようになります。

この記事では、テキストデータを話題の比率として捉える方法、そしてその結果の解釈について具体的な事例を通して紹介します。

今回取り扱うデータ

今回は、サッカーJリーグの試合後の監督のコメントを例として使用します。

試合後の監督コメントは、テキスト分析の対象として相性が良いと考えています。まず、監督コメントはほぼすべての試合で定常的に生成されます。そのため十分なサンプルをチームの偏りなく確保することができます。また、公式な場での発言であるため、SNSの投稿などと比べるとノイズが少なく、一定の文体が保たれています。さらに、試合内容、選手、戦術など、複数の話題が自然に混在する点も、トピック分析との相性が良いと言えます。

一般に試合後の監督コメントは、第一声で監督が試合を振り返るコメントを話し、その後メディアからの質疑応答が行われます。この質疑応答での監督のコメントは、メディアが聞き出したい話題に対してのコメントであり、毎試合同一の話題の質問がされるとは限らないため、今回の分析対象は、試合後に監督が第一声として自発的に話したコメントとしました。

今回分析対象としたのは、2025シーズンのJ1の380試合です。1試合でホーム、アウェイそれぞれの監督のコメントが生成されますので、計760コメントが分析対象です。

分析方法の概要

今回の分析は、大きく分けて三つのステップで構成されます。テキストデータを段階的に処理することで、最終的に各コメントの話題の比率を把握することを目的としています。

前処理

最初のステップは前処理です。テキストデータには、分析に直接関係しない句読点やあまり意味を持たない頻出する一般的な語が多く含まれています。これらをそのまま扱うと、分析結果がノイズに強く引きずられてしまいます。そのため、句読点の除去や表記の正規化、ストップワードの除外といった処理を行い、分析に適した形に整えていきます。

今回のデータは、各試合における監督コメントを1文書として扱い、文書集合を構成しています。コメントデータは以下のような形式でエクセルで管理をしていました。

読み込んだコメントデータの例

それでは具体的な前処理の説明をします。今回は主に以下のことを行っています。

  • ホームとアウェイの監督コメントを縦方向へ結合して1列にする
  • 文章をトークン化(最小単位へ分割)する
  • 分割された単語へ品詞情報を付与し、レンマ化(原形状態へ変換)する
  • 極端に長い/短い単語を削除する
  • 句読点を削除する
  • ストップワードを削除する

詳細は以下のコードを参照ください。この前処理はMathworksのこちらを参考にしています。なお今回は、Text Analysis Toolboxを使用しています。最後のストップワードの部分ですが、デフォルトで設定されているストップワードの他、何回か分析を回してみて、結果を解釈さる際にノイズになりそうな単語をストップワードとして新たに指定をしました。

% データファイルの読み込み
T = readtable("comment.xlsx",'VariableNamingRule','preserve');

%% 前処理
% ホーム監督とアウェイ監督のコメントを縦方向に結合
textData = vertcat(T.homeComment,T.awayComment);

% トークン化
documents = tokenizedDocument(textData);

% 品詞情報の付与
documents = addPartOfSpeechDetails(documents);

% レンマ化
documents = normalizeWords(documents,Style="lemma");

% 句読点の除去
documents = erasePunctuation(documents);

% 長短の単語の削除
documents = removeShortWords(documents,1);
documents = removeLongWords(documents,15);

% ストップワードの削除
documents = removeStopWords(documents);
documents = removeWords(documents, ["思う","できる","いく","という","今日"]);
MATLAB

ベクトル化と語彙の選定

次に行うのが文書のベクトル化と語彙の選定です。まず文書を「どの単語が何回出てきたか」という形(bag of words形式)に変換し、各文書を数値として扱います。これにより、文書内での文章の順序や文法を考えずに、内容の傾向を比較できるようになります。さらに、すべての文書の中で、出現回数が極端に少ない単語を除外し、話題の傾向を捉えにくい語彙を意図的に制限します。語彙を減らした結果として単語が一つも残らなくなった文書については、分析から除外することとします。具体的な手順は以下のコードを参照ください。

%% ベクトル化と語彙の選定
% bag of word形式でベクトル化
bag = bagOfWords(documents);

% 1回しか出現しない単語を除外
bag = removeInfrequentWords(bag,1);

% 単語が1つも残らなくなった文書を除外
bag = removeEmptyDocuments(bag);
MATLAB

トピック分析

次にLDAによるトピック分析です。LDAは、文書集合の背後に潜むトピック(話題)を推定し、各文書がどの話題をどの程度含んでいるかを確率分布として表現します。これにより、個々の監督の1試合のコメントの中に「どの話題が何割含まれているか」という形で定量的に把握することが可能になります。トピック数をいくつに設定するかについては、モデルのパープレキシティや計算コストを目安にする方法などが紹介されていますが、これといった正解はありません。したがって、分析する側が解釈をしやすく、分析の目的を達成できるように設定することが望ましいと私は考えています。今回は、トピック数を変更してケーススタディを何度か行いました。その中で最も解釈がしっくりきた「トピック数=5」を今回の最終的な結果としています。ただし、この結果も完全ではなく、あくまで特定の条件下で観測された傾向に過ぎないということは意識する必要があります。「この監督はこういう人物だ」と断定するのではなく、「少なくとも今回のデータでは、こうした話題を語る割合が高かった」と捉える必要があります。

%% トピック分析
% LDAモデルによるトピック分析
rng("default")
numTopics = 5;
mdl = fitlda(bag,numTopics,Verbose=0);

% 各トピックの頻出後を可視化
for i=1:numTopics
    n(i).top_wd = topkwords(mdl,10,i);
end

figure
t = tiledlayout("flow");
title(t,"LDA Topics")
for i = 1:numTopics
    nexttile
    wordcloud(mdl,i);
    title("Topic " + i)
end

% 各文書のトピックの比率を可視化
topicMixtures = transform(mdl,bag);
figure
barh(topicMixtures,'stacked')
xlim([0 1])
title("Topic Mixtures")
xlabel("Topic Probability")
ylabel("Document")
legend("Topic "+ string(1:numTopics),'Location','northeastoutside')
MATLAB
各トピックの頻出語の例
各文書のトピックの比率一覧

分析結果の解釈

前章で5つのトピックを抽出しました。ここからは、各トピックの詳細を見ていきます。

トピック1:総論・振り返り

トピック1の頻出単語は以下の単語でした。

ゲーム、やる、いける、けど、しっかり、しまう、最後、いう、部分、もっと

また、このトピックの比率が高かった監督コメントを以下に抜粋します。

まだ勝星がない中で、今日も本当にたくさんのサポーターが来てくれて、今日は勝点3しか狙っていない、そういうゲームだったんですけど、結果的には本当に悔しい。前半から、基本的には自分たちのやりたいことができていたと感じています。後半は流れが行ったり来たりすることがあったんですけど、流れが悪い時間帯にしっかり失点をしてしまった。前半のラストも、自分たちでリズムを悪くしてしまった流れの中で失点を食らっているので、キツい時間帯にしっかり守り切れるかというところも、しっかり立て直していかないといけないと思っています。ただ、選手はしっかりとやりたいことを表現してくれて、点を取るところでしっかりと取れているので、あとは最近の課題ですけど、失点をしない。最後のところの部分は気持ちを含めて、何かを見つめ直さないといけないなと感じています。

第7節 新潟 vs G大阪(スコア 3-3) 新潟 樹森大介 監督 コメント

総括も何も、前半で自分たちで終わらせてしまったゲームだったと思います。本当に来てくださる人、応援してくださる人に対して申し訳ない気持ちになりました。もっとゴールに迫るところだったり、相手陣地でサッカーをする回数を増やすことだったり、そこの決断がまだまだ外から見て足りなかったと思います。失点のところはもちろん原因は多々ありますし、そういうところがハッキリ出たゲームになったのかなと思います。これをどう処理して、どうかみ砕いて、どう準備をして次に向かうか。向き合うところは向き合わないといけないし、やらないといけないことはやらないといけない。次はどう向かうかが大事なゲームだと思うので、今日の試合に関しては本当に申し訳のないゲームをしてしまいました。

第30節 名古屋 vs 湘南(スコア 3-1)湘南 山口智 監督 コメント

このスタジアムの雰囲気といまの岡山さんの圧に負けないように入ったゲームでした。なかなかそこの部分で受ける時間が多かったです。我慢しながらという前半だったと思いますし、後半に関してももっともっと(失点)ゼロの時間帯を増やしてというプランを持った中でのゲームでした。なかなか攻撃のところでも、相手を後ろ向きにさせるところが、状況はできているんですけど、判断がつながらなかったりするところが多々あって、難しさを感じました。守備のところでもセカンドボールを含めて、マイボールになったところも含めて、すぐに奪い返されるシーンも多々あって、本当にそこは問題として今日も露骨に出たなと思いますし、自分のチョイスも含めて問題が出たなと思います。本当にこれだけたくさんの人が来てくれて、この雰囲気の中でできる幸せをもっともっと形で返さないといけないと思うので、非常に悔しさの残るゲームになりました。

第27節 岡山 vs 湘南(スコア 1-0)湘南 山口智 監督 コメント

これらからトピック1は、主に試合全体を振り返り、評価や反省の弁などを話題にし、次につなげたい前向きな姿勢を示す総括的なコメントが中心であると判断できます。そのため、「総論・振り返り」を話題にしているトピックとして解釈しました。


トピック2:試合展開

トピック2で頻度の高かった単語は以下の単語でした。

後半、相手、良い、前半、チャンス、失点、ボール、プレー、しまう、作る

また、このトピックの比率が高かった監督のコメントの抜粋です。

苦しんだ前半になりました。風の影響もありましたし、神戸さんがプレスをうまく掛けてきたというところでなかなかそれをはがせずに自陣から抜け出せなかった時間が続きました。相手陣地に押し込んだ際には、われわれのスタイルをうまく表現してチャンスを作れていました。しかし、その時間帯が長くできたかというと、そうではありませんでした。そしてわれわれが警戒していたセットプレーから2失点をしてしまい、試合を難しくしてしまいました。そして風の影響を受けて前進できない中で、前線で1トップに(細谷)真大を起用したわけですけども、なかなかボールが収められませんでした。それに関してはハーフタイムに交代カードを切り、修正を加えました。後半には少し改善できていたと思います。相手を押し込んだ際には、より危険なプレーができていたと思いますけど、われわれが期待していたようなプレーが常にできていたかというとそうではなく、神戸さんのプレーに影響されてか、われわれのスタイルとは少し違った形で長いボール、縦への速いプレーが増え過ぎてしまい、自分たち自身でリズムを崩してしまったと思います。

第19節 柏 vs 神戸(スコア 1-3)柏 リカルド・ロドリゲス 監督 コメント

まずは前半、ヴェルディさんの強度の高いプレスに苦しんだ時間帯が長かったというのがありました。なかなかそれをはがすことができないという苦しい時間帯が続き、前半にはなかなか決定的なチャンスを作ることもできていませんでした。一方、後半に関しては、われわれが保持する時間帯も長く、相手を押し込む、そしてチャンスを作るということも複数できていたと思います。それにプラスで取り消されたゴールもありましたし、きっ抗した試合の中、点を決めたほうが勝つであろうという難しい試合だったかと思います。

第7節 柏 vs 東京V(スコア 0-0)柏 リカルド・ロドリゲス 監督 コメント

立ち上がりが良くなく失点をしてしまいましたが、その後は改善が見られたと思います。ゲームコントロールをしようとして連係もうまくいき、ストライカーとトップ下のコンビネーションもあり、使いたいスペースを使うような動きができたと思います。それが得点につながりましたし、立ち上がり以外の前半はかなり良かったのではないかと思います。しかし、後半に入ってからはやりたいプレーができず、ハーフスペースや背後のスペースを使えませんでした。また、本日はローディフェンスがわれわれの強みになりませんでした。交代も含めて修正しようとしまして、フレッシュな選手も投入しましたが、交代のあと逆にビルドアップの流れが途切れてしまいました。前線の選手の連係が十分に良いと言えないものになり、ペナルティーエリア内の守備も通常のわれわれのレベルに達しないものになってしまい、イヤなゴールを2つ喫してしまいました。試合終盤は追いつこうとしてチャンスを作り、例えば荻原 拓也のチャンスもありましたが、本日は決定率が高くありませんでした。後半のFC東京がわれわれを上回っていたことは認めざるを得ないと思います。

第24節 FC東京 vs 浦和(スコア 3-2)浦和 マチェイ・スコルジャ 監督 コメント

以上からトピック2は、前半・後半の違いや相手との駆け引き、失点やチャンスなど試合展開について語り、ボールの保持やプレー内容など、試合中に起きた具体的な場面の説明が多いトピックと解釈できます。そのため「試合展開」を話題にしているトピックと解釈しました。


トピック3:自チームの評価

トピック3で頻出していた単語は以下です。

試合、非常、られる、チーム、良い、われわれ、取る、ゴール、しっかり、選手

また、このトピックの比率が高かった監督のコメントの抜粋です。

まず(直近のJ1第30節・)神戸戦というハードな試合の3日後にこういう試合があって、その中で3-0。運も味方したと思いますけれども、チームはまとまった良いパフォーマンスを見せて勝つことができました。神戸戦はアンラッキーな形で0-1で負けてしまいましたけれども、今日は本当にラッキーな3-0だったと思います。結果だけ見たら3-0ですけれども、本当にヴェルディも良い形、良い攻撃があったと思います。この炎天下の中で中2日、中3日という連戦が続いていくわけで、それで毎回良いパフォーマンスを出すは非常に難しいと思っています。ただ、その中でも自分たちのチームは本当に良いパフォーマンスでした。その辺に関しては非常に満足しています。早く夏が終わってほしいと思っていますし、Jリーグの試合がこれだけ過密に入っていることも少し考えたほうがいいかもしれません。夏が終われば、サッカーのクオリティーもまた上がってくるのではないかと思います。

第27節 東京V vs 広島(スコア 0-3)広島 ミヒャエル・スキッベ 監督 コメント

両チームともに勝ちにこだわった試合をしたと思います。僕らのパフォーマンスも良かったと思いますが、この試合を決めたのは相手GKの質だったと思います。

第28節 C大阪 vs 広島(スコア 1-1)C大阪 アーサー・パパス 監督 コメント

今日がどのような位置づけの試合だったのかは本当にサポーターが一番よく分かってくれて、われわれのバスの出迎えもしかり、試合前もしかり、このクラブがJ1に居続けるための重要な試合だということをみんなで共有しながら試合に入れました。彼らに感謝したいです。内容については、われわれも裏やコンビネーションもすべて相手を見ながらやりたいんですけれども、ひょっとしたらそれを使う回数だったり時間帯というのはいつもより多くはなかったかもしれないです。そこは戦いながら改善してければいいんですけども、こういう絶対負けられない試合の中で、どのようにリスクを負うか、どこで戦うか、どういうふうにバトンを渡していくか。これはみんなが共有して90分を戦い抜けたことの経験というのが、いまだに先発の平均年齢で上回ったことは1回もないような若いチームが本当に少しずつ良い経験ができているなと思います。まだまだ負けられない試合が続きますけども、サポーターとともに最後まで戦ってすべて勝てるように、そういう準備をしたいです。

第33節 湘南 vs 東京V(スコア 0-1)東京V 城福浩 監督 コメント

以上よりトピック3は、ゴールや勝利など試合結果を踏まえ、チームや選手の出来を評価する話題が中心で、手応えや成果を前向きに語る話題であると判断できます。そのため「自チームの評価」を話題にしているトピックと解釈しました。


トピック4:メンタル・姿勢・感謝

トピック4で頻出していた単語は以下です。

くれる、選手、サポーター、戦う、本当に、最後、ゲーム、勝利、持つ、ホーム

また、このトピックの比率が高かった監督のコメントの抜粋です。

本当に悔しい試合でした。最後(試合後)にわれわれが姿を見せる中でも、本当に熱い声援をくださる、ここまで来てくれたファン・サポーターの皆さんには本当に申し訳ないです。ただ、ここであきらめるわけにはいかないので、「必ず、次には」とこれは何度でも言わせていただきたいです。次は必ず勝って、彼らを笑顔でスタジアムから帰っていただきたい。そのための努力をしっかり続けていかなくてはいけないと思っています。

第19節 京都 vs FC東京 (スコア 3-0)FC東京 松橋力蔵 監督 コメント

(直近のJ1第11節・福岡戦から)試合間隔が8日間空いた中で、選手たちがスタートからエネルギッシュにハードワークするところを見せてくれました。技術、判断力、アイディアがある選手がどれだけサボらずにハードワークし、インテンシティーを上げることが重要だといつも伝えている中で、チーム事情的には緊急事態もあったのですが、誰が出てもハードワークできることを示せたことが今日の勝利につながったと思っています。また、味スタまで4,500人以上のサポーター・ファミリーが駆けつけてくれました。オレンジ色の大歓声が、われわれにエネルギーとパワーを与えてくれましたし、そのおかげで選手たちは最後までハードワークすることができました。

第13節 FC東京 vs 清水(スコア 0-2)清水 秋葉忠宏 監督 コメント

まず本当にスタジアムの雰囲気が、もう最初から勝たせてくれるような雰囲気であったことに、本当に感謝します。また選手たちが、今までと打って変わって、最後、本当に自信を持ってプレーしてくれたこと。それもやっぱりメルスタの雰囲気がそうさせてくれたと思っています。やっぱり選手には緊張もあったと思いますし、簡単なゲームだったとは思いません。そういった中で本当にたくましく戦ってくれたと思いますし、本当に頼もしかった。そういうゲームだったと思います。選手がよくやってくれたなと思います。選手、そしてサポーター、コーチングスタッフ。本当にそこに支えられてきたので、本当に感謝しています。「ありがとうございました」と伝えたいです。

第38節 鹿島 vs 横浜FM(スコア 2-1)鹿島 鬼木達 監督 コメント

以上よりトピック4は、選手の戦う姿勢やサポーターへの感謝、ホームの雰囲気などに触れ、結果以上に気持ちや支えへの言及など精神面を重視した話題と言えます。そのため「メンタル・姿勢・感謝」を話題にしているトピックと解釈しました。


トピック5:チームマネジメント

トピック5の頻出単語です。

試合、われわれ、選手、くる、チーム、ながら、として、結果、プレー、強い

また、このトピックの比率が高かった監督のコメントの抜粋です。

リーグ優勝がなくなった状況で迎えたFC東京さんとの試合は、われわれが(FC東京に対して)3連勝中でもあることを踏まえて、相手はモチベーションが上がった状況で臨んでくるだろうと思っていました。また、国立での対戦である上に、“東京対決”ということで、われわれも奮起しようと臨みました。さまざまな対策を講じた中で迎えた試合でしたが、ほぼゲームプランどおりに試合が進んでいました。ただ、従来から課題として抱えている決め切るという部分に関しては、改善されなかったことが無念でなりません。足を振り抜きながらも、クロスバーの上を越えるシュートや、クロスを相手に当ててしまうことは、個人のスキルに尽きると思います。J1のトップクラスに到達するようなスキルに達していかないと、われわれがJ1で首位争いをするのは難しくなってしまいます。練習を通じてシュートのスキルを上げていくことを選手たちに厳しく求めていきながら、スキルの向上は日々の鍛錬でしか補えません。FC東京さんも身を挺して守備をするゲームをされていましたし、チャンスは多くあった中で決められないということに尽きるゲームになりました。来週の天皇杯(準決勝)、FC東京さんと同じ舞台の国立で対戦できることは、われわれにとってポジティブな要素です。天皇杯でリベンジを果たせるような準備をしていきたいです。

第36節 町田 vs FC東京 (スコア 0-1) 町田 黒田剛 監督 コメント

われわれとしてはホームでなんとか勝利をしたいゲームでした。前節(・浦和戦)はちょっと自分たちの思ったようなゲームができずにアウェイから帰ってきて、今日は自分たちの強いスタンスを見せなければいけない、その中でしっかり戦おうというメンタリティーで1週間準備してきました。試合としては、自分たちのスタンスはしっかり出せていた、自分たちのゲームはできました。ただ、勝点1は物足りないと思います。選手たちにも話したことは、1つはわれわれがこのリーグで戦っていくためには、1つの負けで簡単に頭を下げて、次のゲームも前進できないようではダメだと。だから、今日は1つ前進して、連敗しなかったことは大きなプラスだと。だけど、こういう自分たちが優勢に戦えているゲームで、しっかり3ポイントを取れるようになるために、前進して向上していくことはやっぱり大事だろうと、選手たちには伝えました。だから良かった面と、3ポイントが取れたんじゃないかなという悔しさの両面がある内容だったと思います。また次、頑張りたいと思います。

第6節 岡山 vs 川崎F (スコア 0-0) 岡山 木山隆之 監督 コメント

激しいタフなゲームになることを想定していましたが、実際にそんなゲーム展開になったと思います。立ち上がりからなかなか前線にボールが収まらずに、警戒していたカウンターの形を何度か発動させてしまったことは、われわれの懸念材料となったため、今後はしっかりと改善していきたいと思います。また、後半のイヤな時間帯に失点をしましたが、交代出場の選手が中心となってしっかりとその穴を埋めてくれましたし、仲間のミスをチームで補うというチームワークを一丸となって発揮してくれたことをポジティブに捉えています。今後にしっかりとつなげられるような試合の終わり方になったので、試合後のロッカールームでは選手たちに向けて、ポジティブな言葉をかけました。

第7節 福岡 vs 町田 (スコア 2-2) 町田 黒田剛 監督 コメント

これらよりトピック5は、結果やプレーを「チームとしてどうあるべきか」という視点で語る話題で、勝敗を単独で評価せず、成長や強さ、組織としての方向性と結びつけて説明する話題であると考えられます。そのため「チームマネジメント」を話題にしているトピックと解釈しました。

まとめ

本記事では、テキストデータを「話題の比率」という形で捉える一つの方法として、Jリーグの試合後の監督コメントを対象にトピック分析を行いました。文書の集合から話題を抽出し、その割合を定量化することで、これまで感覚的に語られがちだったコメントの傾向を、話題の比率として眺めることができたと考えています。

一方で、本分析によって得られたトピックやその比率は、あくまで特定の前処理やモデル設定のもとで観測された結果に過ぎません。トピック数の選び方や語彙の取捨選択が変われば、得られる結果も変わります。したがって、これらの結果をもとに「この監督はこういう人物だ」と断定することは適切ではありません。

重要なのは、分析結果を唯一の答えとして扱うのではなく、考えるための材料として受け取ることだと思います。テキスト分析は、文書の意味を自動的に理解してくれる魔法の道具ではありませんが、今回のように話題の比率という形で整理することで、人間が解釈を深めるための視点を与えてくれる強力なツールにはなり得ます。それによって自分なりに物事をより深く考えてみたり、言葉の背景にあるものを想像してみたりすると面白いです。

各監督の傾向やより詳細な分析は改めて別記事でしてみようと思いますのでご期待ください。

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

-MATLAB
-, ,