[PYTHON] [Evangelion] Versuchen Sie, mit Deep Learning automatisch Asuka-ähnliche Linien zu erzeugen

Einführung

Herzlichen Glückwunsch zum 20. Jahrestag der Evangelion: confetti_ball: Außerdem alles Gute zum Geburtstag an Asuka. (4 Tage zu spät)

Ich habe versucht, mithilfe des wiederkehrenden neuronalen Netzwerks (im Folgenden: RNN), das eine Art populäres Deep Learning ist, automatisch Sätze zu generieren, die auch in Twitter Bot usw. verwendet werden.

Datensammlung

Auch wenn nichts vorhanden ist, wird es nicht ohne Daten gestartet. Ich war bereit, es zu transkribieren, aber es gab eine dankbare Seite, die alle Animationszeilen zusammenfasst. Vielen Dank.

Ich habe alle Zeilen von hier extrahiert. Das Format des Dialogs ist wie folgt und der Charaktername lautet "Serence".

Sendung "Heute, 12:In der 30. Minute wurde in der gesamten zentralen Kanto-Region, die sich auf die Tokai-Region konzentrierte, eine spezielle Notfallerklärung abgegeben. Die Bewohner sollten sofort in das dafür vorgesehene Tierheim evakuieren. "
Sendung "Ich werde es dir wiederholt sagen ..."
Misato "Ich wollte es zu diesem Zeitpunkt nicht aus den Augen verlieren."

Telefon "Alle regulären Leitungen sind derzeit aufgrund der Ausstellung einer speziellen Notfallerklärung außer Betrieb."
Shinji "Nein, ich bin nicht gekommen ... ich kann mich nicht treffen ... ich kann nicht anders, lass uns ins Tierheim gehen."

Betreiber "Unbekannte bewegliche Objekte für die Zentrale sind noch in Bearbeitung."
Shigeru "Überprüfen Sie das Ziel im Video. Schalten Sie es auf den Hauptmonitor."
Fuyutsuki "Es ist 15 Jahre her"
Gendou "Oh, kein Zweifel, ein Apostel."

・ ・ ・

Extraktion von Zeilen für jedes Zeichen

Diese Daten werden für jedes Zeichen in Zeilen unterteilt, und die Quelldaten zum automatischen Generieren der Zeilen werden erstellt.

Ich habe es leicht mit Python geschrieben.

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

import sys
import os
import chardet

from os.path import join, splitext, split

#Geben Sie das Eingabeverzeichnis und das Ausgabeverzeichnis an
readdir = sys.argv[1]
outdir = sys.argv[2]

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

#Holen Sie sich eine Liste der Dateien in einem Verzeichnis
txts = os.listdir(readdir)

for txt in txts:
    if not (txt.split(".")[-1] == "txt"):   #Ignorieren Sie andere Erweiterungen als txt
        continue
    txt = os.path.join(readdir, txt)
    print txt

    fp = open(txt, "rb")

    #Holen Sie sich den Zeichencode der Datei
    f_encode = chardet.detect(fp.read())["encoding"]

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

    for line in lines:
        #In Unicode konvertieren
        line_u = unicode(line, f_encode)

        #Holen Sie sich den Charakternamen
        char_name = line_u[:line_u.find(u"「")]
        outfname = os.path.join(outdir, char_name + ".txt")

        #Überprüfen Sie, ob eine Datei mit dem Charakternamen vorhanden ist
        if os.path.exists(outfname):
            #Wenn ja, im Überschreibmodus
            outfp = open(outfname, "a")
        else:
            #Wenn nicht, erstellen Sie eine neue
            outfp = open(outfname, "w")

        #Nur Zeilen extrahieren
        line_format = line_u[line_u.find(u"「") + 1:line_u.find(u"」")] + "\n"
        #Schreiben Sie Zeilen
        outfp.write(line_format.encode("utf-8"))

Lesen Sie zeilenweise aus der Textdatei, teilen Sie sie in Zeilen zwischen dem Zeichennamen vor "" und "" auf. Wenn die Zeichennamensdatei bereits vorhanden ist, öffnen Sie die Überschreibmodusdatei und fügen Sie sie hinzu. Wenn nicht, wird es neu erstellt.

Die generierte Datei sieht folgendermaßen aus. Ich dachte, Cessna sei eine Figur, aber als ich mir den Inhalt ansah, war es die Funkleitung der Person, die Cessna ritt.

