[PYTHON] J'ai essayé l'analyse morphologique du commentaire général du putain de jeu de l'année

Je jouerai avec l'analyse morphologique.

Préface

Alors que je lisais la sélection de KOTY [^ 1] pour tuer le temps l'autre jour, tout à coup ** J'ai eu l'idée qu'il serait amusant d'analyser les critiques globales de KOTY jusqu'à présent. Je n'ai jamais fait d'analyse morphologique, donc j'aimerais le faire comme une étude.

Télécharger la revue générale

Pour le moment, obtenez un avis général sur Nokogiri sur KOTY Deferred wiki. C'est de 2005 à 2018, n'est-ce pas? À propos, les téléphones portables et les eroge passeront. [^ 2] L'URL de la revue générale de chaque année est

https://koty.wiki/(UN D)GC

Parce qu'il est unifié, vous pouvez facilement l'obtenir. Il est à noter en particulier

Puisque la méthode de description dans la source HTML du commentaire général est différente dans chacune des trois périodes, je me demande si ces trois modèles ont été traités différemment. Cliquez ici pour le code à obtenir avec Nokogiri

KOTY_Scrape.rb


require 'nokogiri'
require 'open-uri'
if ! Dir::exist?("Commentaire général de KOTY") #Créer un dossier à enregistrer
    Dir::mkdir("Commentaire général de KOTY")
end
for year in 2005..2018 do #Initialisez le fichier texte dans le dossier
    File.open("Commentaire général de KOTY/#{year}Année.txt","w") do |text|
    end
end
for year in 2005..2009 do #À l'intérieur de l'élément p dans le corps se trouve le corps, br n'est pas pris en sandwich entre p et p
    sleep 1
    doc = Nokogiri::HTML(URI.open("https://koty.wiki/#{year}GC"))
    doc.xpath("//div[@id='body']//p").each do |paragraph|
        File.open("Commentaire général de KOTY/#{year}Année.txt","a") do |text|
            text.puts paragraph.inner_text
        end
    end
end
for year in 2010..2011 do #Il n'y a pas de rupture dans la source HTML, seule la balise br est cassée
    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("Commentaire général de KOTY/#{year}Année.txt","a") do |text|
        text.puts comment.inner_text
    end
end
for year in 2011..2018 do #Décrit dans l'élément blockquote
    sleep 1
    doc = Nokogiri::HTML(URI.open("https://koty.wiki/#{year}GC"))
    File.open("Commentaire général de KOTY/#{year}Année.txt","a") do |text|
        text.puts doc.xpath("//blockquote").inner_text
    end
end

Je l'ai maintenant. Comme ça image.png

En regardant les choses comme ça, il semble que la taille du fichier a tendance à augmenter chaque année.

Le problème ici

Ah, je prévoyais à l'origine d'analyser la morphologie sous Windows64 / Ruby / Mecab. ** "Win64" ** et ** "Ruby" ** et ** "Mecab" ** est ... Il est très difficile de créer un environnement.

Non, je l'ai essayé, environ deux fois J'ai lu divers articles existants, mais ... ** Les mauvais sont mauvais ** Voilà pourquoi ...

** Utilisez Python **

Environnement

Eh bien oui, construisez l'environnement Utiliser Mecab sur Python / Win64 est assez simple et rapide

  1. Téléchargez le programme d'installation de build erroné pour Win64 depuis ici et installez-le avec UTF-8.
  2. Obtenez la bibliothèque mecab en vous référant à cet article

seulement ça Vous n'êtes pas obligé de réécrire la DLL en enfer, je suis même impressionné, c'est destructeur, cela détruit le concept, c'est un changement de paradigme.

J'ai beaucoup joué

Pour le moment, analysons la revue globale de 2018 par morphologie et sortons-la avec WordCloud. J'irai avec le sentiment d'extraire uniquement des "noms".

MecabKOTY.py


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

with open('Commentaire général de 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 ['nom']:
        s.append(nodes.surface)
    nodes = nodes.next

wc = WordCloud(width=720, height=480, background_color="black",stopwords=
    {"cette", "Pour", "Il", "Yo", "chose", "chose"}
    , font_path="C:\Windows\Fonts\HGRGE.TTC")
wc.generate(" ".join(s))
wc.to_file('KOTY_wc.png')

image.png Ahh, ça fait du bien, ça fait du bien C'est comme une analyse morphologique! !! !! Si c'était pour 2007, par exemple image.png ** "Scénario" ** se distingue comme ça,

Si c'était à partir de 2014 image.png ** Les mots "Rider" ** ressortent. Le commentaire général de KOTY a également sa propre individualité chaque année.

Ensuite, analysons ensemble toutes les critiques globales.

MecabKOTY.py


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

for y in range(2005,2018):
    with open(f'Commentaire général de KOTY/{y}Année.txt',encoding="UTF-8") as txt_file:
        text = txt_file.read()
    nodes = t.parseToNode(text)
    while nodes:
        if nodes.feature[:2] == "nom":
            s.append(nodes.surface)
        nodes = nodes.next

wc = WordCloud(width=720, height=480, background_color="black",stopwords=
    {"cette", "Pour", "Il", "Yo", "chose", "chose"}
    , font_path="C:\Windows\Fonts\HGRGE.TTC")
wc.generate(" ".join(s))
wc.to_file('KOTY_wc.png')

Ce sera comme ça. image.png C'est un chef d'oeuvre. ** "Joueur" **, ** "Jeu" **, ** "Jeu putain" ** Cela ressemble à un symbole de KOTY ~~~~~

Maintenant, que se passe-t-il si nous restreignons cela davantage et essayons d'extraire uniquement la nomenclature appropriée?

MecabKOTY.py


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

for y in range(2005,2018):
    with open(f'Commentaire général de KOTY/{y}Année.txt',encoding="UTF-8") as txt_file:
        text = txt_file.read()
    nodes = t.parseToNode(text)
    while nodes:
        if nodes.feature[:7] == "nom,固有nom":
            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 C'est de l'histoire. ** Vous pouvez ressentir l'histoire. ** **

Au fait, je me demandais si je pouvais extraire ** "putain de créateur de jeux" ** en le réduisant davantage et en le limitant à ** "nom de l'organisation" **.

image.png ** "Ce n'est pas une organisation" ** J'ai arrêté parce qu'il y avait beaucoup de choses mélangées. Cela pourrait être cool si vous changez de dictionnaire.

Ensuite, changeons un peu le goût. ** Cochez "Changements dans la fréquence de certains mots par année" **. La première chose à rechercher est ... eh bien, faisons-en un ** "bug" **. Je vais dessiner un graphique linéaire avec 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'Commentaire général de KOTY/{y}Année.txt',encoding="UTF-8") as txt_file:
        text = txt_file.read()
    nodes = t.parseToNode(text)
    while nodes:
        if nodes.surface == "punaise":
            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 trop effrayant. 2015 va être incroyable. Probablement le résultat de la collision des deux grandes tours d'insectes, "Ajinoko" et "Tetaru". De plus, il est caché dans l'impact, mais l'état de 2013 sans ** "bugs" est incroyable. Certes, en 2013, je pense qu'il y avait une concurrence pour la merde dans une direction différente des bugs.

