[PYTHON] [Evangelion] Essayez de générer automatiquement des lignes de type Asuka avec Deep Learning

introduction

Félicitations pour le 20e anniversaire d'Evangelion: confetti_ball: De plus, joyeux anniversaire à Asuka. (4 jours de retard)

J'ai essayé de générer automatiquement des phrases, qui sont également utilisées dans Twitter Bot, etc., en utilisant le réseau neuronal récurrent (ci-après: RNN) qui est l'un des populaires Deep Learning.

Collecte de données

Même s'il n'y a rien, il ne démarrera pas sans données. J'étais prêt à le transcrire, mais il y avait un site de remerciement qui résume toutes les lignes d'animation. Merci.

J'ai extrait toutes les lignes d'ici. Le format du dialogue est comme celui-ci, et le nom du personnage est "Serence".

Diffusion "Aujourd'hui, 12:À la 30e minute, une déclaration d'urgence spéciale a été publiée dans toute la région centrale du Kanto centrée sur la région de Tokai. Les résidents doivent évacuer immédiatement vers l'abri désigné. "
Diffusion "Je vais vous dire à plusieurs reprises ..."
Misato "Je ne voulais pas le perdre de vue en ce moment."

Téléphone "Toutes les lignes régulières sont actuellement hors service en raison de l'émission d'une déclaration d'urgence spéciale."
Shinji "Non, je ne suis pas venu ... Je ne peux pas me rencontrer ... Je ne peux pas m'en empêcher, allons au refuge."

Opérateur "Des objets en mouvement non identifiés sont toujours en cours pour le siège"
Shigeru "Vérifiez la cible sur la vidéo. Tournez-la vers le moniteur principal."
Fuyutsuki "Ça fait 15 ans"
Gendou "Oh, sans aucun doute, un apôtre."

・ ・ ・

Extraction de lignes pour chaque personnage

Ces données sont divisées en lignes pour chaque caractère et les données source pour générer automatiquement les lignes sont créées.

Je l'ai écrit légèrement avec python.

# -*- coding: utf-8 -*-

import sys
import os
import chardet

from os.path import join, splitext, split

#Spécifiez le répertoire d'entrée et le répertoire de sortie
readdir = sys.argv[1]
outdir = sys.argv[2]

print "readdir:\t", readdir
print "outdir:\t", outdir

#Obtenir une liste de fichiers dans un répertoire
txts = os.listdir(readdir)

for txt in txts:
    if not (txt.split(".")[-1] == "txt"):   #Ignorer les extensions autres que txt
        continue
    txt = os.path.join(readdir, txt)
    print txt

    fp = open(txt, "rb")

    #Obtenez le code de caractère du fichier
    f_encode = chardet.detect(fp.read())["encoding"]

    fp = open(txt, "rb")
    lines = fp.readlines()

    for line in lines:
        #Convertir en Unicode
        line_u = unicode(line, f_encode)

        #Obtenez le nom du personnage
        char_name = line_u[:line_u.find(u"「")]
        outfname = os.path.join(outdir, char_name + ".txt")

        #Vérifiez s'il existe un fichier de nom de personnage
        if os.path.exists(outfname):
            #S'il y en a, en mode écrasement
            outfp = open(outfname, "a")
        else:
            #Sinon, créez-en un nouveau
            outfp = open(outfname, "w")

        #Extraire uniquement les lignes
        line_format = line_u[line_u.find(u"「") + 1:line_u.find(u"」")] + "\n"
        #Écrire des lignes
        outfp.write(line_format.encode("utf-8"))

Lisez ligne par ligne du fichier texte, divisez-le en lignes entre le nom du caractère avant «» et «» «», et si le fichier de nom de caractère existe déjà, ouvrez le fichier du mode d'écrasement et ajoutez-le. Sinon, il est nouvellement créé.

Le fichier généré ressemble à ceci. Je pensais que Cessna était un personnage, mais quand j'ai regardé le contenu, c'était la ligne radio de la personne qui conduisait Cessna.

・
・
Asuka.txt
Kaoru.txt
Quille.txt
classe.txt
Cessna.txt
Naoko.txt
・
・

Le contenu est comme ça.

Asuka.txt