・
・
Asuka.txt
Kaoru.txt
Kiel.txt
Klasse.txt
Cessna.txt
Naoko.txt
・
・

Der Inhalt ist so.

Asuka.txt


Haro, Misato!mir ging es gut?
Korrekt. Ich werde auch an anderen Orten weiblicher.
Es ist eine Sendegebühr. Es ist billig, nicht wahr?
Was machst du!
Und das ist das gemunkelte dritte Kind?Auf keinen Fall jetzt ...
Hoon, es ist langweilig.
・
・

Nur die Zeilen werden richtig genommen.

Nachdem wir die Daten zum Lernen haben, werden wir ein Programm zum Lernen des Hauptfachs erstellen.

Automatische Generierung von Linien

Es gibt verschiedene Sprachmodelle und Satzgenerierungsmethoden, aber dieses Mal werden wir das wiederkehrende neuronale Netzwerk (RNN) verwenden. Als Vergleichsmethode werden wir auch eine Methode implementieren, die die Markov-Kette verwendet.

Was ist RNN?

RNN ist ein allgemeiner Begriff für neuronale Netze, in denen sich geschlossene Pfade befinden.

Zum Beispiel wird, wie in dieser Figur gezeigt, der Inhalt der mittleren Schicht zum Zeitpunkt t als Eingabe zum nächsten Zeitpunkt t + 1 behandelt. Diese Struktur ermöglicht es RNNs, Informationen vorübergehend zu speichern und an die nächste Eingabe weiterzuleiten. Dies ermöglicht es, den in den Daten vorhandenen "Zeitfluss" zu erfassen und zu verarbeiten. In diesem Programm wird anstelle des RNN-Knotens mit der Bezeichnung Long Short Term Memory (LSTM) ein Block verwendet, der den Eingabewert enthalten kann.

Es tut mir leid, dass es schwer zu verstehen ist, wenn Sie es fest erklären, weil es sehr lang sein wird, aber bitte lesen Sie die Materialien anderer Leute für einen detaillierten Überblick und eine leicht verständliche Erklärung.

Was ist die Markov-Kette?

Die Markov-Kette (Markov Rensa) bezieht sich auf den Markov-Prozess, bei dem es sich um eine Art stochastischen Prozess handelt, bei dem die möglichen Zustände diskret (endlich oder zählbar) sind (Markov-Prozess im diskreten Zustand). Insbesondere bezieht es sich oft auf diskrete Zeiten (Zeit wird durch Indizes dargestellt) (es gibt auch einen zeitkontinuierlichen Markov-Prozess, der zeitlich kontinuierlich ist). In der Markov-Kette wird das zukünftige Verhalten nur durch den aktuellen Wert bestimmt und ist für das vergangene Verhalten irrelevant (Markov-Eigenschaft). Aus Wikipedia

Wir werden dieses 3-Gramm machen und die Markov-Kette durchführen. 3 Gramm ist ein Satz von drei Wörtern (Zeichen), die aus einer bestimmten Zeichenfolge herausgeschnitten sind.

Zum Beispiel

Ich frage mich, warum Jungs dumm und unanständig sind!

Wenn es einen Satz gibt, der besagt, dass ich dieses Mal jedes Wort mit Mecab ausschneide, mache ich 3 Stücke, indem ich das Wort einzeln verschiebe.

Wort Wort Wort
(BOS) Warum Junge
Warum Junge Was
Junge Was
Was Ah
Ah Blöd
Ah Blöd damit
Blöd damit Lewd
damit Lewd Nana
Lewd Nana von
Nana von Ich wundere mich
von Ich wundere mich
Ich wundere mich (EOS)

BOS: Abkürzung für Beginn des Urteils EOS: Abkürzung für End of Satz

Eine ausführliche Erläuterung der Markov-Kette finden Sie in den leicht verständlichen Materialien anderer Personen.

Implementierung

RNN Die Bibliotheken, die RNN unterstützen

Und so weiter. Googles Tensorflow ist beliebt, aber ich wage es, Chainer zu verwenden. (Hergestellt in Japan)

Englisches Satzgenerierungsprogramm mit Chainer yusuketomoto/chainer-char-rnn · GitHub Es wurde erstellt, indem es basierend auf geändert wurde.

