[PYTHON] [Explication de la mise en œuvre] Comment utiliser la version japonaise de BERT dans Google Colaboratory (PyTorch)

Cet article décrit comment utiliser la version japonaise de BERT avec Google Colaboratory.

À propos de BERT lui-même, un livre que j'ai écrit l'année dernière

"Apprenez en créant! Développement en profondeur par PyTorch"

Il est expliqué en détail dans.

Si vous voulez savoir comment fonctionne BERT, veuillez consulter le livre ci-dessus.

Puisque le livre ne traite que de la version anglaise, cet article expliquera comment utiliser BERT dans la version japonaise. (Je voudrais en écrire environ deux après cet article.)

Le code d'implémentation de cet article se trouve dans le référentiel GitHub ci-dessous.

GitHub: Comment utiliser la version japonaise de BERT dans Google Colaboratory: code de mise en œuvre Il s'agit de 1_Japanese_BERT_on_Google_Colaboratory.ipynb.

** Liste des séries ** [1] * Cet article [Explication de la mise en œuvre] Comment utiliser la version japonaise de BERT avec Google Colaboratory (PyTorch) [2] [Explication de la mise en œuvre] Classification des actualités Livedoor dans la version japonaise BERT: Google Colaboratory (PyTorch) [3] [Explication de la mise en œuvre] Science du cerveau et apprentissage non supervisé. Classer MNIST par clustering de maximisation de la quantité d'informations [4] [Explication de la mise en œuvre] Classer les actualités de livingoor par apprentissage japonais BERT x non supervisé (clustering de maximisation de la quantité d'informations)


Préparation 1: Installez MeCab sur Google Colaboratory

Installez MeCab, un outil de partage (analyse morphologique). Il ne peut pas être installé avec pip, donc installez-le avec apt.

!apt install aptitude swig
!aptitude install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file -y

Installez mecab-python3 avec pip pour pouvoir utiliser MeCab à partir de Python.

!pip install mecab-python3

Installez NEologd, un dictionnaire, afin que MeCab puisse utiliser de nouveaux mots (nouveaux mots récents). (Cependant, il n'est pas utilisé dans les BERT formés)

!git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
!echo yes | mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n -a

Obtenez le chemin vers le nouveau dictionnaire de mots NEologd.

import subprocess

cmd='echo `mecab-config --dicdir`"/mecab-ipadic-neologd"'
path_neologd = (subprocess.Popen(cmd, stdout=subprocess.PIPE,
                           shell=True).communicate()[0]).decode('utf-8')

Ceci termine la préparation des spécifications MeCab.

Remarques (IPAdic et UniDic)

** ipadic ** dans le nouveau dictionnaire de mots mecab-ipadic-neologd signifie "dictionnaire IPA". Le dictionnaire IPA est organisé par "IPA part lyrics system".

Vous avez peut-être vu l'expression ** UniDic ** en plus d'IPAdic. UniDic est un système organisé par le "Dictionnaire d'analyse automatique des unités courtes de Kokugoken".

Par exemple, pour Sudachi pour l'analyse morphologique, le dictionnaire par défaut est UniDic.

UniDic et IPAdic ont des systèmes de partie de la parole différents. Par exemple, dans UniDic, il n'y a pas de verbe adjectif, c'est ** form verb ** (UniDic part system % BB% F1% CE% C1 / UniDic% A4% CE% C9% CA% BB% EC% C2% CE% B7% CF)).

Cela fait trois ans que j'ai rejoint un nouveau diplômé et commencé à apprendre l'informatique, et deux ans et demi depuis que j'ai commencé à apprendre le machine learning et le deep learning.

M. F, un senior qui est mon mentor depuis que je suis un nouvel employé, vient d'Indonésie, mais il est meilleur en japonais que moi.

M. F, un mentor indonésien, m'a dit que la valeur par défaut de sudachi n'était pas un adjectif mais une forme, et il a dit: «Une telle grammaire, les Japonais n'apprennent pas à l'école, je l'ai entendue pour la première fois. J'ai été surpris.

Préparation 2: Vérification du fonctionnement de MeCab

Maintenant, divisons le texte (analyse morphologique) et vérifions le fonctionnement de MeCab.

Le texte est "J'aime l'apprentissage automatique." Allons.

