[PYTHON] Ich habe einen Chat-Chat-Bot mit Tensor2Tensor erstellt und diesmal hat es funktioniert

Einführung

Ich habe versucht, einen Chatbot zu erstellen, indem ich die Methode gegenüber dem vorherigen Fehler geändert habe. Diesmal hat es funktioniert, aber es ist nicht sehr interessant, weil es fast der offiziellen Dokumentation entspricht.

Der letzte Fehler ist von hier Der gesamte Code stammt von hier

Wie man ... macht

Dieses Mal habe ich mich für Tensor2Tensor (t2t) entschieden, das vom Google Brain-Team bereitgestellt wird. Das Merkmal von t2t ist, dass es einfach ausgeführt werden kann, ohne Code zu schreiben (nur Befehl), wenn Sie nur mit dem bereits vorbereiteten Datensatz lernen möchten. Es ist sehr einfach, ein eigenes Dataset auszuführen, da Sie nur wenige Codezeilen und ein wohlgeformtes Dataset benötigen, wie in den meisten offiziellen Dokumentationen beschrieben.

Dieses Mal lernen und schließen wir mit input_corpus.txt und output_corpus.txt, die aus dem zuletzt als Datasets erstellten Meidai Conversation Corpus extrahiert wurden. Die Ausführungsumgebung ist Google Colab.

Außerdem werden wir gemäß dem Inhalt des offiziellen Dokuments [^ 1], hier [^ 2], hier [^ 3] usw. vorgehen.

Datensatzvorbereitung

Wenn Sie gemäß der obigen Referenzseite fortfahren, benötigen Sie die folgenden zwei Dinge.

Einzelheiten zur Erstellung finden Sie auf der Referenzseite. Geben Sie vorerst einfach den Code ein

myproblem.py


from tensor2tensor.data_generators import problem
from tensor2tensor.data_generators import text_problems
from tensor2tensor.utils import registry
 
 
@registry.register_problem
class chat_bot(text_problems.Text2TextProblem):
    @property
    def approx_vocab_size(self):
        return 2**13
    
    @property
    def is_generate_per_split(self):
        return False
 
    @property
    def dataset_splits(self):
        return [{
            "split": problem.DatasetSplit.TRAIN,
            "shards": 9,
        }, {
            "split": problem.DatasetSplit.EVAL,
            "shards": 1,
        }]
 
    def generate_samples(self, data_dir, tmp_dir, dataset_split):
        filename_input = '/content/drive/My Drive/Colab Notebooks/input_corpus.txt'
        filename_output = '/content/drive/My Drive/Colab Notebooks/output_corpus.txt'
 
        with open(filename_input) as f_in, open(filename_output) as f_out:
            for src, tgt in zip(f_in, f_out):
                src = src.strip()
                tgt = tgt.strip()
                if not src or not tgt:
                    continue
                yield {'inputs': src, 'targets': tgt}

Die Änderungen gegenüber der offiziellen Dokumentation sind der Klassenname und die erforderlichen Teile der Funktion generate_samples. Es ist üblich, den Klassennamen in einen Kamelkoffer zu schreiben, aber aus irgendeinem Grund musste ich ihn in Anbetracht der Zukunft in einen Schlangenkoffer schreiben. Es ist ein kleines Rätsel, dass es mit einem Kamelkoffer funktionieren sollte.

__init__.py


from . import myproblem

Schreiben Sie dazu einfach den obigen Inhalt und legen Sie ihn im selben Verzeichnis wie myproblem.py ab.

Datenvorverarbeitung

t2t verarbeitet die Daten auch fast automatisch vor. Es ist bequem. (Der folgende Code konvertiert vom Notebook-Format in das .py-Format.)

ChatBot_with_t2t.py


#Tensorflow Version 1,x
"""

# Commented out IPython magic to ensure Python compatibility.
# %tensorflow_version 1.x

"""#Modell des maschinellen Lernens(Transformer)Installieren"""

!pip install tensor2tensor

"""#Google Drive-Mount"""

from google.colab import drive
drive.mount('/content/drive')

"""#Arbeitsverzeichnis ändern"""

cd /content/drive/My Drive/Colab Notebooks

"""#Vorverarbeitung von Trainingsdaten"""

!t2t-datagen \
  --data_dir=. \
  --tmp_dir=./t2t \
  --problem=chat_bot \
  --t2t_usr_dir=./t2t

Legen Sie diesmal myproblem.py und \ _ \ _ init__.py eine Ebene unter ChatBot \ _with \ _t2t.ipynb im Verzeichnis t2t ab. Auch dieses Mal habe ich input_corpus.txt und output_corpus.txt im selben Verzeichnis wie .ipynb abgelegt. Da jedoch Dateien nach der Ausführung generiert werden, ist es möglicherweise besser, sie in einem separaten Ordner zu speichern.

