NLPでざっくり今年のヤクルトスワローズを振り返ってみる
2019-12-08
azblob://2022/11/11/eyecatch/2019-12-08-wordcloud-yakult-000.jpg

この記事はFIXER Advent Calendar 2019 (https://adventar.org/calendars/4579)  8日目の記事です。

はじめに

※この記事はポエムです。

12月になり皆さんの贔屓の球団の契約更改や移籍情報等も大体出揃い始めた時期ですね。ざっくりと今回は私の贔屓の球団である東京ヤクルトスワローズの今年1年を振り返ってみるのをテーマにブログを書きたいと思います。(5月中旬から6月頭に関しては振り返る必要なさそう)

振り返るに当たって指標や年棒等の数字で見るプロ野球や、来年はオリンピック開催に伴い資材置き場になってしまう神宮球場の設備や食事について書き綴るなど方法は色々有ると思いますが、今回はヤクルトスワローズに関するニュース記事をNLP(自然言語処理)でよしなにして特徴的なキーワードを抽出して振り返ってみたいと思います。

振り返りの手法について

まずヤクルトの1年を振り返るのに使用する資料としては、試合結果やストーブリーグの動向等をおおよそ同じフォーマットで取得出来るサ〇スポなどのWebニュースを利用したいと思います。収集したWebニュースのまとめ方は視覚的に分かりやすいワードクラウドとしてキーワードをまとめて今年のヤクルトを振り返ってみたいと思います。

ワードクラウド

今更特筆して説明する様なものでも無いですが、ツイッターとかでよくあるキーワードの出現頻度計算して発話や記事等のテキストを分かりやすく視覚的に表現する方法です。
下記はヤクルトスワローズの公式ツイッターとサンケイスポーツヤクルトのツイートを whotwi でワードクラウド化した画像になります。

サンスポ×スワローズアカウントのワードクラウド
東京ヤクルトスワローズ公式のワードクラウド

こちらはツイッターアカウントの分析結果で時系列なでも考慮される様なので最近ですとドラフトや村上君など文字が大きいですね。

資料収集

ヤクルトに関する今年のWebニュース取得方法は自然言語処理でよく使用されるlivedoorニュースのコーパスの様なものはない為、ヤクルトスワローズに関しての記述が有るニュース記事を6つほどの媒体から2019年1月~201912月(5日辺りまで)の期間で約6000件程スクレイピングしました。

スクレイピングに関しては大正義のPythonでBeautiful Soupを使用して収集しています。(コードに関しては割愛)
Beautiful Soup に関しては下記のドキュメントやqiita等の記事を参照してみてください。
https://www.crummy.com/software/BeautifulSoup/bs4/doc/

テキスト整形

収集したニュース記事を後段のワードクラウド化する処理を行う前に事前に整形を行います。
今回の場合、 ワードクラウド化するためにPythonで使用したライブラリが英語での使用を想定されているため、よくある感じの形態素解析を行って品詞毎に空白を挟む処理が必要です。また、空白挟む他にも今回は分かりやすく表現するため文章内の品詞を名詞へ限定し、基本的に活用は無い想定ですが基本形を扱う様に整形します。

整形例
整形前:"(セ・リーグ、ヤクルト3-2中日、20回戦、中日11勝9敗、18日、神宮)ヤクルトのデービッド・ブキャナン投手(30)が男泣きした。8回4安打無失点で3勝目。"
整形後:"セ・リーグ ヤクルト 3 - 2 中日 2 0 回戦 中日 1 1 勝 9 敗 1 8 日 神宮 ヤクルト デービッド ブキャナン 投手 3 0 男泣き 8 回 4 安打 失点 3 勝 目"

テキスト整形に関しては取り合えず実装を優先しjanomeを利用しました。
janomeに関しては下記のドキュメントを参照してください。
https://mocobeta.github.io/janome/

また、テキスト整形を行う際に合わせて単語の出現回数をカウントして数値としてもある程度認識出来る様にしています。

ワードクラウド化

収集したニュース記事の整形を行えたら処理はあと少しです。
今回はPythonでワードクラウド化するのに下記のWord Cloudライブラリを使いました。素直にpipでインストールして扱えるので特別解説する様な事は無くて、ドキュメントや他の記事通りですが下記の様な形で生成出来ます。 http://amueller.github.io/word_cloud/index.html

from wordcloud import WordCloud

text = "セ・リーグ ヤクルト 3 - 2 中日 2 0 回戦 中日 1 1 勝 9 敗 1 8 日 神宮 ヤクルト デービッド ブキャナン 投手 3 0 男泣き 8 回 4 安打 失点 3 勝 目"

wordcloud = WordCloud(background_color="white",
    width=800, height=600, font_path=r"hoge.otf").generate(text)
wordcloud.to_file("wordcloud.png")

WordCloudライブラリを日本語で使用するにあたってフォントを指定しないと文字化けで豆腐に埋め尽くされた画像が生成されるので、フォントは適当に指定して実行してください。

処理結果

前置きが長くなりましたが2019年1月~12月の約6000件をワードクラウド化した画像です。

2019年ニュース記事6000件のワードクラウド

日程や試合結果と言った汎用的なものを除くとざっくりヤクルトスワローズの公式ファンクラブの`Swallows CREW`が大きく目立つ他、小川監督や村上と言った単語が目立ちます。今年の新人王村上や辞任した小川監督(GMへ就任)が目立つのはそれっぽいですね。次いで見られるのは山田、青木、バレンティンと言ったスター選手や次期監督の高津監督、つば九郎などでしょうか。
結構分かる部分も多いんですが、汎用的な表現も大きく見られて惜しい部分も多い感じです。

集計範囲の広さや前処理の甘さが個人的にちょっとざっくりしすぎかなと感じたので、試しに8月中旬辺り9月辺りの記事500件程を対象にワードクラウド化してみました。

2019年8月中旬~9月のニュース記事500件のワードクラウド

こちらも試合結果などの汎用的な表現は有りますが、分かりやすい結果が出てますね。ヤクルト山田や盗塁、成功、連続などが大きく確認出来ます。今年の山田の連続盗塁はシーズン33回で日本新記録を更新しており、シーズン後半のちなヤク的には大ニュースでした。
また、山田や盗塁以外では村上や高卒,本塁打,中西なども目立ちます。これもやはり高卒2年目以内の30本塁打以上が話題となったからですね。清原以来の記録で結果として36本と十分な成績を残して大変嬉しい話題でした。

余談ですが山田哲人は盗塁数もさることながら、盗塁成功率も非常に高く盗塁王こそ逃したものの某所でセイバーメトリクスと同等の走塁指標として計算される赤星式盗塁数(赤星式盗塁数=盗塁数 -(盗塁死数 * 2))では27(= 33 -(3*2))と赤星式盗塁数2位でパリーグ盗塁王金子の21(=41-(10*2))を大きく上回る結果を残しています。
この辺りの内容は既に多くのブログ等で計算されていますがBI等で分かりやすくまとめて表示するダッシュボードなんかも別途作ってみたいですね。

改善点

突貫で作ったので改善点は多々有りますが試合結果や日程と言った汎用的な表現をストップワード等で指定出来れば精度はより良くなりそうですね。また、今回は前提としてヤクルトスワローズのみのニュースを分析しましたが、これを12球団分収集する事でtf-idf値を上手く計算出来る様になるためtfの値が高い単語をワードクラウドの対象から外す事で改善が見込めそうです。

形態素解析解析のエンジンの改善も当然考えられます。今回は山田、村上、青木等主流の選手は素直に形態素解析が行えましたが、横浜Denaの今永昇太投手などは1文字ずつ分かち書きされるなどの結果となりましたので先ずは人名の判断を強化する必要が有りそうです。janomeにこだわるので有ればNPBのページをクローリングし、選手登録名のユーザー辞書を作成し反映させる形でしょうか。もっと手軽な所ではよくある手法ですがmecab-ipadic-NEologdを利用するなどでしょうか(google colaboratoryで使えるか未検証ですが…)

また、後半のワードクラウドの様に時期を1ヶ月やオールスター前後、ペナント終了後などに分けて実施するのも単純かつ効果が大きそうですね。

まとめ

長々とポエムを書き綴ってきましたが、普段とは違うアプローチでヤクルトスワローズを扱う事が出来て楽しかったです。何番煎じか分からないですけど余裕が出来たら12球団のニュースや各球団の応援歌でまたなんかやりたいですね。