[PYTHON] En utilisant COTOHA, j'ai essayé de suivre le cours émotionnel de la course aux meros.

Tyrant Dionis: Ouais, que s'est-il passé?

Meros: Ça n'arrive pas!

Je voudrais lire sur "Running Melos" en utilisant l'analyse émotionnelle de COTOHA.

Flux de processus

  1. Obtenez le texte intégral de "Run Meros" auprès d'Aozora Bunko
  2. Exécutez le texte intégral de Melos à COTOHA (analyse des émotions).
  3. Tracez et analysez les valeurs émotionnelles.

Préparation préalable

Cloner la bibliothèque du ciel bleu


!git clone --branch master --depth 1 https://github.com/aozorabunko/aozorabunko.git

code

1. Obtenez le texte complet de "Run Meros" sur Aozora Bunko

Obtention du texte intégral de "Run Meros" auprès d'Aozora Bunko


from bs4 import BeautifulSoup

def get_word():

  #Spécifiez le chemin du html cloné(Exécuter meros)
  path_to_html='aozorabunko/cards/000035/files/1567_14913.html'
  
  #Analyse HTML avec Beautiful Soup
  with open(path_to_html, 'rb') as html:
    soup = BeautifulSoup(html, 'lxml')
  main_text = soup.find("div", class_='main_text')
  for yomigana in main_text.find_all(["rp","h4","rt"]):
    yomigana.decompose()
  sentences = [line.strip() for line in main_text.text.strip().splitlines()]
  aozora_text=','.join(sentences)

  aozora_text_list = aozora_text.split("。")
  return aozora_text_list
Obtention du texte intégral de "Run Meros" auprès de Aozora Bunko localement cloné. De plus, en l'état, l'API ne peut pas être utilisée (le nombre de caractères est grand) Il est divisé et organisé pour chaque signe de ponctuation.
2. Exécuter Le texte complet de Melos est appliqué à COTOHA (analyse des émotions).

Exécuter le texte intégral de Meros, COTOHA(Analyse des émotions)Je vais aller à.


mport os
import urllib.request
import json
import configparser
import codecs
import sys
import time


client_id = "Votre identifiant client"
client_secret = "Votre propre clé secrète"

developer_api_base_url = "https://api.ce-cotoha.com/api/dev/nlp/"
access_token_publish_url = "https://api.ce-cotoha.com/v1/oauth/accesstokens"

def cotoha_call(sentence_1,api_type):
    #Obtenez un jeton d'accès
    def getAccessToken():     
        url = access_token_publish_url
        headers={
            "Content-Type": "application/json;charset=UTF-8"
        }
        data = {
            "grantType": "client_credentials",
            "clientId": client_id,
            "clientSecret": client_secret
        }
        data = json.dumps(data).encode()
        req = urllib.request.Request(url, data, headers)
        res = urllib.request.urlopen(req)
        res_body = res.read()
        res_body = json.loads(res_body)
        access_token = res_body["access_token"]
        return access_token

    #Spécification d'URL de l'API(Extraction d'expression unique)
    base_url_footer = "v1/"  + api_type
    url = developer_api_base_url + base_url_footer
    headers={
        "Authorization": "Bearer " + getAccessToken(), #access_token,
        "Content-Type": "application/json;charset=UTF-8",
    }
    data = {
        "sentence": sentence_1
    }
    data = json.dumps(data).encode()
    time.sleep(0.5)
    req = urllib.request.Request(url, data, headers)
        
    try:
        res = urllib.request.urlopen(req)
    #Que faire si une erreur se produit dans la demande
    except urllib.request.HTTPError as e:
        #Si le code d'état est 401 Unauthorized ou 500 Internal Server Error, réacquérir le jeton d'accès et demander à nouveau
        if e.code == 401 or 500:
            access_token = getAccessToken()
            headers["Authorization"] = "Bearer " + access_token
            time.sleep(0.5)
            req = urllib.request.Request(url, data, headers)
            res = urllib.request.urlopen(req)
        #Si l'erreur est différente de 401 ou 500, la cause est affichée.
        else:
            print ("<Error> " + e.reason)
            #sys.exit()

    res_body = res.read()
    res_body = json.loads(res_body)
    return res_body