Le premier est lorsque le nouveau dictionnaire de mots NEologd n'est pas utilisé.

import MeCab

m=MeCab.Tagger("-Ochasen")

text = "J'aime l'apprentissage automatique."

text_segmented = m.parse(text)
print(text_segmented)

(production)

Je suis ma nomenclature-Synonyme-Général
Ha ha est un assistant-Assistance
Machine Kikai Machine Noun-Général
Apprentissage de la nomenclature d'apprentissage de Gakushu-Changer de connexion
Gaga est un assistant-Assistant de cas-Général
Nomenclature préférée préférée-Racine du verbe adjectif
C'est la mort. Verbe auxiliaire spécial / forme de base de la mort
.. .. .. symbole-Phrase
EOS

** - Ochasen ** dans MeCab.Tagger ("-Ochasen") est une option de sortie. cette, Si ** - Owakati ** est défini, seule la division sera sortie. Si ** - Oyomi ** est défini, seule la lecture sera sortie.

m=MeCab.Tagger("-Owakati")
text_segmented = m.parse(text)
print(text_segmented)

La sortie est «J'aime l'apprentissage automatique. '' est.

m=MeCab.Tagger("-Oyomi")
text_segmented = m.parse(text)
print(text_segmented)

Si, la sortie est `Watashihakikaigakushugaskides. '' est.

Vient ensuite le cas de l'utilisation du nouveau dictionnaire de mots NEologd.

m=MeCab.Tagger("-Ochasen -d "+str(path_neologd))  #Ajout du chemin vers NEologd

text = "J'aime l'apprentissage automatique."

text_segmented = m.parse(text)
print(text_segmented)

(production)

Je suis ma nomenclature-Synonyme-Général
Ha ha est un assistant-Assistance
Apprentissage automatique Kikaigakushu Nomenclature d'apprentissage automatique-Nomenclature propriétaire-Général
Gaga est un assistant-Assistant de cas-Général
Nomenclature préférée préférée-Racine du verbe adjectif
C'est la mort. Verbe auxiliaire spécial / forme de base de la mort
.. .. .. symbole-Phrase
EOS

Afin d'utiliser NEologd, j'ai ajouté une option à MeCab.Tagger avec -d et spécifié le chemin vers NEologd.

Lorsque je n'utilisais pas le nouveau dictionnaire de mots, le mot «apprentissage automatique» était séparé en «machine» et «apprentissage». Si vous utilisez le nouveau dictionnaire de mots, il devient "machine learning" (nomenclature propriétaire) et un mot.

En effet, le terme technique «apprentissage automatique» est enregistré dans le nouveau dictionnaire de mots.

Même dans la nouvelle version du dictionnaire de mots, si vous définissez ** - Owakati **, seule la division sera affichée.

m=MeCab.Tagger("-Owakati -d "+str(path_neologd))  #Ajout du chemin vers NEologd
text_segmented = m.parse(text)
print(text_segmented)

La sortie est «J'aime l'apprentissage automatique. '' Ce sera.

Préparation 3: Préparer le modèle formé et l'analyse morphologique de la version japonaise de BERT

Maintenant, préparez le modèle formé et l'analyse morphologique de la version japonaise de BERT.

Le modèle BERT de mon livre, "Apprenez tout en faisant! L'apprentissage en profondeur par PyTorch"](https://www.amazon.co.jp/dp/4839970254/) peut également être utilisé, mais il a récemment été utilisé comme standard ici. J'utiliserai le modèle de Hugging Face.

Étreindre signifie étreindre (embrasser) en japonais.

Le modèle BERT utilise HuggingFace, des paramètres appris en japonais, et Analyse morphologique (Tokenizer) au moment de l'apprentissage Publié par Masatoshi Suzuki de l'Université Tohoku (Professeur Inui, Laboratoire Suzuki) J'utiliserai.

Ce modèle formé à la version japonaise de l'Université Tohoku a été incorporé dans les transformateurs OSS ** de HuggingFace, de sorte qu'il peut être utilisé directement à partir des transformateurs.

Tout d'abord, installez les transformateurs version 2.9 avec pip.

!pip install transformers==2.9.0

Mise en garde Les transformateurs ont été mis à niveau de 2,8 à 2,9 le 8 mai 2020. S'il s'agit de la version 2.8, le chemin du fichier vers les données japonaises sera une erreur, alors faites attention à installer 2.9.

Maintenant, importez PyTorch, le modèle BERT et le tokenizer (classe à écrire) pour BERT en japonais.

import torch
from transformers.modeling_bert import BertModel
from transformers.tokenization_bert_japanese import BertJapaneseTokenizer

Préparez un tokenizer pour le japonais. Spécifiez'bert-base-japanese-whole-word-masking 'comme argument.

#C'est un tokenizer qui écrit sous la forme
tokenizer = BertJapaneseTokenizer.from_pretrained('bert-base-japanese-whole-word-masking')

Préparez un modèle formé en japonais.

#Modèle de paramètre appris japonais de BERT
model = BertModel.from_pretrained('bert-base-japanese-whole-word-masking')
print(model)

Voici une brève vérification des résultats du modèle de sortie.

BertModel(
  (embeddings): BertEmbeddings(
    (word_embeddings): Embedding(32000, 768, padding_idx=0)
    (position_embeddings): Embedding(512, 768)
    (token_type_embeddings): Embedding(2, 768)
    (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)
    (dropout): Dropout(p=0.1, inplace=False)
  )
  (encoder): BertEncoder(

・ ・ ・

Ici, vérifiez les paramètres (config) du modèle de la version japonaise.

from transformers import BertConfig

#Université Tohoku_Vérifiez les paramètres de la version japonaise
config_japanese = BertConfig.from_pretrained('bert-base-japanese-whole-word-masking')
print(config_japanese)

La sortie est ci-dessous.

BertConfig {
  "architectures": [
    "BertForMaskedLM"
  ],
  "attention_probs_dropout_prob": 0.1,
  "hidden_act": "gelu",
  "hidden_dropout_prob": 0.1,
  "hidden_size": 768,
  "initializer_range": 0.02,
  "intermediate_size": 3072,
  "layer_norm_eps": 1e-12,
  "max_position_embeddings": 512,
  "model_type": "bert",
  "num_attention_heads": 12,
  "num_hidden_layers": 12,
  "pad_token_id": 0,
  "type_vocab_size": 2,
  "vocab_size": 32000
}

En regardant les paramètres, vous pouvez voir que le vecteur de mots a 768 dimensions, le nombre maximum de mots (sous-mots) est de 512, le nombre de couches BERT est de 12 et la taille du vocabulaire est de 32 000.

Avec ce qui précède, nous avons préparé un modèle pour lequel le japonais a été appris et un tokenizer pour le japonais à utiliser avant de le mettre dans le modèle.

Gérer les phrases avec la version japonaise BERT

Enfin, traitons les phrases avec la version japonaise de BERT.

"Je me suis débarrassé de l'entreprise." "J'ai mal au cou juste à cause du télétravail." "L'entreprise a été licenciée."

Préparez trois phrases.

Ensuite, comparez les vecteurs de trois mots de ** "Kubi" **, ** "Kubi" ** et ** "Dismissal" ** dans chaque phrase.

BERT est caractérisé par le fait que le mot vecteur change en fonction du contexte, donc dans les première et deuxième phrases Le même mot ** "Kubi" ** a une représentation vectorielle différente de 768 dimensions.

** Et je suis heureux si le "Kubi" dans la première phrase est plus proche du "Dismissal" dans la troisième phrase que le "Kubi" dans la deuxième phrase. ** **

Mesurons la similitude des vecteurs de mots par similitude cosinus.

Mettons-le en œuvre. Préparez d'abord une phrase.

text1 = "Je me suis débarrassé de l'entreprise."
text2 = "J'ai mal au cou juste à cause du télétravail."
text3 = "L'entreprise a été licenciée."

Traitez text1 avec la version japonaise du tokenizer distinct de BERT.

#Séparer et convertir en identifiant
input_ids1 = tokenizer.encode(text1, return_tensors='pt')  #pt signifie PyTorch

print(tokenizer.convert_ids_to_tokens(input_ids1[0].tolist()))  #Phrase
print(input_ids1)  # id

La sortie est

['[CLS]', 'Compagnie', 'À', 'cou', 'À', 'Devenu', 'Ta', '。', '[SEP]']
tensor([[    2,   811,    11, 13700,     7,    58,    10,     8,     3]])

Ce sera.

Le mot "Kubi" était le troisième et j'ai trouvé que l'identifiant était 13700.

Traitez les deuxième et troisième phrases de la même manière. La sortie de chacun est la suivante.

['[CLS]', 'Télé', '##travail', 'Juste', 'alors', 'cou', 'Mais', 'Douleur', '##je', '。', '[SEP]']
tensor([[    2,  5521,  3118,  4027,    12, 13700,    14,  4897, 28457,     8,
             3]])

['[CLS]', 'Compagnie', 'À', 'Congédiement', 'Sa', 'Ré', 'Ta', '。', '[SEP]']
tensor([[   2,  811,   11, 7279,   26,   20,   10,    8,    3]])

J'ai trouvé que la deuxième phrase "Kubi" était la cinquième et la troisième phrase "Dismissal" était la troisième.

Maintenant, saisissez ce contenu identifié dans le modèle japonais BERT et calculez le vecteur de sortie.

#Entrée dans le modèle japonais BERT
result1 = model(input_ids1)

print(result1[0].shape)
print(result1[1].shape)

#le résultat est une séquence_output, pooled_output, (hidden_states), (attentions)est.
#Cependant, caché_les états et les attentions sont facultatifs et ne sont pas affichés par défaut.

La sortie est torch.Size([1, 9, 768]) torch.Size([1, 768]) Ce sera.

9 représente le nombre de mots (nombre de sous-mots) dans la première phrase. 768 est la dimension intégrée du mot. Par conséquent, puisque le "Kubi" dans la première phrase était dans la troisième, le mot vecteur est result1[0][0][3][:] Ce sera.

De plus, ce qui ressort du calcul du modèle BERT outputs # sequence_output, pooled_output, (hidden_states), (attentions) (Cependant, hidden_states et attentions sont facultatifs et ne sont pas affichés par défaut).

Référence Explication du modèle BerT avant

De même, trouvez les vecteurs de mot pour "Kubi" (cinquième) dans la deuxième phrase et "Rejeter" (troisième) dans la troisième phrase.

#Entrée dans le modèle japonais BERT
result2 = model(input_ids2)
result3 = model(input_ids3)

word_vec1 = result1[0][0][3][:]  #"Kubi" dans la première phrase (troisième)
word_vec2 = result2[0][0][5][:]  #"Kubi" dans la deuxième phrase (cinquième)
word_vec3 = result3[0][0][3][:]  #"Licenciement" dans la troisième phrase (troisième)

Enfin, trouvons la similitude.

#Trouver une similitude cosinus
cos = torch.nn.CosineSimilarity(dim=0)
cos_sim_12 = cos(word_vec1, word_vec2)
cos_sim_13 = cos(word_vec1, word_vec3)

print(cos_sim_12)
print(cos_sim_13)

La sortie est tensor(0.6647, grad_fn=<DivBackward0>) tensor(0.7841, grad_fn=<DivBackward0>)

est devenu.

Par conséquent, l'expression de mot traitée par BERT est La similitude entre "Kubi" dans la première phrase et "Kubi" dans la deuxième phrase est de 0,66. La similitude entre "Kubi" dans la première phrase et "Dismissal" dans la troisième phrase est de 0,78.

Et, vous pouvez voir que le "Kubi" dans la première phrase est proche du "licenciement" dans la troisième phrase (degré élevé de similitude).

En utilisant BERT, nous avons pu confirmer que le même mot «Kubi» est devenu un vecteur de mot qui a changé de sens en fonction du contexte.

Comme mentionné ci-dessus, [Explication de la mise en œuvre] Comment utiliser la version japonaise de BERT dans Google Colaboratory (PyTorch).


[Remarques] L'équipe de développement du département des technologies de l'IA, que je dirige, recherche des membres. Cliquez ici si vous êtes intéressé

[Clause de non-responsabilité] Le contenu de cet article lui-même est l'opinion / la transmission de l'auteur, et non l'opinion officielle de la société à laquelle l'auteur appartient.


Les références ● Utiliser mecab ipadic-NEologd avec Google Colaboratory

Recommended Posts

[Explication de la mise en œuvre] Comment utiliser la version japonaise de BERT dans Google Colaboratory (PyTorch)
Comment utiliser le modèle japonais Spacy avec Google Colaboratory
Comment utiliser Google Colaboratory
Comment utiliser Google Colaboratory et exemple d'utilisation (PyTorch × DCGAN)
Comment vérifier la version de Django
Comment utiliser Google Test en langage C
Bases de PyTorch (1) -Comment utiliser Tensor-
Comment utiliser la bibliothèque C en Python
Résumé de l'utilisation de MNIST avec Python
Obtenez le résultat du GeoCoding inversé en japonais à l'aide du SDK Java de GoogleMapsAPI.
[PyTorch] Comment utiliser BERT - Réglage fin des modèles pré-entraînés japonais pour résoudre les problèmes de classification
[Explication de la mise en œuvre] Classer les actualités de livingoor par BERT japonais x apprentissage non supervisé (clustering de maximisation de la quantité d'informations): Google Colaboratory (PyTorch)
Comment charger des fichiers dans Google Drive avec Google Colaboratory
Comment utiliser la clause exist dans l'ensemble de requêtes Django
Comment utiliser le modèle appris dans Lobe en Python
Je ne peux pas utiliser la commande darknet dans Google Colaboratory!
Comment utiliser le générateur
Comment utiliser le décorateur
Comment trouver le nombre optimal de clusters pour les k-moyennes
Comment utiliser la méthode __call__ dans la classe Python
Comparaison de l'utilisation des fonctions d'ordre supérieur dans Python 2 et 3
Remarques sur l'utilisation de la guimauve dans la bibliothèque de schémas
[Super facile! ] Comment afficher le contenu des dictionnaires et des listes incluant le japonais en Python
Comment dessiner facilement la structure d'un réseau de neurones sur Google Colaboratory à l'aide de "convnet-tiroir"
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python (version non bloquante)
Comment utiliser la fonction zip
Comment déterminer l'existence d'un élément sélénium en Python
Comment utiliser le module optparse
Comment connaître la structure interne d'un objet en Python
Résumé de l'utilisation de pandas.DataFrame.loc
Comment utiliser les classes dans Theano
Comment changer la couleur du seul bouton pressé avec Tkinter
Comment afficher des formules en latex lors de l'utilisation de Sympy (> = 1.4) dans Google Colaboratory
Comment utiliser SQLite en Python
Comment vérifier la taille de la mémoire d'une variable en Python
Résumé de l'utilisation de pyenv-virtualenv
Comment obtenir la version Python
Utilisez PyCaret pour prédire le prix des appartements d'occasion à Tokyo!
Comment utiliser l'astérisque (*) en Python. C'est peut-être tout? ..
[Introduction à Python] Comment utiliser l'opérateur in dans l'instruction for?
Comment vérifier la taille de la mémoire d'un dictionnaire en Python
Comment utiliser Mysql avec python
Comment obtenir les coordonnées de sommet d'une entité dans ArcPy
Explique comment utiliser TensorFlow 2.X avec l'implémentation de VGG16 / ResNet50
Comment utiliser ChemSpider en Python
Comment utiliser Jupyter sur le frontal de Spacon ITO
La première intelligence artificielle. Comment vérifier la version de Tensorflow installée.
Comment utiliser l'apprentissage automatique pour le travail? 01_ Comprendre l'objectif de l'apprentissage automatique
Comment utiliser PubChem avec Python
Comment mettre à jour la version Python de Cloud Shell dans GCP
Résumé de l'utilisation de csvkit
Comment utiliser le module ConfigParser
Comment configurer l'environnement de développement d'ev3dev [version Windows]
Comment gérer le japonais avec Python
Comment utiliser la fonction de rendu définie dans .mako (.html) directement dans mako
Supplément à l'explication de vscode
Comment appeler PyTorch dans Julia
Comment exécuter le code pratique du livre "Making Profitable AI with Python" sur Google Colaboratory
Comment vérifier automatiquement si le code que vous avez écrit dans Google Colaboratory correspond à la norme de codage python "pep8"
Comment copier et coller le contenu d'une feuille au format JSON avec une feuille de calcul Google (en utilisant Google Colab)