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.
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."
・ ・ ・
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.
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.
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.
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.
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
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.
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
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.
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.
Shinji et Rei l'ont également essayé.
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
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!
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)
... 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