Haro, Misato!J'étais bien?
C'est vrai. Je deviens également plus féminine ailleurs.
C'est des frais de visionnage. C'est bon marché, n'est-ce pas?
Qu'est-ce que tu fais!
Et quel est le troisième enfant rumeur?Pas question, maintenant ...
Hoon, c'est terne.
・
・

Seules les lignes sont prises correctement.

Maintenant que nous avons les données pour l'apprentissage, nous allons commencer à créer un programme pour apprendre la matière principale.

Génération automatique de lignes

Il existe plusieurs modèles de langage et méthodes de génération de phrases, mais cette fois nous utiliserons le réseau neuronal récurrent (RNN). En guise de méthode de comparaison, nous implémenterons également une méthode utilisant la chaîne de Markov.

Qu'est-ce que RNN

RNN est un terme général pour les réseaux de neurones qui ont des chemins fermés à l'intérieur.

Par exemple, comme le montre cette figure, le contenu de la couche intermédiaire au temps t est traité comme entrée au temps t + 1 suivant. Cette structure permet aux RNN de stocker temporairement des informations et de les transmettre à l'entrée suivante. Cela permet de capturer et de traiter le «flux de temps» qui existe dans les données. Dans ce programme, au lieu du nœud RNN appelé mémoire à long terme (LSTM), le bloc qui peut contenir la valeur d'entrée est adopté.

Je suis désolé qu'il soit difficile de comprendre si vous l'expliquez fermement car ce sera très long, mais veuillez consulter les documents d'autres personnes pour un aperçu détaillé et une explication facile à comprendre.

Qu'est-ce que la chaîne de Markov?

La chaîne de Markov (Markov Rensa) fait référence au processus de Markov, qui est un type de processus stochastique, dans lequel les états possibles sont discrets (finis ou dénombrables) (processus de Markov à états discrets). En particulier, il se réfère souvent à des temps discrets (le temps est représenté par des indices) (il existe également un processus de Markov en temps continu, qui est continu dans le temps). Dans la chaîne de Markov, le comportement futur est déterminé uniquement par la valeur actuelle et n'est pas pertinent pour le comportement passé (propriété de Markov). De Wikipedia

Nous fabriquerons ces 3 grammes et réaliserons la chaîne de Markov. 3 grammes est un ensemble de trois mots (caractères) découpés dans une certaine chaîne de caractères.

Par exemple

Je me demande pourquoi les garçons sont stupides et obscènes!

S'il y a une phrase qui dit, cette fois, nous utiliserons Mecab pour découper chaque mot, donc nous ferons 3 morceaux en décalant les mots un par un.

mot mot mot
(BOS) Pourquoi garçon
Pourquoi garçon Quoi
garçon Quoi
Quoi Ah
Ah Stupide
Ah Stupide alors
Stupide alors Obscène
alors Obscène Nana
Obscène Nana de
Nana de je me demande
de je me demande
je me demande (EOS)

BOS: abréviation de début de phrase EOS: abréviation de fin de phrase

Pour une explication détaillée de la chaîne de Markov, veuillez vous référer aux documents faciles à comprendre d'autres personnes.

la mise en oeuvre

RNN Les bibliothèques prenant en charge RNN

Etc. Le Tensorflow de Google est populaire, mais j'ose utiliser Chainer. (Fabriqué au Japon)

Programme de génération de phrases en anglais utilisant un chainer yusuketomoto/chainer-char-rnn · GitHub Il a été créé en le modifiant en fonction de.

Je n'expliquerai brièvement que la partie principale du programme.

CharRNN.En py


embed = F.EmbedID(n_vocab, n_units),
l1_x = F.Linear(n_units, 4*n_units),
l1_h = F.Linear(n_units, 4*n_units),
l2_h = F.Linear(n_units, 4*n_units),
l2_x = F.Linear(n_units, 4*n_units),
l3   = F.Linear(n_units, n_vocab),

Dans cette partie, le modèle est défini. n_vocab est le nombre de types de mots dans la chaîne n_units est le nombre d'unités, cette fois mis à 128 et exécuté.

