[PYTHON] J'ai essayé l'apprentissage automatique pour convertir des phrases en style XX

Aperçu

Ce texte est un enregistrement d'un algorithme qui transforme n'importe quel texte en n'importe quel style d'auteur. Ces dernières années, une application très intéressante appelée Prisma a été lancée pour le traitement d'images. Il s'agit d'un service qui convertit des images arbitraires en style Goch ou Cubic. Le dernier apprentissage automatique était un exemple très intéressant de ce qui était réellement utilisé dans le service. Cette phrase a été développée dans le but de "convertir une phrase arbitraire en style XX" au lieu de l'œuvre "convertir une image arbitraire en style XX" réalisée par Prisma. Par exemple

** "Vous êtes un imbécile." **

Si vous faites la phrase comme Shikinami Asuka

** "Es-tu stupide?" **

Et quand ça change au style Hoshino Ruri,

** "Idiot." **

Pourrait devenir. Pour donner un autre exemple,

"Je suis un chat."

Si vous convertissez la phrase en style Natsume Soseki,

** "Je suis un chat." **

Cela peut être une conversion. Le chapitre de texte a essayé une approche pour les atteindre, mais ** en fait cela n'a pas très bien fonctionné. ** ** Donc, bien que ce soit un record d'échec, si vous êtes toujours bon, veuillez voir ce qui suit.

Recherche précédente

