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)
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.
** 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.
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.
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.
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).
[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