CharRNN.En py


    def forward_one_step(self, x_data, y_data, state, train=True, dropout_ratio=0.5):
        x = Variable(x_data.astype(np.int32), volatile=not train)
        t = Variable(y_data.astype(np.int32), volatile=not train)

        h0      = self.embed(x)
        h1_in   = self.l1_x(F.dropout(h0, ratio=dropout_ratio, train=train)) + self.l1_h(state['h1'])
        c1, h1  = F.lstm(state['c1'], h1_in)
        h2_in   = self.l2_x(F.dropout(h1, ratio=dropout_ratio, train=train)) + self.l2_h(state['h2'])
        c2, h2  = F.lstm(state['c2'], h2_in)
        y       = self.l3(F.dropout(h2, ratio=dropout_ratio, train=train))
        state   = {'c1': c1, 'h1': h1, 'c2': c2, 'h2': h2}

        return state, F.softmax_cross_entropy(y, t)

C'est la partie liée à une étape de l'apprentissage. Donnez la taille du lot à x_data et y_data, La couche cachée est LSTM et la sortie utilise la fonction d'entropie croisée softmax.

train.En py


def load_data(args):
    vocab = {}
    print ('%s/input.txt'% args.data_dir)
    f_words = open('%s/input.txt' % args.data_dir, 'r')
    mt = MeCab.Tagger('-Ochasen')

    words = []
    for line in f_words:
        result = mt.parseToNode(line)
        while result:
            words.append(unicode(result.surface, 'utf-8'))
            result = result.next
    dataset = np.ndarray((len(words),), dtype=np.int32)

    for i, word in enumerate(words):
        if word not in vocab:
            vocab[word] = len(vocab)
        dataset[i] = vocab[word]
    print 'corpus length:', len(words)
    print 'vocab size:', len(vocab)
    return dataset, words, vocab

Dans cette partie, lors de la saisie et de la transmission des données, MeCab analyse la morphologie et la donne en la divisant en mots.

Il existe également un exemple d'explication de code du réseau neuronal récurrent de l'autre chaîne, veuillez donc vous y référer également. J'ai essayé d'expliquer l'exemple de code pour créer un modèle de langage neuronal récurrent à l'aide de Chainer

Chaîne de Markov

Créé par une autre personne J'ai créé un programme de génération automatique de phrases pour la rééducation Python o-tomox/TextGenerator · GitHub Je l'ai utilisé tel quel. Merci beaucoup.

Le flux de génération de phrases est comme ça.

  1. Commencez par démarrer la génération de phrases à partir de l'ensemble en commençant par (BOS).
  2. Trouvez une autre paire commençant par le troisième mot de la paire (BOS). Si plus d'un est trouvé, sélectionnez-en un au hasard.
  3. Répétez ceci jusqu'à ce que le troisième mot soit (EOS).
  4. Complétion de la phrase en combinant l'ensemble des mots sélectionnés jusqu'à présent.

résultat

J'ai essayé de générer automatiquement 20 phrases à la fois.

RNN

Tu!C'est ton tour ici. Je l'aime.
Non!
Je suis mort au contraire, déjà!Pas seulement maintenant!
Alors ferme-moi!
Je déteste ça
Stupide, attendez.
Vérité, stupide, non!
Muu!
C'est stupide!C'est tout.
Qu'est-ce qui ne va pas!
Veuillez être dans ce qui précède.
Hoon, c'est terne.
Méchant!Anti-vomissements, stupide et se lever correctement ne sont que quelques personnes.
Ahhhhhhh!
C'est un peu.?Je vais développer!
Passons à l'Unité 2 l'un de l'autre.
Bien sûr, cela ne fonctionne pas.
Je ne te tuerai pas. Je suis. Personne n'a besoin de le détester.
Quel est le commandant, ce qui est décidé pour moi c'est de battre Eva à la peluche!

** Quel est le commandant, ce que vous décidez, c'est de battre Eva à la peluche! ** Théorie Asuka Kansai

Chaîne de Markov