Ich werde nur den Kern des Programms kurz erläutern.

CharRNN.In 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),

In diesem Teil wird das Modell festgelegt. n_vocab ist die Anzahl der Worttypen in der Zeichenfolge n_units ist die Anzahl der Einheiten, die diesmal auf 128 gesetzt und ausgeführt werden.

CharRNN.In 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)

Dies ist der Teil, der sich auf einen Schritt während des Lernens bezieht. Geben Sie x_data und y_data die Stapelgröße an. Die verborgene Schicht ist LSTM und die Ausgabe verwendet die Softmax-Kreuzentropiefunktion.

train.In 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

In diesem Teil analysiert MeCab beim Eingeben und Geben von Daten die Morphologie und gibt sie an, indem sie sie in Wörter unterteilt.

Es gibt auch eine Beispiel-Code-Erklärung für das wiederkehrende neuronale Netzwerk des anderen Chainers. Ich habe versucht, den Beispielcode zum Erstellen eines wiederkehrenden neuronalen Sprachmodells mit Chainer zu erklären

Markov-Kette

Erstellt von einer anderen Person Ich habe ein automatisches Satzgenerierungsprogramm für die Python-Rehabilitation erstellt o-tomox/TextGenerator · GitHub Ich habe es so benutzt wie es ist. Vielen Dank.

Der Fluss der Satzgenerierung ist so.

  1. Starten Sie zunächst die Satzgenerierung aus der Menge, die mit (BOS) beginnt.
  2. Suchen Sie ein anderes Paar, das mit dem dritten Wort im (BOS) -Paar beginnt. Wenn mehr als eine gefunden wird, wählen Sie eine zufällig aus.
  3. Wiederholen Sie diesen Vorgang, bis das dritte Wort (EOS) lautet.
  4. Vervollständigung des Satzes durch Kombination der bisher ausgewählten Wörter.

Ergebnis

Ich habe versucht, automatisch 20 Sätze gleichzeitig zu generieren.

RNN

Du!Es ist hier. Ich mag das.
Nein!
Ich bin schon im Gegenteil tot!Nicht nur jetzt!
Also, schließ mich!
ich hasse es
Dumm, warte.
Ehrlich, dumm, nein!
Muu!
Das ist blöd!Das ist es.
Was ist los!
Wie wäre es oben.
Hoon, es ist langweilig.
Böse!Anti-Erbrechen, dummes, richtiges Aufwachen ist nur eine kleine Person.
Ahhhhhhh!
Das ist ein bisschen.?Ich werde mich entwickeln!
Gehen wir zu Einheit 2.
Natürlich funktioniert es nicht.
Ich werde dich nicht töten. Ich bin. Niemand muss es hassen.
Was ist der Kommandant, was für mich entschieden ist, ist Eva zu dem Stofftier zu schlagen!

** Was ist der Kommandant, was Sie beschließen, ist Eva zu dem Stofftier zu schlagen! ** Asuka Kansai Theorie

Markov-Kette

Lass uns gehen!
Ich bin nicht bereit zu gehen?
Ich, Asuka, lass uns gehen, mach es einfach bequem, ohne den rechten Arm klar zu machen?
Zeigen Sie mir ein wenig ... Ich kann diese Art von Formel nicht lösen!
Hör auf damit ... Ich frage mich, ob der gezähmte Mann morgen schneien wird.!?
Ah, komm früh!
Wärmeausdehnung?Ich brauche keine kindischen Dinge mehr!
Hör auf das zu sagen, Mama!
Ich wurde ausgewählt. Lass es im Käfig.
ich habe gewartet!Ich habe das Messer fallen lassen, ich bin nicht erleichtert!
Es ist eine Gebühr für Besichtigungen, mit Ihnen zu sprechen.
Es gibt keine andere Person.
Ich lebe so alleine!
Es gibt keine andere Person?
Gut, ich habe es noch nicht gehört.
Was habe ich getan?
Ja ... ich kann nicht mehr anders ...
Partitionieren Sie sich nicht, ich werde von Anfang an mit voller Kapazität und mit maximaler Geschwindigkeit arbeiten.
Ich frage mich, was sie tun.
Hey, schau nicht nach vorne.

Einige Sätze erscheinen so wie sie sind. Es gibt viele korrekte Sätze grammatikalisch.