Geben Sie für die Befehlszeilenoption problem = den in myproblem.py geänderten Klassennamen an (er wurde ursprünglich automatisch von Kamelfall zu Schlangenfall konvertiert, hat aber nicht funktioniert).

Lernen

ChatBot_with_t2t.py


"""#Ausführung des Lernens"""

!t2t-trainer \
  --data_dir=/content/drive/My\ Drive/Colab\ Notebooks \
  --problem=chat_bot \
  --model=transformer \
  --hparams_set=transformer_base_single_gpu \
  --output_dir=/content/drive/My\ Drive/Colab\ Notebooks/t2t \
  --t2t_usr_dir=/content/drive/My\ Drive/Colab\ Notebooks/t2t

In der Vorverarbeitung wurde das Verzeichnis mit einem relativen Pfad angegeben, aber es ist natürlich möglich, mit einem absoluten Pfad zu beschreiben. Dieses Mal bin ich mit \ geflüchtet, weil der Pfad ein Leerzeichen enthält. Auch diesmal wird das Lernmodell mit dem Transformator durchgeführt. Diese Studie dauerte ca. 3-4 Stunden. Um das 90-Minuten-Limit aufzuheben, wird es außerdem automatisch von der Chorme-Erweiterungsfunktion neu geladen.

Es gibt eine Einschränkung: Lauftraining produziert viele Zwischenprodukte. In meiner eigenen Umgebung wurde der Papierkorb in Google Drive voll und ich musste ihn während der Ausführung leeren. Die nach der Ausführung generierten Lerndateien nehmen immer noch viel Platz ein, sodass Sie sie möglicherweise jedes Mal löschen müssen, wenn Sie sie nicht mehr benötigen.

Schließen

ChatBot_with_t2t.py


"""#Schließen"""

!t2t-decoder \
   --data_dir=./ \
   --problem=chat_bot \
   --model=transformer \
   --hparams_set=transformer_base_single_gpu \
   --output_dir=./t2t \
   --decode_hparams="beam_size=4,alpha=0.6" \
   --decode_interactive=true \
   --t2t_usr_dir=./t2t

Es kann interaktiv mit dem obigen Befehl ausgeführt werden.

Ausführungsergebnis

Sie können mit dem Bot sprechen, indem Sie den Dekodierungsbefehl drücken. Das Folgende ist ein Auszug der Eingabe- und Ausgabeinhalte.

Eingabe: Hallo
Ausgabe: Was bedeutet das?

Input: Nein, du sagst guten Morgen
Ausgabe: Alles klar.

Eingabe: Was ist in Ordnung?(Lol)
Ausgabe: Ja.

Eingabe: Ja
Ausgabe: Persönlichkeit?

Eingabe: Das ist der Charakter
Ausgabe: Nun, das stimmt.

Input: Ich bin überzeugt
Ausgabe: Telefon, Telefonkarte, normalerweise danke, es ist natürlich zu geben.

Eingabe: Plötzlich toben
Ausgabe: <Lachen> Wenn Sie es erstechen, Sie.

Eingabe: Plötzlich Angst
Ausgabe: Es ist beängstigend.

Input: Ich werde dich aufhalten
Ausgabe: Was ist es zum ersten Mal?

Sie können den interaktiven Modus verlassen, indem Sie am Ende "q" eingeben.

Die Unnatürlichkeit kann nicht beseitigt werden und gerät manchmal außer Kontrolle, aber es scheint, dass sie im Allgemeinen gut funktioniert. Da sich dieser Datensatz auf unterbrochene Konversationen konzentriert, kann es schwierig sein, steife Sätze zu schreiben.

Zusammenfassung

Das letzte Mal habe ich einen großen Fehler gemacht, aber dieses Mal konnte ich mit t2t einen Chat-Chat-Bot erstellen. Ich beantworte nur Fragen, anstatt zu reden, aber ich denke, es funktioniert bis zu einem gewissen Grad.

Es ist einfach, einen Chatbot zu erstellen, und es unterstützt auch andere maschinelle Lernaufgaben, sodass Sie möglicherweise problemlos erstellen können, was Sie möchten.

Verweise

[^ 1]: Offizielles Dokument So erstellen Sie Ihren eigenen Datensatz [^ 2]: Komm schon! Chatbot whywaita-kun! [^ 3]: Japanisch-englische Übersetzung mit tensor2tensor

Recommended Posts