Comme le montre la vue d'ensemble, l'application Prisma est très connue dans le domaine de l'image. Cela devrait être une extension du Deep Learning utilisant CNN. De plus, il existe une conversion de qualité vocale. Il est facile d'imaginer le changeur de voix de type papillon qui apparaît dans Detective Conan, mais c'est une machine qui peut changer la voix en la soi-disant voix d'une autre personne. Une telle approche est obtenue en extrayant et en séparant la quantité caractéristique de la voix appelée Melkepstram et en resynthétisant la quantité caractéristique d'une autre personne. D'autre part, nous tournons notre attention vers le traitement du langage naturel. Il semble qu'il n'y ait pas beaucoup d'études de ce type dans le traitement de la langue japonaise. Un exemple célèbre sur le net est Monjiro (http://monjiro.net/). C'est un site qui peut convertir des phrases arbitraires en style XX. Par exemple, si vous convertissez «Vous êtes un imbécile» en un style de samouraï, il sera converti en la phrase «Vous êtes un imbécile». Un autre site est ClalisTone (https://liplis.mine.nu/lipliswiki/webroot/?ClalisTone4.1). L'API est ouverte au public, et si vous lisez les spécifications, vous trouverez la description suivante.

① nom Nom du paramètre(Tout)
② type Type de réglage(0:Conversion normale, 1:Terminer la conversion)
③ avant la chaîne de caractères cible de la conversion
④ après conversion chaîne de caractères du mot

De là, on peut voir que ce type d'algorithme peut être divisé en deux types. Le premier est la «conversion en tout lieu» et le second est la «conversion de queue». En prenant la langue des samouraïs comme exemple, la chaîne de caractères "vous êtes" correspond à la conversion de la première, la conversion de "vous êtes" et la dernière partie de "est" est la conversion de "gozaru". Vous pouvez voir que cela correspond à la conversion. Cependant, ces approches sont problématiques. Le remplacement est si simple qu'il ne peut pas être converti comme la formule vague à la façon d'Asuka "Tu es stupide?" De plus, le style d'écriture qui peut être converti à la fin est limité à la langue parlée. Par exemple, en considérant que la conversion se termine par "Nya" comme le langage dit des chats, la phrase "Le train est arrivé" devient le style de phrase "Le train est arrivé". Il s'avère que c'est une méthode qui ne peut pas être appliquée à des choses comme les romans qui traitent. Ici, dans ce texte, considérons ** la conversion de style qui peut également être utilisée en langage écrit **.

Cible Exemple
Langue parlée Monjiro, ClalisTone
Langue littéraire Cette méthode

Concept de base de l'algorithme

Ici, nous décrivons une méthode de conversion de style telle que Prisma. En gros, il peut être divisé en parties «éléments de base» et «style» de l'image. Bien que je ne l'explique que brièvement, l'image est générée à partir de la partie liée à la "forme" et à la "composition" de "l'élément de base" et de la partie représentée ici, et optimisée pour convenir au "style". Il est important de se diviser en deux éléments de cette manière.

image

Un autre exemple de conversion vocale est

image

Ça devient comme ça. Bien que la hauteur et la longueur du son soient identiques, la voix est convertie en modifiant la qualité de la voix. Le MIDI peut être plus intuitif et plus facile à comprendre. Le MIDI ajuste essentiellement la hauteur et la longueur, et vous pouvez facilement changer la tonalité plus tard. Même avec la même partition musicale, vous pouvez jouer un son avec une trompette ou un son avec un piano.

Ici, la conversion de style traitée dans ce texte peut être divisée comme suit.

image

Les «éléments de base» incluent «la signification des phrases», tandis que le «style» inclut «la sélection de mots / le ton». il est concevable que. Dans l'exemple précédent, la phrase "Vous êtes un imbécile." Et la phrase "Vous êtes stupide?" Ont la même ** signification **, mais seulement ** la sélection de mots et le ton **. Tu peux voir ça.

algorithme

Le flux de conversion de qualité vocale générale est le suivant. (Le contenu est simplifié pour la commodité de la figure)

image

De cette manière, la qualité de la voix et la hauteur sont séparées en 1., remplacées par la qualité de la voix d'une autre personne en 2. et resynthétisées en 3. Cela devient la méthode. La conversion de style d'image adopte une approche similaire, mais il est difficile d'appliquer cette méthode à la conversion de style de texte. La raison en est que la méthode de séparation du «sens» et de la «sélection des mots» dans les phrases n'a pas été étudiée, et la même approche est considérée comme très difficile. Cette approche limitée est la "conversion de ton de bout en bout" montrée plus tôt, et si c'est le dernier mot, cela n'affectera pas autant la signification. Sous l'hypothèse, il est considéré comme une méthode d'ajout du caractère «nya» à la fin du mot. Ici, nous allons changer le style du texte dans une perspective différente.

image

  1. Générer des phrases à partir du modèle de génération de phrases
  2. Comparez le sens de la phrase que vous souhaitez convertir (phrase originale) avec la phrase générée en 1.
    1. Afficher uniquement les phrases avec la signification la plus proche

C'est un mécanisme. La génération automatique de phrases de style XX inclut la génération automatique par le modèle caché de Markov, qui était très populaire pendant un certain temps. En utilisant ceci, générez une phrase en 1. Une méthode appelée Doc2Vec est utilisée pour la comparaison sémantique. La méthode appelée word2vec était populaire auparavant, mais c'est une version étendue de cette méthode qui vous permet de comparer la signification des phrases avec un réseau de neurones. Nous allons l'utiliser dans 2.

Préparation des données

Le corpus lui-même utilisait l'Aozora Bunko. Vous pouvez télécharger les données de chaque auteur sur le site suivant.

Téléchargement groupé d'Aozora Bunko par écrivain http://keison.sakura.ne.jp/

Ensuite, les 50 phrases suivantes ont été générées par Mecab et utilisées pour apprendre Doc2Vec.

Andersen, Kafka, Grimm, Gogol, Jean Christoph, Dante, Chehoff, Doyle, Boardrail, Po, MacLeod, Mopassan, Rilke, Loran, Victor Hugo, Ango's New Japan Geography, 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, My View of Life, Unno Juzo, Akutagawa Ryunosuke, Kajii Motojiro, 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, Yoshito Harada, Kazuzo Kuwahara, Yoshito Harada, Juin

Certains d'entre eux ne sont pas des noms personnels, mais le texte n'est probablement pas traité en raison d'une erreur.

Pré-expérience

Nous avons préparé le script suivant.

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)

Utilisez ce script

$ python estimate.py [Nom du modèle Doc2Vec] "[Phrase 1]" "[Phrase 2]"