Le mot suivant pour créer un graphique est ... ** "Fin d'année" **.

image.png

!?!?!??!??!? Je ressens beaucoup de régularité! ?? !! ?? C'est un type de jet coaster, n'est-ce pas? C'est un peu de monter en un instant Sentir que ça prend du temps Je me demande si l'apparition des "monstres de fin d'année" a une certaine périodicité.

Résumé

c'était amusant

[^ 1]: 2/5 Abréviation de la chaîne pour "Fucking Game of the Year", le fil de discussion qui décide "du jeu le plus putain de l'année". [^ 2]: La raison d'utiliser plusieurs phrases pendant un an est que c'est un peu hors de propos et que nous sommes mineurs.

Recommended Posts

J'ai essayé l'analyse morphologique du commentaire général du putain de jeu de l'année
J'ai essayé l'analyse par grappes de la carte météo
J'ai essayé l'analyse morphologique et la vectorisation de mots
J'ai essayé le serveur asynchrone de Django 3.0
J'ai essayé la fonction de tableau croisé dynamique des pandas
J'ai essayé l'analyse du SRAS avant le virus corona
J'ai essayé d'utiliser le filtre d'image d'OpenCV
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
J'ai essayé de résumer la forme de base de GPLVM
J'ai essayé le tutoriel MNIST de tensorflow pour les débutants.
J'ai essayé de prédire le match de la J League (analyse des données)
[OpenCV / Python] J'ai essayé l'analyse d'image de cellules avec OpenCV
J'ai essayé d'utiliser l'API de Sakenowa Data Project
J'ai essayé de visualiser les informations spacha de VTuber
J'ai essayé d'effacer la partie négative de Meros
J'ai essayé de gratter la publicité du site de dessin animé piraté
J'ai essayé la méthode la plus simple de classification de documents multi-étiquettes
J'ai essayé de classer les voix des acteurs de la voix
J'ai essayé d'exécuter l'exemple de code du module Ansible
J'ai essayé de résumer les opérations de chaîne de Python
J'ai essayé de trouver l'entropie de l'image avec python
[Courses de chevaux] J'ai essayé de quantifier la force du cheval de course
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
J'ai essayé d'obtenir les informations de localisation du bus Odakyu
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai essayé de refactoriser le modèle CNN de TensorFlow en utilisant TF-Slim
J'ai essayé la reconnaissance faciale du problème du rire en utilisant Keras.
Analyse des émotions avec traitement du langage naturel! J'ai essayé de prédire l'évaluation à partir du texte de l'avis
J'ai essayé la bibliothèque changefinder!
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
J'ai essayé un peu le comportement de la fonction zip
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
J'ai essayé de combattre le minimum local de la fonction Goldstein-Price
J'ai affiché le chat de YouTube Live et essayé de jouer
[Linux] J'ai essayé de résumer les commandes de confirmation des ressources
J'ai essayé d'obtenir l'index de la liste en utilisant la fonction énumérer
J'ai essayé de créer l'image de démarrage SD de LicheePi Nano
J'ai regardé les méta-informations de BigQuery et essayé de les utiliser
J'ai essayé de faire 5 modèles de base d'analyse en 3 ans
J'ai essayé d'agrandir la taille du volume logique avec LVM
J'ai essayé d'exécuter la partie DNN d'OpenPose avec le processeur Chainer
De l'introduction de JUMAN ++ à l'analyse morphologique du japonais avec Python
J'ai essayé de résumer la méthode de mise en œuvre fréquemment utilisée de pytest-mock
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
J'ai essayé de visualiser la condition commune des téléspectateurs de la chaîne VTuber
J'ai essayé le tutoriel TensorFlow 1er
J'ai essayé le roman Naro API 2
J'ai étudié le mécanisme de connexion flask!
J'ai essayé le tutoriel TensorFlow 2ème
Revue des bases de Python (FizzBuzz)
J'ai essayé l'API du roman Naruro
J'ai joué avec Mecab (analyse morphologique)!
J'ai essayé de déplacer le ballon
J'ai essayé d'utiliser l'API checkio
J'ai essayé d'estimer la section.
J'ai essayé de transformer l'image du visage en utilisant sparse_image_warp de TensorFlow Addons