Allons-y!
Je ne veux pas y aller?
Moi, Asuka, allons-y, fais-le confortablement sans éclaircir le bras droit?
Montre-moi un peu ... je ne peux pas résoudre ce genre de formule!
Arrêtez plus ... Je me demande si l'homme apprivoisé neigera pas demain.!?
Ah, viens tôt!
Dilatation thermique?Je n'ai plus besoin de choses enfantines!
Arrête de dire ça, maman!
J'ai été choisi. Laissez-le dans la cage.
j'ai attendu!J'ai laissé tomber le couteau, je ne suis pas soulagé!
C'est payant de vous parler.
Il n'y a pas d'autre personne.
Je vis seul comme ça!
Il n'y a pas d'autre personne?
D'accord, je ne l'ai pas encore entendu.
Qu'est-ce que j'ai fait?
Ouais ... je ne peux plus m'en empêcher ...
Ne vous partitionnez pas, j'irai à pleine capacité dès le début et à vitesse maximale.
Je me demande ce qu'ils font.
Hé, ne regarde pas en avant.

Certaines phrases apparaissent telles quelles. Il existe de nombreuses phrases correctes grammaticalement.

finalement

Cette fois, la chaîne de Markov a donné de meilleurs résultats grammaticaux. Je n'ai ajusté aucun paramètre, donc je n'ai pas pleinement utilisé le RNN. S'il existe une meilleure façon de générer des phrases avec RNN, apprenez-moi s'il vous plaît.

Je pense qu'il y a encore du potentiel pour la génération automatique, alors j'aimerais m'y attendre à l'avenir.

prime

Shinji et Rei l'ont également essayé.

Shinji

RNN

Asuka!
Mais tout le monde me déteste.
Merci encore aujourd'hui et j'ai peur de le jeter!Je ... je ne suis pas.
Je ... il y a des gens dont je peux être fier, mon père me regardait sur la glace. Mais je me demande. Ne s'arrêtera pas!
Ouaip. Ouais, mon odeur.
Oui, je me demande si je suis déjà sur Eva ... de ... san. Je n'ai pas besoin de moi dans le monde. Je roule, mais je suis de moi!
Je ne me suis pas enfui avant d'apprendre. Je pense que je peux le faire!
C'est vrai. J'ai peur de mon objectif.
Oui, je suis d'accord avec moi.
Je suis moi, je suis à moi?Quel est le monde!
Pluie, je ne sais pas. Bien!
Aimeriez-vous surfer sur les vagues?
Je me demande si ce monde est vraiment ... Tu ne peux pas me comprendre avec Katsuragi Nami??

«Je» effondre la Gestalt

Chaîne de Markov

Qui?Je ne pourrais pas te pardonner.
Je n'en vaux pas la peine je pense que c'est bien?
Je pense que je sais.
Alors Misato!
C'est une ville solitaire ...?
Pourquoi dois-je faire des histoires?
Mais je ne pouvais pas m'en empêcher ... Je veux de la valeur, mais tous sont de vrais Shinji Ikari, Ayanami!
venir. Quitter!
Je pense que je me suis enfui!
Euh ... comment tout le monde peut-il être heureux avec ça ... papa?!
Ayanami. Je fais de mon mieux.
Le problème, c'est que les armes qui ne sont plus sur Eva sont utiles.
Il fait noir, je ne veux pas dîner ... je ne veux pas.
Qu'est-ce que tu racontes!
J'essaie de comprendre, donc je me souviens souvent de choses difficiles. Sinon, notre ennemi.
Funuuuuuuuu!

Rayon

RNN

Pourquoi?
Tu es ensemble Conteneur de sang.
C'est faire?
Tu es seul dans ton cœur!
Votre monde est vivant.
Après tout, je suis en retard!Je suis en retard le premier jour
Oui
Tu ne mens pas.
C'est vrai. Avec la ruine, la liberté disparaît.
Je ne peux pas me voir sans les autres.
Que détestez-vous, de disparaître. Je suis avec tout le monde.
Vous êtes Rei Ayanami, votre mère.
Je me sens vraiment avec toi?
L'opération Yashima dit que vous êtes venu voir
Alors, Rei Ayanami's?

** Après tout, je suis en retard! Je suis en retard le premier jour ** Il est sorti des lignes de cette scène, mais quand il s'agit de cette ligne, cela semble étrange. (Bien que les lignes puissent être différentes)

Chaîne de Markov

