[PYTHON] J'ai essayé d'extraire et d'illustrer l'étape de l'histoire à l'aide de COTOHA

Aperçu

Si l'étape de l'histoire est locale, c'est le type que vous lisez tout seul J'ai essayé d'extraire et d'illustrer l'étape de l'histoire en utilisant l'extraction d'expression unique de COTOHA.

Flux de processus

  1. Obtenez n'importe quel roman d'Aozora Bunko
  2. Obtenez uniquement le nom de lieu (LOC) avec l'API COTOHA (extraire l'expression unique)
  3. Utilisez le nom de lieu acquis pour illustrer avec WordCroud.

environnement

Google Colaboratory

Bibliothèque

-Wordcloud est le seul qui doit être installé individuellement. (Google Colaboratory est pratique car certaines bibliothèques sont déjà installées)   Exécutez la commande suivante pour terminer la préparation.

Installer wordcloud et télécharger des polices


!pip install wordcloud
!apt-get -y install fonts-ipafont-gothic
!rm /root/.cache/matplotlib/fontlist-v300.json

Cloner la bibliothèque du ciel bleu


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

code

1. La partie pour obtenir un roman arbitraire d'Aozora Bunko

La partie pour obtenir n'importe quel roman d'Aozora Bunko


from bs4 import BeautifulSoup

def get_word():

  #Spécifiez le chemin du html cloné(L'échantillon est le bon achat d'Osamu Osamu)
  path_to_html='aozorabunko/cards/000035/files/258_20179.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)

  #Divisé par le nombre de caractères pour l'appel d'API cotoha(Tous les 1800 caractères)
  aozora_text_list = [aozora_text[i: i+1800] for i in range(0, len(aozora_text), 1800)]
  return aozora_text_list
Obtenez le texte complet en spécifiant le chemin (path_to_html) de tout roman de la bibliothèque blue sky cloné à partir de Git J'analyse avec Beautiful Soup. (Au fait, l'échantillon est le bon achat d'Osamu Osamu)

De plus, la chaîne de caractères est divisée en 1800 caractères et arrangée de manière à ce que COTOHA puisse l'exécuter. (Je ne l'ai pas vérifié correctement, mais 2000 caractères ne fonctionnaient pas, et quand je l'ai exécuté avec 1800 caractères, c'était cool ... ~~ Vérifiez-le ~~)


2. La partie qui appelle COTOHA_API

COTOHA_La partie qui appelle l'API


import 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):
    #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/ne" 
    url = developer_api_base_url + base_url_footer
    headers={
        "Authorization": "Bearer " + getAccessToken(), #access_token,
        "Content-Type": "application/json;charset=UTF-8",
    }
    data = {
        "sentence": sentence
    }
    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

J'essaie de réessayer uniquement dans le cas des erreurs 401 et 500, qui est la partie qui appelle COTOHA (extraction d'expressions uniques).


3. La partie illustrée dans WordCloud

La partie illustrée dans Word Cloud


from wordcloud import WordCloud
import matplotlib.pyplot as plt
from PIL import Image

def get_wordcrowd_mask(text):
  
  #Spécification de la police japonaise
  f_path = '/usr/share/fonts/opentype/ipafont-gothic/ipagp.ttf'

  #spécification des paramètres wc
  wc = WordCloud(background_color="white",
                  width=500,
                  height=500,
                  font_path=f_path,
                  collocations=False,
                  ).generate( text )

  #Représentation d'écran
  plt.figure(figsize=(5,5), dpi=200)
  plt.imshow(wc, interpolation="bilinear")
  plt.axis("off")
  plt.show()

C'est la partie qui illustre le texte à l'aide de WordCloud.


<détails>

4. Principal </ summary>

La partie qui exécute le processus


aozora_text_list = get_word()
json_list = []
loc_str = ''
cnt = 0
for i in aozora_text_list:
  cnt+=1
  print( str(cnt) + '/' + str(len(aozora_text_list)) )
  json_list.append(cotoha_call(i))


for i in json_list:
  for j in i['result']:
    if(j['class'] == 'LOC'):
      loc_str = loc_str + j['form'] + ","

get_wordcrowd_mask(loc_str)

La partie qui exécute simplement 1 à 3 De plus, la progression au moment de l'appel d'API est indiquée comme résultat de sortie ci-dessous. (Nombre dans le tableau lors de la division du texte par n / 1)

