形態素解析で遊ぼうと思います。
前置き
この前KOTY1の選評を暇つぶしに読んでいたら、ふと
**「これまでのKOTYの総評を形態素解析したら楽しいんじゃないだろうか」**と思いつきました。
形態素解析はやったことなかったので、勉強も兼ねてやってみたいと思います。
総評をダウンロード
とりあえずKOTY据置wikiからNokogiriで総評をゲットします。掲載されているのは2005年~2018年のものですね。ちなみに携帯とエロゲはスルーします。2
各年の総評のURLは、
https://koty.wiki/(西暦)GC
で統一されているので、楽に取得できます。
特筆すべき点としては、
- 2005年~2008年
- 2010年~2011年
- 2012年~2018年
の三期間においてそれぞれ総評のHTMLソースにおける記載方法が違うため、この3つのパターンでそれぞれ別の処理をしたことくらいでしょうか。
Nokogiriで取得するコードはこちら
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
こうして見ると、年を追うごとにファイルサイズが肥大化する傾向にあるように思えますね。
ここで問題が
エーーーットあの、僕はWindows64/Ruby/Mecabでね、形態素解析しようと当初計画してたんですけども
**「Win64」かつ「Ruby」で「Mecab」**というのは・・・・・・・・・
非常に、環境構築がめんどくさいんですね
いや、挑戦はしてみたんですよ、二回くらい
既存の記事を色々読んでやってみたんですけど……ダメなものはダメです
あの、そういうわけで・・・・・・・・・
Pythonを使います
環境構築
まぁはい、環境構築します
Python/Win64でMecabを使うのはかなり簡単で、すぐにできます
これだけ
地獄のDLL書き換えをしなくてもいいの、感動すら感じますわ、これは破壊的ですよもう、概念を破壊していますよ、パラダイムシフトですよ
色々遊んだ
とりあえず2018年の総評を形態素解析してWordCloudで出力してみましょう。「名詞」だけを抽出する感じで行きます。
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')
あーーーいい感じ、いい感じですよ
まさに形態素解析、って感じです!!!
これが例えば2007年のものだったら
こんな風に**「シナリオ」**が目立ちますし、
2014年のものだったら
**「ライダー」**系の言葉が目立ちます。
KOTYの総評にも、年ごとに個性があるってことですね。
次は全ての総評を合わせて解析してみましょう。
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')
こうなります。
圧巻ですよ。
「プレイヤー」で、「ゲーム」で、「クソゲー」
KOTYの象徴って感じがしますね~~~~~
さて、さらにこれを絞って、固有名詞のみ抽出するようにしてみたらどうなるでしょう
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')
ちなみに、これをさらに絞って**「組織名」に限定することで、「クソゲーメーカー」**を抽出できないかな~~~と思ったんですけど、
**「それは組織じゃないでしょ」**ってものが大量に混ざっちゃったのでやめました。
辞書を変えればイケるかもしれませんね。
次はちょっと趣向を変えてみましょう。**「年ごとの特定単語の頻出度の推移」を調べます。
最初に調べるのは……えーっと、「バグ」**にしましょうか。
matplotlibで折れ線グラフを描いていきます。
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")
怖すぎる。
2015年がすごいことになってますね。おそらく「アジノコ」と「テトアル」というバグの二大巨塔がぶつかった結果でしょう。
あと、あまりのインパクトに隠れてますけど、2013年の**「バグ」が1個もない**状態もすごいですね。確かに2013年は、バグとはまた別の方向でのクソさが競われていたように思います。
次にグラフを作る単語は……**「年末」**にしましょう。
!?!?!??!??!?
なんかめっちゃ規則性を感じますね!?!?
なんというかこう、ジェットコースター型ですね。上るのは一瞬で下りるのにはちょっと
時間がかかる感じ
「年末の魔物」の出現にはある程度周期性があるんでしょうかね。
総括
楽しかったです