[PYTHON] Extraction de thèmes de texte japonais 2 Édition pratique

Aidemy 2020/10/30

introduction

Bonjour, c'est Yope! Je suis une école littéraire croustillante, mais j'étais intéressé par les possibilités de l'IA, alors je suis allé à l'école spécialisée en IA "Aidemy" pour étudier. Je voudrais partager les connaissances acquises ici avec vous, et je les ai résumées dans Qiita. Je suis très heureux que de nombreuses personnes aient lu l'article de synthèse précédent. Merci! Cette fois, ce sera le deuxième article d'extraction de sujet de texte japonais. Ravi de vous rencontrer.

Quoi apprendre cette fois ・ Mise en place d'un système de sélection de texte de réponse

Système de sélection de texte de réponse

-____ Le système de sélection des phrases de réponses __ est un système __ qui reçoit des candidats à plusieurs réponses pour une phrase de question et sélectionne automatiquement la bonne réponse parmi eux. -Pour l'ensemble de données, utilisez Textbook Question Answering, et utilisez les données d'entraînement comme "train.json" et les données d'évaluation comme "val.json".

Prétraitement des données

-Lors de l'utilisation de l'apprentissage profond dans le traitement du langage naturel, les données ne peuvent pas être traitées telles quelles. Comme nous l'avons appris dans "Natural Language Processing", les phrases doivent d'abord être divisées en mots "__separation __". Cette fois, nous attribuerons également un identifiant à chaque word . -De plus, comme le calcul matriciel ne peut pas être effectué si les longueurs des phrases d'entrée sont différentes, il est également nécessaire de " unifier les longueurs des phrases d'entrée". Ceci est également appelé Padding. Les détails seront décrits plus tard, mais 0 est ajouté aux phrases courtes et les phrases longues sont supprimées.

Normalisation / division

-Comme le prétraitement des données, la __normalisation et la division __ sont effectuées dans un premier temps. Comme les données sont cette fois en anglais, la normalisation et la division se feront en anglais. -La normalisation anglaise utilise la méthode de __ unifiant en majuscules et minuscules __. Cette fois, __ "Unifier toutes les minuscules" __ traitement. Il peut être réduit en utilisant la méthode __ "lower ()" __ pour les phrases en anglais. ・ Utilisez un outil appelé nltk pour la division anglaise. Si vous passez une phrase normalisée à __ "word_tokenize ()" __ de nltk, __ renverra une liste divisée par le mot __.

-Code (les résultats sont ['terre', 'science', 'est', 'la', 'étude', 'de']) スクリーンショット 2020-10-25 21.42.52.png

ID de mot

-Puisque le mot lui-même n'est pas traité comme une entrée dans le réseau neuronal, il est nécessaire de donner __ID __. -Si des identifiants sont donnés à tous les mots, le nombre de données sera trop grand, donc seuls ceux avec une certaine fréquence ou plus doivent être convertis en __ID __.

-Le code réel est le suivant. Voir ci-dessous pour une explication détaillée. スクリーンショット 2020-10-25 21.59.33.png

・ À propos du code ci-dessus __ "def preprocess (s)" __ est une fonction __ qui effectue __normalisation et division dans la section précédente. En dessous, __preprocess () __ est utilisé pour normaliser et séparer le texte de la question ['question'] et le texte de réponse ['choix de réponse'] des données du train, et le résultat (liste) est une liste vide. Stocker dans des «phrases». Pour chaque mot (w) de la "liste (s) divisée (s)" de cette phrase, un dictionnaire avec la fréquence obtenue par "vocab.get ()" en utilisant __ 'était une clé comme valeur. Stocker dans "vocab" __. De plus, préparez un dictionnaire vide "word2id", et pour chaque clé (w) et valeur (v) de vocal, __word2id n'a pas encore la même clé (w), et la valeur (v), c'est-à-dire que la fréquence est de 2 ou plus. Donne un identifiant avec "len (word2id)" __. Incidemment, toute valeur si la fréquence est considérée comme '' 1 a été préréglée de sorte que 0. La partie "cible" en bas normalise et divise "question", et obtient l'identifiant dans "word2id" pour chaque mot.