python


1/9
2/9
3/9
4/9
5/9
6/9
7/9
8/9
9/9

Résultat de sortie

・ Au revoir (Osamu Tadashi)

goodbye.png

Il y a des caractères qui semblent n'avoir rien à voir avec le nom du lieu, mais il semble qu'ils puissent être extraits en général. Voici les résultats d'autres essais.

・ Shayo (Osamu Taisei)

syayou.png

・ Soirée Galaxy Railroad (Kenji Miyazawa)

gingatetudou.png

・ Citron (Motojiro Kajii)

REMON.png

C'est marrant. .. ..

Résumé

COTOHA et Colab peuvent être utilisés gratuitement et vous pouvez facilement toucher au traitement de la langue. C'est un environnement, donc c'est génial!

C'est tout, merci d'avoir lu!

Enfin, quel genre de travail est l'image ci-dessous! (Arrêtez parce que c'est ennuyeux ...) gongitune.png

Recommended Posts

J'ai essayé d'extraire et d'illustrer l'étape de l'histoire à l'aide de COTOHA
J'ai essayé l'histoire courante de l'utilisation du Deep Learning pour prédire la moyenne Nikkei
En utilisant COTOHA, j'ai essayé de suivre le cours émotionnel de la course aux meros.
J'ai essayé de notifier la mise à jour de "Hameln" en utilisant "Beautiful Soup" et "IFTTT"
[Première API COTOHA] J'ai essayé de résumer l'ancienne histoire
J'ai essayé d'illustrer le temps et le temps du langage C
J'ai essayé de notifier la mise à jour de "Devenir romancier" en utilisant "IFTTT" et "Devenir un romancier API"
J'ai essayé de noter la syntaxe trop humoristique et humoristique en utilisant l'API COTOHA.
J'ai essayé d'extraire le texte du fichier image en utilisant Tesseract du moteur OCR
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 visualiser la tranche d'âge et la distribution des taux d'Atcoder
zoom J'ai essayé de quantifier le degré d'excitation de l'histoire lors de la conférence
J'ai essayé d'estimer la similitude de l'intention de la question en utilisant Doc2Vec de gensim
J'ai essayé de corriger la forme trapézoïdale de l'image
Je suis devenu horreur quand j'ai essayé de détecter la quantité de fonctionnalités d'un visage animé en utilisant PCA et NMF.
J'ai essayé de vérifier et d'analyser l'accélération de Python par Cython
J'ai essayé d'utiliser le filtre d'image d'OpenCV
J'ai essayé l'histoire courante de prédire la moyenne Nikkei à l'aide du Deep Learning (backtest)
J'ai essayé de prédire les hauts et les bas du cours de clôture du cours de l'action de Guru Navi en utilisant TensorFlow (progression)
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
J'ai essayé de livrer du courrier depuis Node.js et Python en utilisant le service de livraison de courrier (SendGrid) d'IBM Cloud!
J'ai essayé de prédire la détérioration de la batterie lithium-ion en utilisant le SDK Qore
[Python] J'ai essayé de juger l'image du membre du groupe d'idols en utilisant Keras
L'histoire de la fabrication de soracom_exporter (j'ai essayé de surveiller SORACOM Air avec Prometheus)
J'ai essayé d'extraire des fonctionnalités avec SIFT d'OpenCV
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
L'histoire de l'utilisation de Circleci pour construire des roues Manylinux
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
Python pratique 100 coups J'ai essayé de visualiser l'arbre de décision du chapitre 5 en utilisant graphviz
J'ai essayé d'automatiser la mise à jour de l'article du blog Livedoor avec Python et sélénium.
Je voulais juste extraire les données de la date et de l'heure souhaitées avec Django
J'ai essayé de comparer la vitesse de traitement avec dplyr de R et pandas 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é 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é d'obtenir les informations du Web en utilisant "Requests" et "lxml"
J'ai essayé la reconnaissance faciale du problème du rire en utilisant Keras.
J'ai essayé d'afficher l'heure et la météo d'aujourd'hui w
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
[TF] J'ai essayé de visualiser le résultat de l'apprentissage en utilisant Tensorboard
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
Je veux connaître la nature de Python et pip
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
J'ai essayé d'énumérer les différences entre java et python