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
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.
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.
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é).
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.
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.
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.
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.
[^ 1]: Document officiel Comment créer votre propre ensemble de données [^ 2]: Allez! Chatbot whywaita-kun! [^ 3]: traduction japonais-anglais avec tensor2tensor