Ich habe einen Chat-Chat-Bot mit Tensor2Tensor erstellt und diesmal hat es funktioniert
Ich habe versucht, LINE BOT mit Python und Heroku zu machen
Erstellt eine Web-App, die IT-Ereignisinformationen mit Vue und Flask abbildet
Eine Geschichte, die stolperte, als ich mit Transformer einen Chat-Chat-Bot erstellte
Ich habe ein Paket erstellt, um Zeitreihen mit Python zu filtern
Diesmal habe ich mit Prorate Python III und IV gelernt
Ich habe Chatbot mit LINE Messaging API und Python erstellt
Ich habe mit Python eine Lotterie gemacht.
Ich habe mit Python einen Daemon erstellt
Ich habe einen Server mit Python-Socket und SSL erstellt und versucht, über den Browser darauf zuzugreifen
Ich habe eine einfache Schaltung mit Python gemacht (AND, OR, NOR, etc.)
Ich habe mit Python, Flask und Heroku ein Nyanko-Tweet-Formular erstellt
Ich habe Chatbot mit der LINE Messaging API und Python (2) ~ Server ~ erstellt
Ich habe mit Python einen Zeichenzähler erstellt
Ich habe mit Python eine Hex-Map erstellt
Ich habe ein Lebensspiel mit Numpy gemacht
Ich habe einen Hanko-Generator mit GAN gemacht
Ich habe mit Python ein schurkenhaftes Spiel gemacht
Ich habe mit Python eine Einstellungsdatei erstellt
Ich habe eine WEB-Bewerbung bei Django gemacht
Ich habe mit Python einen Neuronensimulator erstellt
Ich habe einen Stempelersatzbot mit Linie gemacht
Ich habe mit Python eine Bot-Wettervorhersage gemacht.
Ich habe eine GUI-App mit Python + PyQt5 erstellt
Ich habe versucht, mit Python einen Twitter-Blocker für faule Mädchen zu machen
[Python] Ich habe mit Tkinter einen Youtube Downloader erstellt.
Ich habe eine einfache Brieftasche aus Bitcoin mit Pycoin gemacht
Ich habe einen LINE Bot mit Serverless Framework erstellt!
Ich habe mit Numpy eine Grafik mit Zufallszahlen erstellt
Ich habe mit Python ein Bin-Picking-Spiel gemacht
Mattermost Bot mit Python gemacht (+ Flask)
Ich habe ein Tool erstellt, um Slack über Connpass-Ereignisse zu informieren, und es zu Terraform gemacht
[Für Anfänger] Ich habe mit Raspberry Pi einen menschlichen Sensor erstellt und LINE benachrichtigt!
Ich habe ein System erstellt, das automatisch entscheidet, ob es morgen mit Python ausgeführt wird, und es zu Google Kalender hinzufügt.
[AWS] Ich habe BOT mit LINE WORKS daran erinnert
Ich habe einen Twitter BOT mit GAE (Python) gemacht (mit einer Referenz)
Ich habe mit Play with Docker einen gebrauchsfertigen Syslog-Server erstellt
Ich habe mit Python ein Weihnachtsbaum-Beleuchtungsspiel gemacht
Ich habe ein Programm erstellt, um Bilder mit Python und OpenCV in ASCII-Grafik umzuwandeln
Ich habe mit Tkinter ein Fenster für die Protokollausgabe erstellt
Ich habe ein Docker-Image erstellt, das RSS liest und automatisch regelmäßig twittert, und es veröffentlicht.
Ich habe mit Python eine App für die Benachrichtigung über Netznachrichten erstellt
Diesmal habe ich Python I und II bei Progate gelernt.
Ich habe eine Python3-Umgebung unter Ubuntu mit direnv erstellt.
[Einführung in den Systemhandel] Ich habe einen Stochastic Oscillator mit Python gezeichnet und damit gespielt ♬
Bildverarbeitung mit Python (ich habe versucht, es in 0 und 1 Mosaikkunst zu binarisieren)
Ich habe mit Sense HAT ein gefallenes Monospiel gemacht
Ich habe es mit der Verarbeitung "Der lebende Othello-Typ von Sakanaction" geschafft.
Ich mag es nicht, mit der Veröffentlichung von Pokemon Go frustriert zu sein, deshalb habe ich ein Skript erstellt, um die Veröffentlichung zu erkennen und zu twittern
Ich habe ein Tool erstellt, mit dem das Erstellen und Installieren eines öffentlichen Schlüssels etwas einfacher ist.
Ich habe python3.4 in .envrc mit direnv geschrieben und es zugelassen, aber ich habe einen Syntaxfehler erhalten
Wenn ich eine Django-App auf Apache2 bereitstelle und keine statischen Dateien mehr liest
Ich habe ein einfaches Tippspiel mit tkinter of Python gemacht
Ich habe versucht, eine Rangliste zu erstellen, indem ich das Mitgliederteam der Organisation abgekratzt habe