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

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

#総評をダウンロード
とりあえず[KOTY据置wiki](https://koty.wiki/)からNokogiriで総評をゲットします。掲載されているのは2005年～2018年のものですね。ちなみに携帯とエロゲはスルーします。[^2]
各年の総評のURLは、

```
https://koty.wiki/(西暦)GC
```
で統一されているので、楽に取得できます。
特筆すべき点としては、

* 2005年～2008年
* 2010年～2011年
* 2012年～2018年

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

```Ruby: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603574/9166aed0-4b1a-74b1-b1a3-a15e6fced3f2.png)

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

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

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

**Pythonを使います**

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

1. [ここ](https://github.com/ikegami-yukino/mecab/releases)からWin64向けの野良ビルドインストーラをダウンロードし、UTF-8でインストール
2. [この記事](https://qiita.com/yukinoi/items/990b6933d9f21ba0fb43)を参考に`mecab`ライブラリをゲット

これだけ
地獄のDLL書き換えをしなくてもいいの、感動すら感じますわ、これは破壊的ですよもう、概念を破壊していますよ、パラダイムシフトですよ
#色々遊んだ
とりあえず2018年の総評を形態素解析してWordCloudで出力してみましょう。「名詞」だけを抽出する感じで行きます。

```Python: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603574/4c2ea987-c836-0623-b733-100ad717c1bf.png)
あーーーいい感じ、いい感じですよ
まさに形態素解析、って感じです！！！
これが例えば2007年のものだったら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603574/ed0d9c8a-a6fd-bb19-02d0-b56a48876b3b.png)
こんな風に**「シナリオ」**が目立ちますし、

2014年のものだったら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603574/3c8016d9-cd58-e248-8e98-210bfc423693.png)
**「ライダー」**系の言葉が目立ちます。
KOTYの総評にも、年ごとに個性があるってことですね。

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

```Python: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603574/c3c53aa3-2e3f-1918-3d8b-7049be2b42b5.png)
圧巻ですよ。
**「プレイヤー」**で、**「ゲーム」**で、**「クソゲー」**
KOTYの象徴って感じがしますね～～～～～

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

```Python: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603574/45c59658-3146-794f-6e15-1de0db35b5a5.png)
歴史ですよ。
**歴史を、感じちゃいますよ。**

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603574/d0961847-8ad2-187b-974a-28da3f5dede6.png)
**「それは組織じゃないでしょ」**ってものが大量に混ざっちゃったのでやめました。
辞書を変えればイケるかもしれませんね。

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

```Python: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603574/235e0612-049d-f9b1-d288-82554853acf7.png)
怖すぎる。
2015年がすごいことになってますね。おそらく「アジノコ」と「テトアル」というバグの二大巨塔がぶつかった結果でしょう。
あと、あまりのインパクトに隠れてますけど、2013年の**「バグ」が1個もない**状態もすごいですね。確かに2013年は、バグとはまた別の方向でのクソさが競われていたように思います。

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603574/23630927-a23b-0d6c-e2b9-5f0c2f3d866d.png)

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

#総括
楽しかったです

[^1]: 2/5ちゃんねるの「その年に一番クソだったゲーム」を決めるスレッド、「クソゲーオブザイヤー」の略称。
[^2]: 一年分に複数の文章を使うのは少し趣旨がずれることと、当方が未成年であることが理由です。