3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

クソゲーオブザイヤーの総評を形態素解析してみた

Last updated at Posted at 2020-04-04

形態素解析で遊ぼうと思います。

前置き

この前KOTY1の選評を暇つぶしに読んでいたら、ふと
**「これまでのKOTYの総評を形態素解析したら楽しいんじゃないだろうか」**と思いつきました。
形態素解析はやったことなかったので、勉強も兼ねてやってみたいと思います。

総評をダウンロード

とりあえずKOTY据置wikiからNokogiriで総評をゲットします。掲載されているのは2005年~2018年のものですね。ちなみに携帯とエロゲはスルーします。2
各年の総評のURLは、

https://koty.wiki/(西暦)GC

で統一されているので、楽に取得できます。
特筆すべき点としては、

  • 2005年~2008年
  • 2010年~2011年
  • 2012年~2018年

の三期間においてそれぞれ総評のHTMLソースにおける記載方法が違うため、この3つのパターンでそれぞれ別の処理をしたことくらいでしょうか。
Nokogiriで取得するコードはこちら

KOTY_Scrape.rb
require 'nokogiri'
require 'open-uri'
if ! Dir::exist?("KOTY総評") #保存用フォルダ作成
    Dir::mkdir("KOTY総評")
end
for year in 2005..2018 do #フォルダ内のテキストファイルを初期化
    File.open("KOTY総評/#{year}年.txt","w") do |text|
    end
end
for year in 2005..2009 do #body内のp要素の中が本文、pとpの間にbrを挟んでいない
    sleep 1
    doc = Nokogiri::HTML(URI.open("https://koty.wiki/#{year}GC"))
    doc.xpath("//div[@id='body']//p").each do |paragraph|
        File.open("KOTY総評/#{year}年.txt","a") do |text|
            text.puts paragraph.inner_text
        end
    end
end
for year in 2010..2011 do #HTMLソースでは改行がなく、brタグだけで改行をしている
    sleep 1
    doc = Nokogiri::HTML(URI.open("https://koty.wiki/#{year}GC"))
    comment = doc.xpath("//p[@class='aapro']")
    comment.search('br').each do |br|
        br.replace("\n")
    end
    File.open("KOTY総評/#{year}年.txt","a") do |text|
        text.puts comment.inner_text
    end
end
for year in 2011..2018 do #blockquote要素内に記述
    sleep 1
    doc = Nokogiri::HTML(URI.open("https://koty.wiki/#{year}GC"))
    File.open("KOTY総評/#{year}年.txt","a") do |text|
        text.puts doc.xpath("//blockquote").inner_text
    end
end

これで取得できました。
こんな感じ
image.png

こうして見ると、年を追うごとにファイルサイズが肥大化する傾向にあるように思えますね。

ここで問題が

エーーーットあの、僕はWindows64/Ruby/Mecabでね、形態素解析しようと当初計画してたんですけども
**「Win64」かつ「Ruby」「Mecab」**というのは・・・・・・・・・
非常に、環境構築がめんどくさいんですね

いや、挑戦はしてみたんですよ、二回くらい
既存の記事を色々読んでやってみたんですけど……ダメなものはダメです
あの、そういうわけで・・・・・・・・・

Pythonを使います

環境構築

まぁはい、環境構築します
Python/Win64でMecabを使うのはかなり簡単で、すぐにできます

  1. ここからWin64向けの野良ビルドインストーラをダウンロードし、UTF-8でインストール
  2. この記事を参考にmecabライブラリをゲット

これだけ
地獄のDLL書き換えをしなくてもいいの、感動すら感じますわ、これは破壊的ですよもう、概念を破壊していますよ、パラダイムシフトですよ

色々遊んだ

とりあえず2018年の総評を形態素解析してWordCloudで出力してみましょう。「名詞」だけを抽出する感じで行きます。

MecabKOTY.py
import MeCab
from wordcloud import WordCloud
t = MeCab.Tagger()

with open('KOTY総評/2018年.txt',encoding="UTF-8") as txt_file:
    text = txt_file.read()

nodes = t.parseToNode(text)
s = []

while nodes:
    if nodes.feature[:2] in ['名詞']:
        s.append(nodes.surface)
    nodes = nodes.next

wc = WordCloud(width=720, height=480, background_color="black",stopwords=
    {"これ", "ため", "それ", "よう", "こと", "もの"}
    , font_path="C:\Windows\Fonts\HGRGE.TTC")