Schließlich

Diesmal lieferte die Markov-Kette bessere grammatikalische Ergebnisse. Ich habe keine Parameter angepasst, daher habe ich die RNN nicht vollständig genutzt. Wenn es einen besseren Weg gibt, Sätze mit RNN zu generieren, lehre mich bitte.

Ich denke, es gibt noch Potenzial für die automatische Erzeugung, daher würde ich es gerne in Zukunft erwarten.

Bonus

Shinji und Rei haben es auch versucht.

Shinji

RNN

Asuka!
Aber jeder hasst mich.
Nochmals vielen Dank heute und ich habe Angst, es wegzuwerfen!Ich bin ... ich bin nicht.
Ich ... es gibt Leute, auf die ich stolz sein kann, mein Vater starrte mich auf dem Eis an. Aber ich frage mich. Wird nicht aufhören!
Jep. Ja, mein Geruch.
Ja, ich frage mich, ob ich schon auf Eva bin ... von ... san. Ich brauche mich nicht auf der Welt. Ich fahre, aber ich bin von mir!
Ich bin nicht weggelaufen, bevor ich gelernt habe. Ich denke ich kann es schaffen!
korrekt. Ich habe Angst vor meinem Ziel.
Ja, mir geht es gut.
Ich bin ich, ich bin mein?Was ist die Welt?!
Regen, ich weiß es nicht. Gut!
Möchten Sie die Wellen reiten?
Ich frage mich, ob diese Welt wirklich ... Kannst du mich nicht mit Katsuragi Nami verstehen??

"Ich" bricht Gestalt zusammen

Markov-Kette

Wer?Ich konnte dir nicht vergeben.
Ich bin es nicht wert, ich finde es gut?
Ich glaube ich weiß es.
Also Misato!
Es ist eine einsame Stadt ...?
Warum muss ich viel Aufhebens machen?
Aber ich konnte nicht anders ... Ich möchte Wert, aber alle sind echte Shinji Ikari, Ayanami!
kommen. Verlassen!
Ich glaube ich bin weggelaufen!
Ähm ... wie kann jeder damit glücklich sein ... Papa?!
Ayanami. Ich gebe mein Bestes.
Das Schlimme ist, dass Waffen, die nicht mehr auf Eva sind, nützlich sind.
Es ist pechschwarz, ich will nicht zu Abend essen ... ich nicht.
Worüber redest du!
Ich versuche zu verstehen, deshalb erinnere ich mich oft an schwierige Dinge. Ansonsten unser Feind.
Funuuuuuuuu!

Strahl

RNN

Warum?
Ihr seid zusammen Blutbehälter.
Es macht?
Du bist einsam in deinem Herzen!
Deine Welt lebt.
Immerhin bin ich zu spät!Ich bin am ersten Tag zu spät
Ja
Du lügst nicht.
korrekt. Mit dem Ruin verschwindet die Freiheit.
Ich kann mich ohne andere Menschen nicht sehen.
Was hasst du, wenn du verschwindest? Ich bin bei allen.
Du bist Rei Ayanami, deine Mutter.
Ich fühle wirklich mit dir?
Operation Yashima sagt, Sie sind gekommen, um zu gucken
Also, Rei Ayanami?

** Immerhin bin ich zu spät! Ich bin zu spät am ersten Tag ** Es wird aus den Zeilen dieser Szene ausgegeben, aber wenn es in diese Zeile kommt, fühlt es sich seltsam an. (Obwohl die Linien unterschiedlich sein können)

Markov-Kette

... Notruf ... Ich werde weitermachen.
Es kann nicht geholfen werden.
Es fühlt sich so gut.
30(Ichinana Sanmaru)Treffen im Käfig Regentage sind deprimierend.
Aber nein, ich möchte zu nichts zurückkehren.
Den Rest werde ich beschützen, das denken auch alle.
Ich bin froh, dass ich schlafe?
Für wen?
Ich habe nichts.
Sehr eigenartig.
Ikari Kommandant jetzt.
Nein, es fühlt sich genauso an wie ich.
Hmm ah ah!
Es ist jedoch nichts in dir, du kannst es nicht sehen.
Sie können alleine nach Hause gehen, kommen Sie also nicht in diesem Stil

Recommended Posts

