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
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.
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.
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).
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.
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.
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.
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.
[^ 1]: Offizielles Dokument So erstellen Sie Ihren eigenen Datensatz [^ 2]: Komm schon! Chatbot whywaita-kun! [^ 3]: Japanisch-englische Übersetzung mit tensor2tensor