sentence = get_word()
end = len(a)
full_text = len(''.join(sentence))
sentiment_list = []
cnt = 0
wcnt = 0
for i in a:
  cnt+=1
  print(str(cnt)+ "/" + str(end))
  b = cotoha_call(i,"sentiment")
  sentiment_list.append([b['result']['sentiment'],b['result']['score'],i,wcnt])
  wcnt+=len(i)

La partie où tout le texte du "Run Meros" arrangé est appliqué à COTOHA (analyse des émotions). En passant, si vous divisez la phrase entière de "Run Meros" avec des points de ponctuation, elle sera divisée en 460 morceaux. Autrement dit, il appelle l'API 460 fois. (* COTOHA est limité à 1000 appels API par jour s'il s'agit d'une trame gratuite.)

<détails> <résumé> 3. Représentez graphiquement les nombres. </ résumé>

Représentez graphiquement les nombres.


#Bibliothèque utilisée pour le calcul numérique
import numpy as np
import pandas as pd
import seaborn as sns

#Bibliothèque pour dessiner des graphiques
from matplotlib import pyplot as plt

#Spécification pour l'affichage du graphique dans colab
%matplotlib inline

#Ajuster les valeurs du graphique
graph_x = []
graph_y = []
for i in sentiment_list:
  graph_x.append(i[3])
  if(i[0] == 'Negative'):
    tmp_y = (i[1] * -1) + (-1)
    graph_y.append(tmp_y)

  if(i[0] == 'Positive'):
    tmp_y = i[1]+1
    graph_y.append(tmp_y)
  
  if(i[0] == 'Neutral'):
    graph_y.append(i[1])

sns.set()

#plt.plot(x, y, color = 'black')
plt.figure(figsize=(40, 8), dpi=100)
plt.plot(graph_x, graph_y, color = 'red', marker = 'o', linestyle = '-', label = 'Sensor1')
#plt.xlim([0,5000])
plt.title("Run, Melos,")
plt.xlabel("Sentence")
plt.ylabel("Emotion")
J'utilise matplotlib pour créer un graphique linéaire des résultats de l'analyse des émotions. De plus, si vous appliquez simplement COTOHA, il ne sera classé que comme neutre, négatif, positif Puisque toutes les valeurs sont dans la même plage de 0 à 1, nous définissons le décalage pour le graphique. +1 si positif S'il est négatif, rendez la valeur négative et + (-1) S'il est neutre, il ne fait rien.

Résultat de sortie

Graphique linéaire meros_graph.png

L'axe vertical est l'émotion et l'axe horizontal est la position du texte de chaque phrase. Il existe toute une gamme de fluctuations émotionnelles.

Analyse du côté positif

Principales phrases positives No1 ~ 3