... appel d'urgence ... Je vais continuer.
Cela ne peut pas être aidé.
Ça fait tellement de bien.
30(Ichinana Sanmaru), Rendez-vous à Cage Les jours pluvieux sont déprimants.
Mais non, je veux revenir à rien.
Le reste est quelque chose que je protégerai, donc tout le monde le pense aussi.
Je suis content de dormir?
pour qui?
Je n'ai rien.
Très étrange.
Commandant Ikari maintenant.
Non, c'est la même chose que moi.
Hmm ah ah!
Cependant, il n'y a rien en vous, vous ne pouvez pas le voir.
Tu peux rentrer seul à la maison, alors ne viens pas dans ce style

Recommended Posts

[Evangelion] Essayez de générer automatiquement des lignes de type Asuka avec Deep Learning
Essayez de générer automatiquement des documents Python avec Sphinx
Essayez l'apprentissage en profondeur avec TensorFlow
Essayez le Deep Learning avec FPGA
Générez des Pokémon avec Deep Learning
Essayez le Deep Learning avec les concombres FPGA-Select
Essayez de créer un réseau de neurones / d'apprentissage en profondeur avec scratch
Essayez l'apprentissage en profondeur avec TensorFlow Partie 2
Introduction au Deep Learning (2) - Essayez votre propre régression non linéaire avec Chainer-
Essayez les prévisions de prix Bitcoin avec Deep Learning
Essayez avec Chainer Deep Q Learning - Lancement
Essayez l'apprentissage profond de la génomique avec Kipoi
Essayez de générer une image avec aliénation
PPLM: Une technique simple de Deep Learning pour générer des phrases avec des attributs spécifiés
Essayez de prédire le taux de change (FX) avec un apprentissage automatique non approfondi
Essayez de défier le sol par récursif
Apprentissage profond du noyau avec Pyro
Introduction au Deep Learning ~ Règles d'apprentissage ~
J'ai capturé le projet Toho avec Deep Learning ... je le voulais.
Apprentissage par renforcement profond 1 Introduction au renforcement de l'apprentissage
Essayez le machine learning à la légère avec Kaggle
Introduction au Deep Learning ~ Rétropropagation ~
J'ai essayé d'écrire dans un modèle de langage profondément appris
J'ai essayé de rendre le deep learning évolutif avec Spark × Keras × Docker
Identification de la race de chat avec Deep Learning
Renforcer l'apprentissage 13 Essayez Mountain_car avec ChainerRL.
Faites de l'art ASCII avec l'apprentissage en profondeur
Essayez d'exploiter Facebook avec Python
Introduction à l'apprentissage en profondeur ~ Approximation des fonctions ~
Essayez de profiler avec ONNX Runtime
Apprentissage profond pour démarrer sans GPU
Générer automatiquement un diagramme de relation de modèle avec Django
SVM essayant l'apprentissage automatique avec scikit-learn
Introduction à l'apprentissage profond ~ Préparation au codage ~
Vérifiez la forme de squat avec l'apprentissage en profondeur
Catégoriser les articles de presse grâce au Deep Learning
Prévisions des ventes de collations avec apprentissage en profondeur
Essayez l'apprentissage de la représentation commune avec le chainer
Introduction au Deep Learning ~ Dropout Edition ~
Introduction au Deep Learning ~ Propagation vers l'avant ~
Faites sourire les gens avec le Deep Learning
Introduction à l'apprentissage profond ~ Expérience CNN ~
Essayez de produire de l'audio avec M5 STACK
J'ai essayé de mettre en œuvre un apprentissage en profondeur qui n'est pas profond avec uniquement NumPy
Une excellente introduction au TensorFlow de Cousera pour vous familiariser avec le Deep Learning
Générez automatiquement des spécifications d'objets avec Blue Prism
Les débutants génèrent automatiquement des documents avec le LSTM de Pytorch
Essayez de reproduire un film couleur avec Python
Essayez de vous connecter à qiita avec Python
Apprentissage amélioré pour apprendre de zéro à profond
Classez les visages d'anime avec l'apprentissage en profondeur avec Chainer
Introduction au Deep Learning ~ Pliage et mise en commun ~
Apprentissage profond / Apprentissage profond à partir de zéro 2-Essayez de déplacer GRU
Comment étudier le test Deep Learning G
Essayez de prédire les fleurs de cerisier avec XG Boost
Essayez de convertir en données ordonnées avec les pandas
Analyse émotionnelle des tweets avec apprentissage en profondeur
Essayez rapidement de visualiser votre ensemble de données avec des pandas