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.
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."
・ ・ ・
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.
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.
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.
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.
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
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.
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
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.
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.
Shinji und Rei haben es auch versucht.
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
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!
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)
... 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