wc.generate(" ".join(s))
wc.to_file('KOTY_wc.png')

image.png
あーーーいい感じ、いい感じですよ
まさに形態素解析、って感じです!!!
これが例えば2007年のものだったら
image.png
こんな風に**「シナリオ」**が目立ちますし、

2014年のものだったら
image.png
**「ライダー」**系の言葉が目立ちます。
KOTYの総評にも、年ごとに個性があるってことですね。

次は全ての総評を合わせて解析してみましょう。

MecabKOTY.py
import MeCab
from wordcloud import WordCloud
t = MeCab.Tagger()
s = []

for y in range(2005,2018):
    with open(f'KOTY総評/{y}年.txt',encoding="UTF-8") as txt_file:
        text = txt_file.read()
    nodes = t.parseToNode(text)
    while nodes:
        if nodes.feature[:2] == "名詞":
            s.append(nodes.surface)
        nodes = nodes.next

wc = WordCloud(width=720, height=480, background_color="black",stopwords=
    {"これ", "ため", "それ", "よう", "こと", "もの"}
    , font_path="C:\Windows\Fonts\HGRGE.TTC")
wc.generate(" ".join(s))
wc.to_file('KOTY_wc.png')

こうなります。
image.png
圧巻ですよ。
「プレイヤー」で、「ゲーム」で、「クソゲー」
KOTYの象徴って感じがしますね~~~~~

さて、さらにこれを絞って、固有名詞のみ抽出するようにしてみたらどうなるでしょう

MecabKOTY.py
import MeCab
from wordcloud import WordCloud
t = MeCab.Tagger()
s = []

for y in range(2005,2018):
    with open(f'KOTY総評/{y}年.txt',encoding="UTF-8") as txt_file:
        text = txt_file.read()
    nodes = t.parseToNode(text)
    while nodes:
        if nodes.feature[:7] == "名詞,固有名詞":
            s.append(nodes.surface)
        nodes = nodes.next

wc = WordCloud(width=720, height=480, background_color="black"
    , font_path="C:\Windows\Fonts\HGRGE.TTC")
wc.generate(" ".join(s))
wc.to_file('KOTY_wc.png')

image.png
歴史ですよ。
歴史を、感じちゃいますよ。

ちなみに、これをさらに絞って**「組織名」に限定することで、「クソゲーメーカー」**を抽出できないかな~~~と思ったんですけど、

image.png
**「それは組織じゃないでしょ」**ってものが大量に混ざっちゃったのでやめました。
辞書を変えればイケるかもしれませんね。

次はちょっと趣向を変えてみましょう。**「年ごとの特定単語の頻出度の推移」を調べます。
最初に調べるのは……えーっと、
「バグ」**にしましょうか。
matplotlibで折れ線グラフを描いていきます。

KOTYPlot.py
import MeCab
from wordcloud import WordCloud
import matplotlib.pyplot as plt
t = MeCab.Tagger()
c = []
for y in range(2005, 2018):
    c.append(0)
    with open(f'KOTY総評/{y}年.txt',encoding="UTF-8") as txt_file:
        text = txt_file.read()
    nodes = t.parseToNode(text)
    while nodes:
        if nodes.surface == "バグ":
            c[-1] += 1
        nodes = nodes.next

plt.plot(range(2005, 2018), c, linewidth=4)
plt.xlabel("Year", fontsize = 24)
plt.ylabel("Occurrence:Bug", fontsize=24)
plt.grid(True)
plt.savefig("KOTYgraph.png")

image.png
怖すぎる。
2015年がすごいことになってますね。おそらく「アジノコ」と「テトアル」というバグの二大巨塔がぶつかった結果でしょう。
あと、あまりのインパクトに隠れてますけど、2013年の**「バグ」が1個もない**状態もすごいですね。確かに2013年は、バグとはまた別の方向でのクソさが競われていたように思います。

次にグラフを作る単語は……**「年末」**にしましょう。

image.png

!?!?!??!??!?
なんかめっちゃ規則性を感じますね!?!?
なんというかこう、ジェットコースター型ですね。上るのは一瞬で下りるのにはちょっと
時間がかかる感じ
「年末の魔物」の出現にはある程度周期性があるんでしょうかね。

総括

楽しかったです

  1. 2/5ちゃんねるの「その年に一番クソだったゲーム」を決めるスレッド、「クソゲーオブザイヤー」の略称。

  2. 一年分に複数の文章を使うのは少し趣旨がずれることと、当方が未成年であることが理由です。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?