Sous la forme de, vous pouvez mesurer la similitude entre la phrase 1 et la phrase 2. (Le code de la partie d'apprentissage de Doc2vec est omis.) Suite à l'expérimentation de ceci,

kotauchisunsun-VirtualBox$ python estimate.py nda6.model "Je suis un chat." "Je suis un chat."
0.667711547669
kotauchisunsun-VirtualBox$ python estimate.py nda6.model "Je suis un chat." "Je suis un chat."
0.805627031659

(^ ω ^) ...?

Après l'avoir essayé plusieurs fois, j'ai remarqué que la similitude de gensim est normalisée de -1 à 1, et plus elle est proche de 1, plus la signification de la phrase semble proche. Cependant, il y a beaucoup de points que je ne peux pas comprendre, et je ne l'ai pas bien compris car il se comportait comme ** la similitude n'atteignait pas 1.0 même si je mets la même phrase. Probablement, je me sens comme la spécification de similarity_unseen_doc. Après cela, la valeur d'évaluation n'était pas stable, et lorsque la même phrase était évaluée trois fois, la valeur devenait progressivement plus petite. .. ..

Expérience de conversion de style

Au moment de la préparation, je n'ai qu'un mauvais pressentiment, mais générons-le en fait automatiquement. L'entrée est "Je suis un chat".

0.409022161426 "La plupart de ce cas est ce qu'était votre femme"
0.480818568261 "Comme c'est devenu ennuyeux."
0.559027353215 "Il a perdu les yeux."
0.659924672818 "C'est moi - cette personne et là"
0.746559396136 "C'est un mari"
0.781097738802 "C'était juste ça."
0.786329416341 "Je suis seul."
0.802889606127 "Je me suis rencontré aujourd'hui."
0.818648043016 "C'est à moi."

De toute évidence, il est généré de manière aléatoire, donc il faut en fait beaucoup d'efforts pour attribuer le mot «je». Mais qu'en est-il de la plus grande similitude de la phrase "C'est un mari" que de la phrase "Je suis un chat" ...? La question est plus forte. Maintenant, faisons une expérience de contrôle pour diviser le problème. Tout d'abord, j'ai modifié le code HMM pour que le mot «I» soit toujours sélectionné et l'ai généré automatiquement. Cela a fonctionné relativement bien, donc je l'exécute depuis longtemps. Cette fois, il n'est pas généré de manière complètement aléatoire par HMM, mais il est généré 10 000 fois, les mots avec des scores élevés en moyenne sont déterminés et le mot suivant est essayé. La méthode de génération est prise. Je fais quelque chose de proche de la recherche d'arbres de Monte Carlo.

0.0880615096769 Début de l'automne, sans mes ailes
0.7469903088 J'ai été détruit.
0.759754754423 J'en ai un.
0.780031448973 Je ne suis pas ma petite amie.
0.79565634711 C'est moi.
0.834694349115 J'ai dit que c'était mon chat.
0.838936420823 Est-ce mon chat?
0.855492222823 Êtes-vous un chat?
0.85682326727 C'est mon chat.
0.86722014861 Je ne suis pas un chat
0.878538129172 Je ne peux pas le faire avec mon chat.

Ah, c’est délicieux. Je demande: "Êtes-vous un chat?" Après cela, il dit "C'est mon chat". Après cela, quand j'ai pensé: «Je ne suis pas un chat domestique, je suis moi-même» ou quelque chose comme «Je ne peux pas le faire avec un chat domestique». Quand Comme vous pouvez le voir, il ne semble pas y avoir de bogue autour de la génération automatique. Par conséquent, il semble qu'une phrase similaire à la phrase "Je suis un chat" puisse être générée pour le moment. Cependant, il y a une partie où la comparaison de sens des phrases n'est pas bonne, et il y a une possibilité que la conversion ne soit pas bien faite. En revanche, si le nombre de serveurs est augmenté, le nombre d'essais augmentera et une réponse précise sera donnée. Dans l'exemple ci-dessus, «Je suis un chat». Et bien que l'essai soit presque terminé et qu'il n'y avait presque pas d'options au-delà, «Je suis un chat». En regardant le fait que j'obtiens la réponse, «je suis celui qui ne dit rien», je pense qu'il est sage d'améliorer l'exactitude de la comparaison des sens des phrases.

Résumé

Nous avons conçu et implémenté un algorithme pour convertir le style des phrases. Cependant, ce n'était pas une conversion très précise et il était possible d'obtenir une solution approximative à la solution initialement prévue en contrôlant manuellement certains mots.

Exemple d'application

Cela peut être un bon moyen d'ajouter de la personnalité à un chatbot.

[Evangelion] Essayez de générer automatiquement des lignes de type Asuka avec Deep Learning http://qiita.com/S346/items/24e875e3c5ac58f55810

Il existe un article intitulé "Deep Learning", et nous menons une expérience pour générer des phrases comme Shikinami Asuka. Ici, aux données utilisées

Choses à aimer-Introduction de lignes d'anime- http://lovegundam.dtiblog.com/blog-category-7.html

Il semble y avoir un site qui résume les lignes de tous les personnages d'Evangelion. Si la précision de cette méthode peut être améliorée, il peut être intéressant de dire que ** les assistants personnels qui ne pouvaient recevoir et répondre que comme Siri peuvent être modernisés avec l'individualité à partir des données de script de personnage **.

Impressions

Je sentais que je pouvais améliorer un peu plus la précision, mais le temps était écoulé. Le réglage de Doc2Vec était très ennuyeux et est rarement utilisé dans la pratique. C'était un problème. Par conséquent, je ne pouvais comprendre que comment utiliser le Doc2Vec de gensim, et il a fallu beaucoup de temps pour déplacer et vérifier le code un par un. L'histoire originale que j'ai inventée est la suivante. [Sakura Tomoyo le 19 juin] Osamu Osamu relancé par la programmation (http://pdmagazine.jp/people/dazai-program/). Quand j'ai vu cela, je me suis demandé si je pouvais faire quelque chose de plus intéressant. En fait, je voulais personnellement incorporer la comparaison de sens de BM25, qui avait été adoptée, mais devrait-elle être incluse dans la tendance? En y repensant, j'ai essayé Doc2Vec de gensim. De plus, il semble que les performances de Mecab soient également mauvaises. C'est parce que le texte dans Aozora Bunko est 50 ans avant la date d'expiration, donc le libellé est un peu démodé. En raison de la vérification visuelle du nombre de pièces, il y avait des endroits où la division était étrange, donc c'est difficile pour Mecab, qui est basé sur un langage moderne. Il semble que cela affecte également la précision de l'apprentissage automatique. Récemment, l'apprentissage hostile tel que le GAN est également populaire, mais je veux toujours des données de correspondance pour l'apprentissage. Sans cela, l'apprentissage automatique est difficile à atteindre dans certains endroits. Personnellement, je l'essaye et j'ai l'impression que c'est fait. La situation actuelle est que la précision ne s'améliore pas tellement parce qu'elle fait quelque chose comme ça. Je suis devenu comme ça, mais les deuxième et troisième passionnés de traitement du langage naturel feront de leur mieux.

Recommended Posts

J'ai essayé l'apprentissage automatique pour convertir des phrases en style XX
J'ai essayé de déplacer l'apprentissage automatique (détection d'objet) avec TouchDesigner
J'ai essayé de compresser l'image en utilisant l'apprentissage automatique
J'ai essayé l'apprentissage automatique avec liblinear
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
Je voulais convertir ma photo de visage en un style Yuyu.
[Apprentissage automatique] J'ai essayé de faire quelque chose comme passer des images
J'ai installé Python 3.5.1 pour étudier l'apprentissage automatique
Mayungo's Python Learning Episode 6: J'ai essayé de convertir une chaîne de caractères en nombre
J'ai essayé de classer les accords de guitare en temps réel en utilisant l'apprentissage automatique
(Apprentissage automatique) J'ai essayé de comprendre attentivement la régression linéaire bayésienne avec l'implémentation
J'ai essayé de visualiser le modèle avec la bibliothèque d'apprentissage automatique low-code "PyCaret"
J'ai essayé d'organiser les index d'évaluation utilisés en machine learning (modèle de régression)
J'ai essayé de prédire la présence ou l'absence de neige par apprentissage automatique.
J'ai essayé de prédire l'évolution de la quantité de neige pendant 2 ans par apprentissage automatique
J'ai essayé d'implémenter diverses méthodes d'apprentissage automatique (modèle de prédiction) en utilisant scicit-learn
J'ai essayé de traiter et de transformer l'image et d'élargir les données pour l'apprentissage automatique
J'ai essayé le deep learning
J'ai essayé de déboguer.
Introduction à l'apprentissage automatique
J'ai essayé de mettre Pytest dans la bataille réelle
J'ai essayé d'analyser linguistiquement les phrases incompréhensibles de Karen Takizawa.
[Deep Learning from scratch] J'ai essayé d'expliquer le décrochage
[Keras] J'ai essayé de résoudre le problème de classification des zones de type beignet par apprentissage automatique [Étude]
J'ai essayé de créer un environnement d'apprentissage automatique avec Python (Mac OS X)
Oncle SE avec un cerveau endurci a essayé d'étudier l'apprentissage automatique
J'ai essayé d'apprendre PredNet
J'ai essayé d'implémenter la détection d'anomalies par apprentissage de structure clairsemée
Une introduction à l'apprentissage automatique
Un débutant en apprentissage automatique a essayé la RBM
J'ai essayé de comparer la précision des modèles d'apprentissage automatique en utilisant kaggle comme thème.
J'ai essayé d'organiser SVM.
[Chaîne de Markov] J'ai essayé de charger des émotions négatives dans Python.
Application correspondante, j'ai essayé de prendre des statistiques de personnes fortes et j'ai essayé de créer un modèle d'apprentissage automatique
J'ai essayé d'implémenter PCANet
[Chaîne de Markov] J'ai essayé de lire les citations en Python.
J'ai essayé d'utiliser Tensorboard, un outil de visualisation pour l'apprentissage automatique
J'ai essayé de vérifier la classification yin et yang des membres hololive par apprentissage automatique
Mayungo's Python Learning Episode 3: J'ai essayé d'imprimer des nombres
J'ai essayé de réintroduire Linux
J'ai essayé d'implémenter ListNet d'apprentissage de rang avec Chainer
[TF] J'ai essayé de visualiser le résultat de l'apprentissage en utilisant Tensorboard
J'ai essayé de présenter Pylint
J'ai essayé de résumer SparseMatrix
J'ai essayé d'implémenter Extreme Learning Machine
Super introduction à l'apprentissage automatique
J'ai essayé de traduire de force des sous-titres anglais en japonais avec Udemy
jupyter je l'ai touché
J'ai essayé d'implémenter Perceptron Part 1 [Deep Learning from scratch]
J'ai essayé d'implémenter StarGAN (1)
J'ai essayé d'écrire dans un modèle de langage profondément appris
J'ai essayé de créer Othello AI avec tensorflow sans comprendre la théorie de l'apprentissage automatique ~ Introduction ~
J'ai essayé de comprendre l'apprentissage supervisé de l'apprentissage automatique d'une manière facile à comprendre, même pour les ingénieurs serveurs 1
[API Qiita] [Statistiques • Apprentissage automatique] J'ai essayé de résumer et d'analyser les articles publiés jusqu'à présent.
J'étais frustré par Kaggle, alors j'ai essayé de trouver une bonne propriété locative en grattant et en apprentissage automatique
J'ai essayé HR Tech pour développer un moteur de recherche expert par apprentissage automatique des informations de réunion en interne
J'ai essayé de comprendre l'apprentissage supervisé de l'apprentissage automatique d'une manière facile à comprendre, même pour les ingénieurs serveurs 2
J'ai essayé de créer Othello AI avec tensorflow sans comprendre la théorie de l'apprentissage automatique ~ Implémentation ~