Padding -En tant que prétraitement des données, le remplissage__ qui unifie la longueur de l'instruction __ est effectué à la fin. Plus précisément, pour les phrases courtes, ajoutez 0, qui est un identifiant factice, à la fin autant que nécessaire __, et pour les phrases longues, supprimez autant de mots que nécessaire à la fin de la phrase __. C'est fait. -Pour exécuter le remplissage, utilisez __ "pad_sequences (argument)" __ de keras. Passez les données comme premier argument. Les arguments ci-dessous sont les suivants. ・ Maxlen: longueur maximale -Dtype: type de données ("np.int32" dans ce cas) -Padding: spécifiez "pre" ou "post". Spécifie si le remplissage est effectué à partir du début ou de la fin de la phrase. ・ Troncature: identique au remplissage Cela supprime le mot. -Valeur: spécifiez la valeur à remplir. (0 cette fois)

·code

Construire un modèle

Vue d'ensemble

-Utiliser __ "QA-LSTM basé sur l'attention" __ pour le modèle. La procédure est la suivante. ① Implémentez __BiLSTM pour chacune des questions et réponses __. (2) De la question à la réponse Attention, et obtenir des informations de réponse en tenant compte de la question. ③ À partir de la question et réponse après attention, __ calculer la moyenne (mean_pool) du vecteur d'état caché à chaque fois __. ④ Sortie __ en combinant les deux vecteurs de ③.

