[PYTHON] Ich habe versucht, durch maschinelles Lernen Sätze in den XX-Stil umzuwandeln

Überblick

Dieser Text ist eine Aufzeichnung eines Algorithmus, der jeden Text in einen beliebigen Autorenstil umwandelt. In den letzten Jahren wurde eine sehr interessante App namens Prisma für die Bildverarbeitung veröffentlicht. Dies ist ein Dienst, der beliebige Bilder in Goch-Stil oder Cubic-Stil konvertiert. Das neueste maschinelle Lernen war ein sehr interessantes Beispiel dafür, was tatsächlich im Dienst verwendet wurde. Dieser Satz wurde mit dem Ziel entwickelt, "einen beliebigen Satz in einen XX-Stil umzuwandeln", anstatt die von Prisma durchgeführte Arbeit "Ein beliebiges Bild in einen XX-Stil umzuwandeln". Zum Beispiel

** "Sie sind ein Narr." **

Wenn Sie den Satz wie Shikinami Asuka machen

** "Bist du dumm?" **

Und wenn es zum Hoshino Ruri-Stil wechselt,

** "Dummkopf." **

Kann werden. Um ein anderes Beispiel zu geben:

"Ich bin eine Katze."

Wenn Sie den Satz in den Natsume Soseki-Stil konvertieren,

** "Ich bin eine Katze." **

Es kann eine Umwandlung sein. Das Textkapitel versuchte einen Ansatz, um sie zu erreichen, aber ** tatsächlich funktionierte es nicht so gut. ** **. Obwohl es sich um eine Fehleraufzeichnung handelt, lesen Sie bitte Folgendes, wenn Sie immer noch gut sind.

Frühere Forschungen