[1.8126587191707609, 'J'ai aussi acheté un beau costume']
[1.6346889479386029, 'Votre vie est importante maintenant'],
[1.633215237292569, 'Le jeune maçon a également crié, courant après Meros.']

La phrase la plus positive est ** "J'ai acheté un beau costume" **, avec une grande différence de score entre la 2ème et la 3ème place.

C'est une phrase dans la conversation entre "Meros" et "Sister" quand "Meros" est retourné au village. Je pense que j'étais très heureux d'avoir pu courir du village à la ville et remettre les costumes que j'avais achetés à ma sœur. (C'est le but initial de Meros en premier lieu.)

Phrases avant et après la phrase qui semble la plus positive(référence)


J'ai été surpris de retrouver l'apparence épuisée de mon frère qui titubait et marchait. Puis j'ai posé une question à mon frère bruyant.
"Rien." Melos essaya de le forcer à rire. «J'ai laissé quelque chose à faire en ville. Je dois retourner bientôt en ville. Demain, j'aurai ton mariage.
Ma sœur a levé les joues.
"Je suis heureux. J'ai acheté un beau costume. Maintenant, allez faire savoir aux villageois. Le mariage est demain."
Meros a également chancelé, est rentré chez lui pour décorer l'autel des dieux, a organisé un festin, et est rapidement tombé au sol et est tombé dans un sommeil profond qui ne pouvait plus respirer.

Analyse du côté négatif

Phrase la plus négative Top No1 ~ 3


[-1.9459608426670426, 'Ne laisse pas l'homme mourir']
[-1.939408157054805, 'Même si c'est un moment, ça ne peut pas être gaspillé']
[-1.8666593927565555, 'Oh, le soleil se couche']

Les première et deuxième places ne ressemblent pas à des phrases négatives, elles ne semblent donc pas correctes. («Die», «Waste» Ce mot semble en être la cause.)

Alors, n'est-ce pas la phrase pratiquement la plus négative ** "Oh, le soleil se couche" **?

C'est une phrase alors que je retourne en ville de toutes mes forces avant la date limite pour libérer mon ami Serinuntius qui est un otage.

De multiples difficultés se dressent devant Meros, mais nous les surmonterons Même si je m'agenouille finalement une fois, diverses pensées circulent et dans la représentation qui se redresse C'est une représentation de la partie que le temps passe à chaque instant en faisant cela.

Phrases avant et après la phrase qui semble être la plus négative(référence)


Courir! Meros.
J'ai confiance. J'ai confiance. Ce murmure du diable plus tôt était un rêve. C'est un mauvais rêve. Oublie.
Quand les cinq organes sont fatigués, ils font un si mauvais rêve. Meros, ce n'est pas votre honte.
Après tout, vous êtes un vrai héros. N'est-il pas possible de se lever et de courir à nouveau? Je vous remercie!
Je peux mourir en tant que combattant de la justice. Oh, le soleil se couche. Il coule régulièrement. Attends, Zeus.
Je suis un honnête homme depuis ma naissance. Laissez-le comme un honnête homme et laissez-le mourir.

Si vous analysez la valeur émotionnelle en blocs ...

Si vous regardez le négatif et le positif de la valeur émotionnelle, la partie où chacun est organisé en blocs, c'est comme suit.

Affichage de la carte de dispersion


#plt.plot(graph_x, graph_y, color = 'red', marker = 'o', linestyle = '-', label = 'Sensor1')
plt.scatter(graph_x, graph_y, color = 'red', marker = 'o', linestyle = '-', label = 'Sensor1')
Nuage de points

meros_scat.png

Blocs avec les valeurs les plus positives consécutives (entourés en orange)

python


J'espère remplir l'obligation.
J'espère me tuer et protéger mon honneur.
Le soleil jette une lumière rouge sur les feuilles des arbres, et les feuilles et les branches brillent en brûlant.
Il est encore temps avant le coucher du soleil. Quelqu'un m'attend.
Il y a des gens qui m'attendent tranquillement sans aucun doute.
Je suis cru. Mon mystère de vie n'a pas d'importance. Je ne peux rien dire de gentil d'être mort et de m'excuser.
Je dois récompenser ma confiance. C'est juste une chose maintenant.
Courir! Meros.
J'ai confiance. J'ai confiance. Ce murmure du diable plus tôt était un rêve. C'est un mauvais rêve. Oublie.
Quand les cinq organes sont fatigués, ils font un si mauvais rêve. Meros, ce n'est pas votre honte.
Après tout, vous êtes un vrai héros. N'est-il pas possible de se lever et de courir à nouveau?
Je vous remercie! Je peux mourir en tant que combattant de la justice.

C'est une représentation de Melos, qui s'est agenouillé une fois, quand il se relève. Vous pouvez lire les émotions accrues. (À propos, c'est la phrase immédiatement avant la phrase la plus négative décrite ci-dessus.)

Blocs avec les valeurs les plus négatives consécutives (marqués en bleu)

python


Si cela arrive, je serai plus dur que de mourir. Je suis un traître pour toujours. La race la plus honteuse du monde.
Serinuntius, je mourrai aussi. Laisse-moi mourir avec toi. Seulement, vous devez me croire.
Non, est-ce aussi mon égoïsme? Ah, survivons en tant que méchant.
Ma maison est dans le village. Il y a aussi des moutons. Ma sœur et son mari ne voulaient jamais me chasser du village.

C'est une représentation quand on essaie de renoncer à aider un ami Seriuntius. Certainement, il est jeté. (Après cela, je jette mes membres, et quand je tombe enfin malade, je deviens somnolent.)

Résumé

~~ De la valeur émotionnelle positive, j'ai pensé que Melos était un syscon. ~~

C'est facile, mais j'ai essayé de lire "Run Meros" en utilisant l'analyse des émotions. C'est assez intéressant de lire les phrases comme ça.

c'est tout. Merci d'avoir lu jusqu'ici.

Recommended Posts

En utilisant COTOHA, j'ai essayé de suivre le cours émotionnel de la course aux meros.
J'ai essayé d'extraire et d'illustrer l'étape de l'histoire à l'aide de COTOHA
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
J'ai essayé de toucher l'API COTOHA
J'ai essayé d'obtenir l'index de la liste en utilisant la fonction énumérer
J'ai essayé de transformer l'image du visage en utilisant sparse_image_warp de TensorFlow Addons
J'ai essayé d'obtenir les résultats de Hachinai en utilisant le traitement d'image
J'ai essayé de corriger la forme trapézoïdale de l'image
J'ai essayé l'histoire courante de l'utilisation du Deep Learning pour prédire la moyenne Nikkei
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 prédire la détérioration de la batterie lithium-ion en utilisant le SDK Qore
J'ai essayé de notifier la mise à jour de "Hameln" en utilisant "Beautiful Soup" et "IFTTT"
[Python] J'ai essayé de juger l'image du membre du groupe d'idols en utilisant Keras
J'ai essayé de résumer la forme de base de GPLVM
J'ai essayé d'approcher la fonction sin en utilisant le chainer
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é d'identifier la langue en utilisant CNN + Melspectogram
J'ai essayé de compléter le graphe de connaissances en utilisant OpenKE
J'ai essayé de classer les voix des acteurs de la voix
J'ai essayé de compresser l'image en utilisant l'apprentissage automatique
J'ai essayé de résumer les opérations de chaîne de Python
J'ai essayé de prédire la victoire ou la défaite de la Premier League en utilisant le SDK Qore
J'ai essayé de notifier la mise à jour de "Devenir romancier" en utilisant "IFTTT" et "Devenir un romancier API"
Python pratique 100 coups J'ai essayé de visualiser l'arbre de décision du chapitre 5 en utilisant graphviz
J'ai essayé d'extraire le texte du fichier image en utilisant Tesseract du moteur OCR
[Courses de chevaux] J'ai essayé de quantifier la force du cheval de course
[Première API COTOHA] J'ai essayé de résumer l'ancienne histoire
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é de simuler l'optimisation des publicités à l'aide de l'algorithme Bandit
J'ai essayé la reconnaissance faciale du problème du rire en utilisant Keras.
[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 essayé d'approcher la fonction sin en utilisant chainer (re-challenge)
J'ai essayé de sortir le journal d'accès au serveur en utilisant Node.js
Je voulais faire fonctionner le moteur avec une tarte à la râpe, alors j'ai essayé d'utiliser la carte de commande du moteur de Waveshare
J'ai essayé d'utiliser GrabCut d'OpenCV
J'ai essayé de prédire l'infection d'une nouvelle pneumonie en utilisant le modèle SIR: ☓ Wuhan edition ○ Hubei province edition
J'ai essayé de déplacer le ballon
J'ai essayé d'automatiser la construction d'un environnement pratique à l'aide de l'API SoftLayer d'IBM Cloud
J'ai essayé d'utiliser l'API checkio
J'ai essayé d'estimer la section.
[Linux] J'ai essayé de résumer les commandes de confirmation des ressources
J'ai essayé d'obtenir une base de données sur les courses de chevaux en utilisant Pandas
J'ai essayé d'automatiser l'arrosage du pot avec Raspberry Pi
J'ai essayé de créer une expression régulière de "temps" en utilisant Python
J'ai essayé de créer l'image de démarrage SD de LicheePi Nano
Je voulais contester la classification du CIFAR-10 en utilisant l'entraîneur de Chainer
J'ai essayé de créer une expression régulière de "date" en utilisant Python
J'ai essayé d'utiliser l'API COTOHA (il y a aussi du code sur GitHub)
J'ai regardé les méta-informations de BigQuery et essayé de les utiliser
J'ai essayé de numériser le tampon estampé sur papier en utilisant OpenCV
J'ai essayé d'obtenir une liste de noms AMI en utilisant Boto3
J'ai essayé d'agrandir la taille du volume logique avec LVM