[Evangelion] Versuchen Sie, mit Deep Learning automatisch Asuka-ähnliche Linien zu erzeugen
Versuchen Sie, Python-Dokumente automatisch mit Sphinx zu generieren
Versuchen Sie es mit TensorFlow
Versuchen Sie Deep Learning mit FPGA
Generiere Pokemon mit Deep Learning
Probieren Sie Deep Learning mit FPGA-Select-Gurken aus
Versuchen Sie, ein Deep Learning / Neuronales Netzwerk mit Scratch aufzubauen
Versuchen Sie es mit TensorFlow Part 2
Einführung in Deep Learning (2) - Versuchen Sie Ihre eigene nichtlineare Regression mit Chainer-
Probieren Sie die Bitcoin-Preisprognose mit Deep Learning aus
Versuchen Sie es mit Chainer Deep Q Learning - Launch
Versuchen Sie mit Kipoi tiefes Erlernen der Genomik
Versuchen Sie, ein Bild mit Entfremdung zu erzeugen
PPLM: Eine einfache Deep-Learning-Technik zum Generieren von Sätzen mit bestimmten Attributen
Versuchen Sie, den Wechselkurs (FX) mit nicht tiefem maschinellem Lernen vorherzusagen
Versuchen Sie, den Boden durch Rekursion herauszufordern
Deep Kernel Learning mit Pyro
Einführung in Deep Learning ~ Lernregeln ~
Ich habe das Toho-Projekt mit Deep Learning aufgenommen ... ich wollte.
Tiefe Stärkung des Lernens 1 Einführung in die Stärkung des Lernens
Versuchen Sie es mit Kaggle leicht maschinell
Einführung in Deep Learning ~ Backpropagation ~
Ich habe versucht, in einem tief erlernten Sprachmodell zu schreiben
Ich habe versucht, Deep Learning mit Spark × Keras × Docker skalierbar zu machen
Identifikation der Katzenrasse mit Deep Learning
Lernen stärken 13 Probieren Sie Mountain_car mit ChainerRL aus.
Machen Sie ASCII-Kunst mit tiefem Lernen
Versuchen Sie, Facebook mit Python zu betreiben
Einführung in das tiefe Lernen ~ Funktionsnäherung ~
Versuchen Sie, sich mit ONNX Runtime zu profilieren
Tiefes Lernen, um ohne GPU zu beginnen
Generieren Sie automatisch ein Modellbeziehungsdiagramm mit Django
SVM versucht maschinelles Lernen mit Scikit-Learn
Einführung in Deep Learning ~ Codierungsvorbereitung ~
Überprüfen Sie die Kniebeugenform mit tiefem Lernen
Kategorisieren Sie Nachrichtenartikel mit Deep Learning
Snack-Umsatzprognose mit Deep Learning
Versuchen Sie Common Representation Learning mit Chainer
Einführung in Deep Learning ~ Dropout Edition ~
Einführung in Deep Learning ~ Forward Propagation ~
Bringen Sie Menschen mit Deep Learning zum Lächeln
Einführung in Deep Learning ~ CNN Experiment ~
Versuchen Sie, Audio mit M5 STACK auszugeben
Ich habe versucht, Deep Learning zu implementieren, das nicht nur mit NumPy tiefgreifend ist
Eine großartige Einführung in Couseras TensorFlow, um Ihnen den Einstieg in Deep Learning zu erleichtern
Generieren Sie automatisch Objektspezifikationen mit Blue Prism
Anfänger generieren automatisch Dokumente mit Pytorchs LSTM
Versuchen Sie, Farbfilme mit Python zu reproduzieren
Versuchen Sie, sich mit Python bei qiita anzumelden
Verbessertes Lernen, um von null bis tief zu lernen
Klassifizieren Sie Anime-Gesichter mit tiefem Lernen mit Chainer
Einführung in Deep Learning ~ Falten und Pooling ~
Tiefes Lernen / Tiefes Lernen von Grund auf 2-Versuchen Sie, GRU zu bewegen
So studieren Sie den Deep Learning G-Test
Versuchen Sie, Kirschblüten mit xg Boost vorherzusagen
Versuchen Sie, mit Pandas in ordentliche Daten umzuwandeln
Emotionale Analyse von Tweets mit Deep Learning
Versuchen Sie schnell, Ihren Datensatz mit Pandas zu visualisieren