Wie in der Übersicht gezeigt, ist die Anwendung Prisma im Bildbereich sehr bekannt. Dies wird voraussichtlich eine Erweiterung von Deep Learning mit CNN sein. Darüber hinaus erfolgt eine Konvertierung der Sprachqualität. Es ist leicht vorstellbar, dass in Detective Conan ein Sprachwechsler mit Schmetterlingsbindung verwendet wird, aber es ist eine Maschine, die die Stimme in die sogenannte Stimme einer anderen Person ändern kann. Ein solcher Ansatz wird erreicht, indem die Merkmale der Stimme, die als Merkepstram bezeichnet wird, extrahiert und getrennt werden und die Merkmale anderer neu synthetisiert werden. Auf der anderen Seite wenden wir uns der Verarbeitung natürlicher Sprache zu. Es scheint, dass es nicht viele solcher Studien zur Verarbeitung japanischer Sprachen gibt. Ein berühmtes Beispiel im Internet ist Monjiro (http://monjiro.net/). Dies ist eine Site, die beliebige Sätze in den XX-Stil konvertieren kann. Wenn Sie beispielsweise "Sie sind ein Narr" in einen Samurai-Stil konvertieren, wird dies in den Satz "Sie sind ein Narr" umgewandelt. Eine andere Site ist ClalisTone (https://liplis.mine.nu/lipliswiki/webroot/?ClalisTone4.1). Die API ist öffentlich zugänglich. Wenn Sie die Spezifikationen lesen, finden Sie die folgende Beschreibung.

① name Einstellungsname(Irgendein)
② Typ Einstellungstyp(0:Normale Umwandlung, 1:Konvertierung beenden)
③ vor der Konvertierung Zielzeichenfolge
④ nach der Konvertierung Wortzeichenfolge

Daraus ist ersichtlich, dass diese Art von Algorithmus in zwei Typen unterteilt werden kann. Die erste ist "Konvertierung an jedem Ort" und die zweite ist "Schwanzkonvertierung". Am Beispiel der Samurai-Sprache entspricht die Zeichenkette "du bist" der Konvertierung der ersteren, der Konvertierung von "du bist" und der letzte Teil von "ist" der Konvertierung von "gozaru". Sie sehen, dass es der Konvertierung entspricht. Diese Ansätze sind jedoch problematisch. Der Ersatz ist so einfach, dass er nicht wie die Formelwelle im Asuka-Stil konvertiert werden kann. "Du dumm?" Darüber hinaus ist der Schreibstil, der am Ende konvertiert werden kann, auf die gesprochene Sprache beschränkt. Wenn man zum Beispiel die Umstellung auf "Nya" wie die sogenannte Katzensprache betrachtet, wird der Satz "Der Zug ist angekommen" zum Satzstil "Der Zug ist angekommen". Es stellt sich heraus, dass es sich um eine Methode handelt, die nicht auf Dinge wie Romane angewendet werden kann, die sich damit befassen. Betrachten wir hier in diesem Text die ** Stilkonvertierung, die auch in der geschriebenen Sprache verwendet werden kann **.

Ziel Beispiel
Verbal Monjiro, ClalisTone
Literarische Sprache Diese Methode

Grundkonzept des Algorithmus

Hier beschreiben wir eine Stilkonvertierungsmethode wie Prisma. Grob gesagt kann es in die Teile "Grundelemente" und "Stil" des Bildes unterteilt werden. Obwohl ich nur kurz erläutern werde, wird das Bild aus dem Teil generiert, der sich auf "Form" und "Zusammensetzung" des "Grundelements" und des hier gezeigten Teils bezieht, und für den "Stil" optimiert. Es ist wichtig, auf diese Weise in zwei Elemente zu unterteilen.

image

Ein weiteres Beispiel für die Sprachkonvertierung ist

image

Es wird so. Obwohl Tonhöhe und Länge des Klangs gleich sind, wird die Stimme durch Ändern der Sprachqualität konvertiert. MIDI ist möglicherweise intuitiver und leichter zu verstehen. MIDI passt die Tonhöhe und Länge grundsätzlich an, und Sie können den Ton später problemlos ändern. Selbst mit derselben Musikpartitur können Sie einen Klang mit einer Trompete oder einen Klang mit einem Klavier spielen.

Hier kann die in diesem Text behandelte Stilkonvertierung wie folgt unterteilt werden.

image

"Grundelemente" beinhalten "Bedeutung von Sätzen", während "Stil" "Wortauswahl / Ton" beinhaltet. es ist denkbar, dass. Im vorherigen Beispiel der Satz "Du bist ein Dummkopf" und der Satz "Du bist dumm?" Haben die gleiche ** Bedeutung **, aber nur ** Wortauswahl und Ton **. Sie können sehen, dass.

Algorithmus

Der allgemeine Konvertierungsfluss für die Sprachqualität ist wie folgt. (Der Inhalt ist zur Vereinfachung der Abbildung vereinfacht)

image

Auf diese Weise werden die Sprachqualität und die Tonhöhe in 1 getrennt, in 2 durch die Sprachqualität einer anderen Person ersetzt und in 3 neu synthetisiert. Es wird die Methode. Die Bildstilkonvertierung verfolgt einen ähnlichen Ansatz, es ist jedoch schwierig, diese Methode auf die Textstilkonvertierung anzuwenden. Der Grund ist, dass die Methode zur Trennung von "Bedeutung" und "Wortauswahl" in Sätzen nicht untersucht wurde und der gleiche Ansatz als sehr schwierig angesehen wird. Dieser eingeschränkte Ansatz ist die zuvor gezeigte "End-to-End-Tonumwandlung", und wenn es das letzte Wort ist, hat dies keinen großen Einfluss auf die Bedeutung. Unter der Annahme wird dies als eine Methode zum Hinzufügen des Zeichens "nya" am Ende des Wortes angesehen. Hier werden wir den Stil des Textes aus einer anderen Perspektive ändern.

image

  1. Generieren Sie Sätze aus dem Satzgenerierungsmodell
  2. Vergleichen Sie die Bedeutung des Satzes, den Sie konvertieren möchten (ursprünglicher Satz), mit dem in 1 generierten Satz.
    1. Geben Sie nur Sätze mit der nächstgelegenen Bedeutung aus

Es ist ein Mechanismus. Die automatische Generierung von Sätzen im XX-Stil umfasst die automatische Generierung durch das versteckte Markov-Modell, das für eine Weile sehr beliebt war. Generieren Sie damit einen Satz in 1. Für den semantischen Vergleich wird eine Methode namens Doc2Vec verwendet. Die Methode word2vec war früher sehr beliebt, ist jedoch eine erweiterte Version dieser Methode, mit der Sie die Bedeutung von Sätzen mit einem neuronalen Netzwerk vergleichen können. Wir werden dies in 2 verwenden.

Datenaufbereitung

Der Korpus selbst benutzte den Aozora Bunko. Sie können die Daten für jeden Autor auf der folgenden Site herunterladen.

Aozora Bunko Bulk Download vom Autor http://keison.sakura.ne.jp/

Anschließend wurden die folgenden 50 Sätze von Mecab generiert und zum Erlernen von Doc2Vec verwendet.

Andersen, Kafka, Grimm, Gogol, Jean Christoph, Dante, Chehoff, Doyle, Boardrail, Po, MacLeod, Mopassan, Rilke, Loran, Victor Hugo, Angos neue Japan-Geographie, Ango Life Guide, Itami Mansaku, Ito Sachio, Ito Noeda, Inoue Enritsu, Inoue Koume, Nagai Kafu, Yokomitsu Riichi, Okamoto Kanoko, Okamoto Kido, Okino Iwasaburo, Shimomura Chiaki, Natsume Soseki, Meine Sicht des Lebens, Unno Juzo, Akutagawa Ryunosuke, Kajii Motoiro Zenzo Kasai, Ariaki Kambara, Kunishi Kishida, Hiroshi Kikuchi, Eisuke Yoshiyuki, Eiji Yoshikawa, Juran Hisao, Koichiro Miyahara, Michio Miyagi, Kenji Miyazawa, Yuriko Miyamoto, Akie Chikamatsu, Kazuzo Kuwahara, Tami Harikamatsu Jun

Einige von ihnen sind keine persönlichen Namen, aber der Text wird wahrscheinlich aufgrund eines Fehlers nicht verarbeitet.

Vorversuch

Wir haben das folgende Skript vorbereitet.

estimate.py


#coding: utf-8
import sys
from gensim.models.doc2vec import Doc2Vec,DocvecsArray
from scipy.spatial.distance import cosine
from scipy.linalg import norm
import MeCab

class Estimator:
    def __init__(self,model):
        self.model = model
        self.mecab = MeCab.Tagger("-Owakati")

    def estimate(self,txt1,txt2):
        txt1 = self.mecab.parse(txt1)
        txt2 = self.mecab.parse(txt2)

        a1 = txt1.decode("utf-8").split()
        b1 = txt2.decode("utf-8").split()
        #return self.model.docvecs.similarity_unseen_docs(self.model,a1,b1,alpha=0.0,min_alpha=0.0)
        return self.model.docvecs.similarity_unseen_docs(self.model,a1,b1)
        

if __name__=="__main__":
    model_filename = sys.argv[1]
    txt1 = sys.argv[2]
    txt2 = sys.argv[3]
    
    model = Doc2Vec.load(model_filename)

    estimator = Estimator(model)

    print estimator.estimate(txt1,txt2)

Verwenden Sie dieses Skript

$ python estimate.py [Doc2Vec-Modellname] "[Satz 1]" "[Satz 2]"

In Form von können Sie die Ähnlichkeit zwischen Satz 1 und Satz 2 messen. (Der Code des Lernteils von Doc2vec wird weggelassen.) Als Ergebnis des Experimentierens damit

kotauchisunsun-VirtualBox$ python estimate.py nda6.model "Ich bin eine Katze." "Ich bin eine Katze."
0.667711547669
kotauchisunsun-VirtualBox$ python estimate.py nda6.model "Ich bin eine Katze." "Ich bin eine Katze."
0.805627031659

(^ ω ^) ...?

Nachdem ich es mehrmals versucht hatte, bemerkte ich, dass die Ähnlichkeit von Gensim durch -1 zu 1 normalisiert ist. Je näher es an 1 liegt, desto näher scheint die Bedeutung des Satzes zu sein. Es gibt jedoch viele Punkte, die ich nicht verstehen kann, und ich habe es nicht gut verstanden, weil es sich so verhält, dass ** die Ähnlichkeit nicht 1,0 erreicht hat, selbst wenn ich den gleichen Satz setze. Wahrscheinlich fühle ich mich wie die Spezifikation von Similarity_unseen_doc. Danach war der Bewertungswert nicht stabil, und wenn der gleiche Satz dreimal bewertet wurde, wurde der Wert allmählich kleiner. .. ..

Stilkonvertierungsexperiment

Zum Zeitpunkt der Vorbereitung habe ich nur ein schlechtes Gefühl, aber lassen Sie es uns tatsächlich automatisch generieren. Die Eingabe ist "Ich bin eine Katze."

0.409022161426 "Der größte Teil dieses Falles war das, was Ihre Frau war"
0.480818568261 "Wie langweilig es wurde."
0.559027353215 "Er verlor seine Augen."
0.659924672818 "Das bin ich - diese Person und da"
0.746559396136 "Er ist ein Ehemann"
0.781097738802 "Es war genau das."
0.786329416341 "Ich bin alleine."
0.802889606127 "Ich habe mich heute getroffen."
0.818648043016 "Es gehört mir."

Offensichtlich wird es zufällig generiert, so dass es viel Mühe kostet, nur das Wort "I" zuzuweisen. Aber was ist mit dem Satz "Er ist ein Ehemann" ähnlicher als dem Satz "Ich bin eine Katze" ...? Die Frage ist stärker. Lassen Sie uns nun ein Kontrollexperiment durchführen, um das Problem aufzuteilen. Zuerst habe ich den HMM-Code so geändert, dass immer das Wort "I" ausgewählt wurde, und es automatisch generiert. Das hat relativ gut funktioniert, also leite ich es schon lange. Dieses Mal wird es nicht vollständig zufällig von HMM generiert, sondern es wird 10.000 Mal generiert, die Wörter mit durchschnittlich hohen Punktzahlen werden bestimmt und das nächste Wort wird versucht. Die Generierungsmethode wird übernommen. Ich mache etwas in der Nähe der Monte-Carlo-Baumsuche.

0.0880615096769 Frühherbst ohne meine Flügel
0.7469903088 Ich wurde zerstört.
0.759754754423 Ich habe eine.
0.780031448973 Ich bin nicht meine Freundin.
0.79565634711 Ich bin es.
0.834694349115 Ich sagte, es sei meine Katze.
0.838936420823 Ist es meine Katze?
0.855492222823 Sind Sie eine Katze?
0.85682326727 Es ist meine Katze.
0.86722014861 Ich bin keine Katze
0.878538129172 Ich kann es nicht mit meiner Katze machen.

Ah, es ist köstlich. Ich frage: "Bist du eine Katze?" Danach sagt er "Es ist meine Katze." Danach, als ich dachte: "Ich bin keine Dienerkatze, ich bin ich selbst" oder so etwas wie "Ich kann es nicht mit einer Dienerkatze machen". Wann Wie Sie sehen können, scheint es keinen Fehler bei der automatischen Generierung zu geben. Daher scheint es, dass vorerst ein Satz ähnlich dem Satz "Ich bin eine Katze" erzeugt werden kann. Es gibt jedoch einen Teil, in dem der Bedeutungsvergleich von Sätzen nicht gut ist, und es besteht die Möglichkeit, dass die Konvertierung nicht gut durchgeführt wird. Wenn andererseits die Anzahl der Server erhöht wird, erhöht sich die Anzahl der Versuche, und es wird eine genaue Antwort gegeben. Im obigen Beispiel "Ich bin eine Katze". Und obwohl der Prozess fast abgeschlossen war und es darüber hinaus fast keine Optionen gab, "Ich bin eine Katze". Wenn ich die Tatsache betrachte, dass ich die Antwort ableite: "Ich bin derjenige, der nichts sagt", halte ich es für ratsam, die Genauigkeit des Vergleichs von Satzbedeutungen zu verbessern.

Zusammenfassung

Wir haben einen Algorithmus zur Konvertierung des Satzstils entwickelt und implementiert. Es war jedoch keine sehr genaue Konvertierung, und es war möglich, eine ungefähre Lösung für die ursprünglich geplante Lösung zu erhalten, indem einige Wörter manuell gesteuert wurden.

Anwendungsbeispiel

Dies kann eine gute Möglichkeit sein, einem Chatbot Persönlichkeit zu verleihen.

[Evangelion] Versuchen Sie, mit Deep Learning automatisch Asuka-ähnliche Linien zu generieren. Http://qiita.com/S346/items/24e875e3c5ac58f55810

Es gibt einen Artikel namens "Deep Learning" und wir führen ein Experiment durch, um Sätze wie Shikinami Asuka zu generieren. Hier zu den verwendeten Daten

Dinge zu lieben-Einführung von Anime-Linien- http://lovegundam.dtiblog.com/blog-category-7.html

Es scheint eine Seite zu geben, die die Zeilen aller Evangelion-Charaktere zusammenfasst. Wenn die Genauigkeit dieser Methode verbessert werden kann, kann es interessant sein zu sagen, dass ** persönliche Assistenten, die nur wie Siri empfangen und antworten konnten, mit Individualität aus den Zeichenskriptdaten nachgerüstet werden können **.

Impressionen

Ich hatte das Gefühl, dass ich die Genauigkeit etwas weiter verbessern könnte, aber die Zeit war abgelaufen. Das Optimieren von Doc2Vec war sehr ärgerlich und wird in der Praxis selten verwendet. Das war ein problem Daher konnte ich nur verstehen, wie man Doc2Vec von gensim verwendet, und es dauerte sehr lange, den Code einzeln zu verschieben und zu überprüfen. Die ursprüngliche Geschichte, die ich mir ausgedacht habe, ist diese. [Sakura Tomoyo am 19. Juni] Osamu Osamu wurde durch Programmierung wiederbelebt (http://pdmagazine.jp/people/dazai-program/). Als ich das sah, fragte ich mich, ob ich etwas interessanteres machen könnte. Eigentlich wollte ich persönlich einen Vergleich der Bedeutungen von BM25 anstellen, die übernommen worden waren, aber sollte es immer noch in Mode sein? Ich überlegte noch einmal und versuchte es mit Doc2Vec von gensim. Es scheint, dass die Leistung von Mecab auch schlecht ist. Dies liegt daran, dass der Text in Aozora Bunko 50 Jahre vor dem Ablaufdatum liegt, sodass der Wortlaut etwas altmodisch ist. Aufgrund der visuellen Überprüfung der Anzahl der Teile gab es einige Stellen, an denen die Aufteilung seltsam war. Daher ist es für Mecab, das auf moderner Sprache basiert, schwierig. Es scheint, dass dies auch die Genauigkeit des maschinellen Lernens beeinflusst. In letzter Zeit ist auch feindliches Lernen wie GAN beliebt, aber ich möchte immer noch Korrespondenzdaten zum Lernen. Ohne dies ist maschinelles Lernen an einigen Stellen schwer zu erreichen. Ich persönlich versuche es und habe das Gefühl, dass es irgendwie gemacht ist. Die aktuelle Situation ist, dass sich die Genauigkeit nicht so sehr verbessert, weil es so etwas macht. Ich bin so geworden, aber der zweite und dritte Enthusiast der Verarbeitung natürlicher Sprache werden ihr Bestes geben.

Recommended Posts

Ich habe versucht, durch maschinelles Lernen Sätze in den XX-Stil umzuwandeln
Ich habe versucht, maschinelles Lernen (Objekterkennung) mit TouchDesigner zu verschieben
Ich habe versucht, das Bild mithilfe von maschinellem Lernen zu komprimieren
Ich habe maschinelles Lernen mit liblinear versucht
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
Ich wollte mein Gesichtsfoto in einen Yuyu-Stil umwandeln.
[Maschinelles Lernen] Ich habe versucht, so etwas wie Bilder weiterzugeben
Ich habe Python 3.5.1 installiert, um maschinelles Lernen zu studieren
Mayungos Python Learning Episode 6: Ich habe versucht, eine Zeichenkette in eine Zahl umzuwandeln
Ich habe versucht, Gitarrenakkorde in Echtzeit mithilfe von maschinellem Lernen zu klassifizieren
(Maschinelles Lernen) Ich habe versucht, die Bayes'sche lineare Regression bei der Implementierung sorgfältig zu verstehen
Ich habe versucht, das Modell mit der Low-Code-Bibliothek für maschinelles Lernen "PyCaret" zu visualisieren.
Ich habe versucht, die beim maschinellen Lernen verwendeten Bewertungsindizes zu organisieren (Regressionsmodell).
Ich habe versucht, das Vorhandensein oder Nichtvorhandensein von Schnee durch maschinelles Lernen vorherzusagen.
Ich habe versucht, die Veränderung der Schneemenge für 2 Jahre durch maschinelles Lernen vorherzusagen
Ich habe versucht, verschiedene Methoden für maschinelles Lernen (Vorhersagemodell) mithilfe von Scicit-Learn zu implementieren
Ich habe versucht, das Bild zu verarbeiten und zu transformieren und die Daten für maschinelles Lernen zu erweitern
Ich habe versucht, tief zu lernen
Ich habe versucht zu debuggen.
Einführung in das maschinelle Lernen
Ich habe versucht, Pytest in die eigentliche Schlacht zu bringen
Ich habe versucht, die unverständlichen Sätze von Karen Takizawa sprachlich zu analysieren.
Ich habe versucht, Dropout zu erklären
[Keras] Ich habe versucht, das Problem der Klassifizierung des Donut-Typ-Bereichs durch maschinelles Lernen zu lösen. [Studie]
Ich habe versucht, mit Python (Mac OS X) eine Umgebung für maschinelles Lernen zu erstellen.
Onkel SE mit verhärtetem Gehirn versuchte, maschinelles Lernen zu studieren
Ich habe versucht, PredNet zu lernen
Ich habe versucht, die Erkennung von Anomalien durch spärliches Strukturlernen zu implementieren
Eine Einführung in das maschinelle Lernen
Anfänger des maschinellen Lernens versuchten RBM
Ich habe versucht, die Genauigkeit von Modellen für maschinelles Lernen mit Kaggle als Thema zu vergleichen.
Ich habe versucht, SVM zu organisieren.
[Markov-Kette] Ich habe versucht, negative Emotionen in Python zu laden.
Passende App Ich habe versucht, Statistiken über starke Leute zu erstellen und ein Modell für maschinelles Lernen zu erstellen
Ich habe versucht, PCANet zu implementieren
[Markov-Kette] Ich habe versucht, die Zitate in Python einzulesen.
Ich habe versucht, Tensorboard zu verwenden, ein Visualisierungstool für maschinelles Lernen
Ich habe versucht, die Yin- und Yang-Klassifikation hololiver Mitglieder durch maschinelles Lernen zu überprüfen
Mayungos Python Learning Episode 3: Ich habe versucht, Zahlen zu drucken
Ich habe versucht, Linux wieder einzuführen
Ich habe versucht, ListNet of Rank Learning mit Chainer zu implementieren
[TF] Ich habe versucht, das Lernergebnis mit Tensorboard zu visualisieren
Ich habe versucht, Pylint vorzustellen
Ich habe versucht, SparseMatrix zusammenzufassen
Ich habe versucht, die Extreme-Lernmaschine zu implementieren
Super Einführung in das maschinelle Lernen
Ich habe versucht, englische Untertitel mit Udemy gewaltsam ins Japanische zu übersetzen
jupyter ich habe es berührt
Ich habe versucht, Perceptron Teil 1 [Deep Learning von Grund auf neu] zu implementieren.
Ich habe versucht, StarGAN (1) zu implementieren.
Ich habe versucht, in einem tief erlernten Sprachmodell zu schreiben
Ich habe versucht, Othello AI mit Tensorflow zu machen, ohne die Theorie des maschinellen Lernens zu verstehen ~ Einführung ~
Ich habe versucht, das überwachte Lernen des maschinellen Lernens auch für Serveringenieure auf leicht verständliche Weise zu verstehen 1
[Qiita API] [Statistik • Maschinelles Lernen] Ich habe versucht, die bisher veröffentlichten Artikel zusammenzufassen und zu analysieren.
Ich war frustriert von Kaggle und versuchte, durch Schaben und maschinelles Lernen ein gutes Mietobjekt zu finden
Ich habe HR Tech versucht, eine Expertensuchmaschine zu entwickeln, indem ich interne Besprechungsinformationen maschinell gelernt habe
Ich habe versucht, das überwachte Lernen des maschinellen Lernens auch für Serveringenieure auf leicht verständliche Weise zu verstehen 2
Ich habe versucht, Othello AI mit Tensorflow zu erstellen, ohne die Theorie des maschinellen Lernens zu verstehen ~ Implementierung ~