・ Figure![Capture d'écran 2020-10-30 13.08.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/17586dd7-fb8e-eccd- 11f6-490c8177080c.png)

(1) Implémenter BiLSTM pour les questions et réponses

-__ BiLSTM__ est un __ "réseau neuronal récursif bidirectionnel" __ qui entre des valeurs dans les deux sens, comme vu au chapitre 1. L'implémentation se fait avec __ "Bidirectionnel (argument)" __. -Définissez la couche d'entrée de Question comme "input1", et définissez Embedding comme BiLSTM avec __Bidirectional () __. De même, pour Answer, implémentez BiLSTM avec la couche d'entrée comme "input2".

・ Code![Capture d'écran 2020-10-25 23.38.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/f8543aa5-8428-9c29- 7e4b-d07a70fcd345.png)

② Attention de question à réponse

-En utilisant Attention, laissez la machine "déterminer si Answer est appropriée comme réponse à la question", c'est-à-dire en calculant les caractéristiques de Answer en considérant le vecteur d'état caché de Question à un certain moment __Question Vous pouvez obtenir des informations de réponse en tenant compte des informations de __. -Calculer le produit de la matrice avec "__dot () __" pour "h1" et "h2" qui ont abandonné BiLSTM "bilstm1" et "bilstm2" de deux phrases, appliquez-lui la fonction __Softmax __, puis __ Il peut être créé en calculant le produit matriciel de this et h1 __, et en connectant this et h2 avec "__concatenate () __" pour former la couche dense.

・ Code![Capture d'écran 2020-10-30 13.09.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/228e3f25-c90b-1321- 4be7-744ecf59b6c9.png)

Calculer la moyenne (mean_pool) des vecteurs d'état cachés à chaque instant

-À partir de la question et réponse après attention, __ Calculez la moyenne des vecteurs d'état cachés à chaque fois __. La moyenne à ce moment est appelée __ "mean_pool" . -Mean_pool est exécuté par __ "AveragePooling1D (argument) (x)" __ de keras. Pour chaque argument - Pool_size : Spécifiez la longueur des données x à transmettre - Strides : Spécifiez un entier ou Aucun - Padding __: Spécifiez le nom de la valeur

-Dans le code (décrit plus loin), utilisez d'abord AveragePooling1D pour "h1 (sortie de question)" et "h (sortie de réponse)" créés dans la section précédente. Afin de se combiner en ④, ce sont Reshape.

Sortie en combinant les deux vecteurs de ③

-Enfin, combinez "mean_pooled_1" et "mean_pooled_2" créés en ③ avec __concatenate () __. -Dans ce code, il faut passer __ "sub" et "mult" à concatenate (), donc créez chacun. Après avoir fait cela Reshape et créé une couche de sortie en sortie, créez un modèle avec __Model () __. La couche d'entrée transmet «input1» et «input2» créés dans ①.

・ Code![Capture d'écran 2020-10-30 13.11.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/f2bdd73d-46b6-53e5- 6c0b-38e4a160b157.png)

Apprentissage de modèle

Apprentissage

-Depuis que le modèle a été créé, l'étape suivante consiste à __ former ce modèle __. Le modèle d'entraînement lui-même peut être "__model.fit () __", mais avant cela, il est nécessaire de créer __ données d'apprentissage et de corriger l'étiquette de réponse __. ・ Pour __ données de formation, listez et transmettez les questions et réponses __. En guise de procédure, créez d'abord une liste vide "questions" "réponses", stockez __ 'question' __ des données de train dans la première, et stockez la partie valeur de __ 'answerChoices' __ dans la seconde. Et passez-le au modèle. -Pour la bonne étiquette de réponse, mettez le même choix que la __answer comme [1,0], les autres comme [0,1] __ "dans la liste vide" sorties ", et mettez ceci dans la liste vide" sorties ". Après la conversion au format NumPy avec, transmettez-le au modèle. Vous pouvez vérifier si __ est la même option que la réponse et voir si la clé (nombre) de __ 'answerChoices' correspond à 'correctAnswer'.

・ Code![Capture d'écran 2020-10-30 13.13.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/719c1b8b-3d23-d87b- 10fb-50e2c52c6fa0.png)

tester

-Enfin, __ tester la précision du modèle à l'aide des données d'évaluation __. Puisqu'il s'agit de ___2 valeurs de classification __, __ «Précision», «Précision» et «Rappel» __ sont calculées comme des indicateurs d'exactitude. ・ (Révision) En ce qui concerne la classification réelle des prédictions, il existe quatre types: __vrai positif, faux positif, faux négatif et vrai négatif __, et "dans quelle mesure la prédiction était-elle correcte dans l'ensemble" est _correct rate _, "Le rapport entre ce qui était supposé positif et réellement positif" est __ taux d'ajustement __, et "le rapport entre ce qui était correct et ce qui était prédit positif" est __ taux de rappel __. ・ En calculant ces indicateurs cette fois, nous devons d'abord vérifier le nombre de __ vrais positifs __. Afin de le savoir, il doit y avoir une «prédiction» et une «réponse correcte» pour la classification, alors obtenez ceci. La "prédiction" peut être obtenue avec __ "model.predict ()" __, et la "bonne réponse" peut être obtenue telle quelle à partir des sorties créées dans la section précédente. Les deux sont stockés sous la forme [1,0] si la réponse est correcte (correcte) et [0,1] si la réponse est incorrecte (négative), donc si vous extrayez uniquement la deuxième colonne avec __axis = -1, vous pouvez voir le positif ou le négatif. _. Après cela, sur la base de ce positif et négatif, nous classons quatre comme vrai positif et calculons le taux de réponse correct.

・ Code![Capture d'écran 2020-10-30 13.15.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/7c682822-8e73-d2d2- 5dbd-e29e3ff4a859.png)

・ Résultat![Capture d'écran 2020-10-30 13.15.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/688beca2-21d0-be64- 8a39-13419bb1be8c.png)

Visualisation de l'attention

-Attention de la phrase s à t, __ $ a_ {ij} $ __ indique à quel point le j-ème mot de __s prête attention au i-ème mot de t _. La matrice A ayant ce $ a {ij} $ comme composant (i, j) est appelée Attention Matrix. En regardant cela, vous pouvez visualiser la relation entre les mots __s et t __. -L'axe vertical est answer word, et l'axe horizontal est question word. La partie blanche __ est plus étroitement liée.

・ Figure (code ci-dessous) スクリーンショット 2020-10-30 13.24.25.png

・ Code![Capture d'écran 2020-10-30 13.24.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/13506aa3-2328-0435- c88b-bccd51d305b8.png)

Sommaire

-Lors de la transmission de données à un modèle d'apprentissage en profondeur, il est nécessaire de prétraiter les données. Il existe quatre types de prétraitement: division, normalisation, conversion d'ID et remplissage. -Le modèle utilisé cette fois-ci, "AQ-LSTM basé sur l'attention", est construit en implémentant BiLSTM, en calculant la moyenne des questions et réponses après attention, et en les combinant. ・ Lors de la formation du modèle, transmettez les données de formation (ID de la question) et l'étiquette de l'enseignant (numéro de réponse). Au moment de l'évaluation, le taux de réponse correct et le taux de rappel du taux de précision sont calculés. ・ En visualisant Attention, la relation entre les deux données peut être vue.

Cette fois, c'est fini. Merci d'avoir lu jusqu'à la fin.

Recommended Posts

Extraction de thèmes de texte japonais 2 Édition pratique
Extraction de sujets de texte japonais 1 Bases
Python: texte japonais: caractéristique du discours à partir de la similitude des mots
Python: texte japonais: caractéristique de la parole à partir de la continuité des mots
Localisation japonaise de Pycharm