[PYTHON] J'ai créé un chat chat bot avec Tensor2Tensor et cette fois cela a fonctionné

introduction

J'ai essayé de créer un chatbot en changeant la méthode de l'échec précédent. Cette fois, cela a fonctionné, mais ce n'est pas très intéressant car c'est presque conforme à la documentation officielle.

Le dernier échec vient de ici Le code complet provient de ici

Comment faire

Cette fois, j'ai décidé d'utiliser Tensor2Tensor (t2t) fourni par l'équipe Google Brain. La caractéristique de t2t est qu'il est facile à exécuter sans écrire de code (commande uniquement) si vous voulez simplement apprendre avec l'ensemble de données déjà préparé. Il est beaucoup plus facile d'exécuter votre propre ensemble de données, car vous n'avez besoin que de quelques lignes de code et d'un ensemble de données bien formé, comme décrit dans la plupart des documents officiels.

Cette fois, je vais essayer d'apprendre et de déduire en utilisant input_corpus.txt et output_corpus.txt extraits du Meidai Conversation Corpus créé la dernière fois en tant qu'ensemble de données. L'environnement d'exécution est Google Colab.

De plus, nous procéderons selon le contenu du document officiel [^ 1], ici [^ 2], ici [^ 3], etc.

Préparation du jeu de données

Si vous procédez selon la page de référence ci-dessus, vous avez besoin des deux éléments suivants.

Pour plus de détails sur la façon de le faire, laissez-le à la page de référence. Pour le moment, il suffit de mettre le code

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}

Les changements par rapport à la documentation officielle sont le nom de la classe et les parties requises de la fonction generate_samples. Il est d'usage d'écrire le nom de la classe dans un étui de chameau, mais pour une raison quelconque, j'ai dû l'écrire dans un étui de serpent en tenant compte de l'avenir. C'est un petit mystère que cela devrait fonctionner avec un cas de chameau.

__init__.py


from . import myproblem

Pour cela, écrivez simplement le contenu ci-dessus et placez-le dans le même répertoire que myproblem.py.

Prétraitement des données

t2t prétraite également les données presque automatiquement. C'est pratique. (Le code ci-dessous convertit du format notebook au format .py)

ChatBot_with_t2t.py


#Tensorflow version 1,X
"""

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

"""#Modèle d'apprentissage automatique(Transformer)À installer"""

!pip install tensor2tensor

"""#Monture Google Drive"""

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

"""#Changer de répertoire de travail"""

cd /content/drive/My Drive/Colab Notebooks

"""#Prétraitement des données d'entraînement"""

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

Cette fois, placez myproblem.py et \ _ \ _ init__.py dans le répertoire t2t un niveau sous ChatBot \ _with \ _t2t.ipynb. Aussi, cette fois, j'ai mis input_corpus.txt et output_corpus.txt dans le même répertoire que .ipynb, mais comme il y a des fichiers générés après l'exécution, il peut être préférable de les enregistrer dans un dossier séparé.

Pour l'option de ligne de commande problem =, spécifiez le nom de la classe modifié dans myproblem.py (il a été initialement converti automatiquement de camel case en snake case, mais cela n'a pas fonctionné).

Apprendre

ChatBot_with_t2t.py


"""#Exécution de l'apprentissage"""

!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

Lors du pré-traitement, le répertoire a été spécifié avec un chemin relatif, mais il est bien sûr possible de le décrire avec un chemin absolu. Cette fois, je me suis échappé avec \ car il y a un espace dans le chemin. Cette fois également, le modèle d'apprentissage se fait avec le transformateur. Cette étude a duré environ 3 à 4 heures. De plus, pour effacer la limite de 90 minutes, il est automatiquement rechargé par la fonction d'extension Chorme.

Il y a une mise en garde: la course à pied produit beaucoup de produits intermédiaires. Dans mon propre environnement, la poubelle de Google Drive était pleine et j'ai dû la vider lors de l'exécution. Le fichier d'entraînement généré après l'exécution consomme encore beaucoup d'espace, vous devrez donc peut-être le supprimer chaque fois que vous n'en aurez plus besoin.

Déduire

ChatBot_with_t2t.py


"""#Déduire"""

!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

Il peut être exécuté de manière interactive avec la commande ci-dessus.

Résultat d'exécution

Vous pouvez parler au bot en appuyant sur la commande decode. Ce qui suit est un extrait du contenu d'entrée et de sortie.

Entrée: Bonjour
Sortie: qu'est-ce que cela signifie?

Entrée: non, vous dites bonjour
Sortie: Très bien.

Entrée: ce qui est bien(Lol)
Sortie: Ouais.

Entrée: Ouais
Sortie: personnalité?

Entrée: c'est le personnage
Sortie: Eh bien, c'est vrai.

Entrée: je suis convaincu
Sortie: téléphone, carte de téléphone, généralement merci, c'est naturel de donner.

Entrée: soudainement déchaîné
Sortie: <Rire> Si vous le poignardez, vous.

Entrée: soudainement effrayé
Sortie: C'est effrayant.

Entrée: je vais vous arrêter
Sortie: Qu'est-ce que c'est pour la première fois?

Vous pouvez quitter le mode interactif en tapant «q» à la fin.

La contre-nature ne peut pas être effacée et parfois elle devient incontrôlable, mais il semble que cela fonctionne généralement bien. Étant donné que cet ensemble de données est centré sur des conversations interrompues, il peut être difficile d'écrire des phrases rigides.

Résumé

La dernière fois, j'ai fait une grosse erreur, mais cette fois, j'ai pu créer un chat de chat en utilisant t2t. Je réponds simplement aux questions plutôt que de parler, mais je pense que cela fonctionne dans une certaine mesure.

Il est facile de créer un chatbot et il prend également en charge d'autres tâches d'apprentissage automatique, vous pouvez donc créer facilement ce que vous voulez.

Les références

[^ 1]: Document officiel Comment créer votre propre ensemble de données [^ 2]: Allez! Chatbot whywaita-kun! [^ 3]: traduction japonais-anglais avec tensor2tensor

Recommended Posts

J'ai créé un chat chat bot avec Tensor2Tensor et cette fois cela a fonctionné
J'ai essayé de faire LINE BOT avec Python et Heroku
Création d'une application Web qui mappe les informations sur les événements informatiques avec Vue et Flask
Une histoire qui a trébuché lorsque j'ai créé un bot de chat avec Transformer
J'ai créé un package pour filtrer les séries chronologiques avec python
Cette fois, j'ai appris python III et IV avec Prorate
J'ai créé Chatbot en utilisant l'API LINE Messaging et Python
J'ai fait une loterie avec Python.
J'ai créé un démon avec Python
J'ai créé un serveur avec socket Python et ssl et j'ai essayé d'y accéder depuis le navigateur
J'ai fait un circuit simple avec Python (AND, OR, NOR, etc.)
J'ai créé un formulaire de tweet Nyanko avec Python, Flask et Heroku
J'ai créé Chatbot en utilisant l'API LINE Messaging et Python (2) ~ Server ~
J'ai fait un compteur de caractères avec Python
J'ai fait une carte hexadécimale avec Python
J'ai fait un jeu de vie avec Numpy
J'ai fait un générateur Hanko avec GAN
J'ai fait un jeu rogue-like avec Python
J'ai créé un fichier de configuration avec Python
J'ai fait une application WEB avec Django
J'ai fait un simulateur de neurones avec Python
J'ai fait un robot de remplacement de tampon avec une ligne
J'ai fait une prévision météo de type bot avec Python.
J'ai créé une application graphique avec Python + PyQt5
J'ai essayé de créer un bloqueur de filles pourries sur Twitter avec Python ①
[Python] J'ai créé un téléchargeur Youtube avec Tkinter.
J'ai fait un simple portefeuille de Bitcoin avec pycoin
J'ai créé un Bot LINE avec Serverless Framework!
J'ai fait un graphique de nombres aléatoires avec Numpy
J'ai fait un jeu de cueillette avec Python
Made Mattermost Bot avec Python (+ Flask)
J'ai créé un outil pour informer Slack des événements Connpass et en ai fait Terraform
[Pour les débutants] J'ai fait un capteur humain avec Raspberry Pi et notifié LINE!
J'ai créé un système qui décide automatiquement de s'exécuter demain avec Python et l'ajoute à Google Agenda.
[AWS] J'ai créé un BOT de rappel avec LINE WORKS
J'ai fait un Twitter BOT avec GAE (python) (avec une référence)
J'ai créé un serveur syslog prêt à l'emploi avec Play with Docker
J'ai fait un jeu d'éclairage de sapin de Noël avec Python
J'ai créé un programme pour convertir des images en art ASCII avec Python et OpenCV
J'ai créé une fenêtre pour la sortie du journal avec Tkinter
J'ai créé et publié une image Docker qui lit RSS et tweete automatiquement régulièrement.
J'ai créé une application de notification de nouvelles en ligne avec Python
Cette fois, j'ai appris Python I et II à Progate.
J'ai créé un environnement Python3 sur Ubuntu avec direnv.
[Introduction au trading système] J'ai dessiné un oscillateur stochastique avec python et joué avec ♬
Traitement d'image avec Python (j'ai essayé de le binariser en art mosaïque 0 et 1)
J'ai fait un jeu mono tombé avec Sense HAT
Je l'ai fait avec le traitement, "Le gars d'Othello live de Sakanaction".
Je n'aime pas être frustré par la sortie de Pokemon Go, j'ai donc créé un script pour détecter la sortie et le tweeter
J'ai créé un outil qui facilite un peu la création et l'installation d'une clé publique.
J'ai écrit python3.4 dans .envrc avec direnv et je l'ai autorisé, mais j'ai eu une erreur de syntaxe
Lorsque je déploie une application Django sur Apache2 et qu'elle ne lit plus les fichiers statiques
J'ai fait un jeu de frappe simple avec tkinter de Python
J'ai essayé de faire un classement en grattant l'équipe des membres de l'organisation