Dieser Artikel beschreibt die Verwendung der japanischen Version von BERT mit Google Colaboratory.
Über BERT selbst, ein Buch, das ich letztes Jahr geschrieben habe
"Lernen während des Machens! Entwicklung tiefes Lernen durch PyTorch"
Es wird ausführlich in erklärt.
Wenn Sie wissen möchten, wie BERT funktioniert, lesen Sie bitte das obige Buch.
Da sich das Buch nur mit der englischen Version befasst, wird in diesem Beitrag erklärt, wie BERT in der japanischen Version verwendet wird. (Ich möchte nach diesem Artikel ungefähr zwei schreiben.)
Der Implementierungscode für diesen Beitrag befindet sich im GitHub-Repository unten.
GitHub: Verwendung der japanischen Version von BERT in Google Colaboratory: Implementierungscode Es ist 1_Japanese_BERT_on_Google_Colaboratory.ipynb.
** Serienliste ** [1] * Dieser Artikel [Erklärung zur Implementierung] Verwendung der japanischen Version von BERT in Google Colaboratory (PyTorch) [2] [Implementierung] Livedoor-Nachrichtenklassifizierung in der japanischen Version BERT: Google Colaboratory (PyTorch) [3] [Erklärung zur Implementierung] Gehirnforschung und unbeaufsichtigtes Lernen. Klassifizieren Sie MNIST nach Clustering zur Maximierung der Informationsmenge [4] [Erklärung zur Implementierung] Klassifizieren Sie lebende Nachrichten nach japanischem BERT x unbeaufsichtigtem Lernen (Clustering zur Maximierung der Informationsmenge)
Installieren Sie MeCab, ein Tool zum Teilen (morphologische Analyse). Es kann nicht mit pip installiert werden, also installieren Sie es mit apt.
!apt install aptitude swig
!aptitude install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file -y
Installieren Sie mecab-python3 mit pip, damit Sie MeCab von Python aus verwenden können.
!pip install mecab-python3
Installieren Sie NEologd, ein Wörterbuch, damit MeCab neue Wörter (aktuelle neue Wörter) verwenden kann. (Es wird jedoch nicht in geschultem BERT verwendet.)
!git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
!echo yes | mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n -a
Holen Sie sich den Pfad zum neuen Wortwörterbuch 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')
Damit ist die Vorbereitung auf die MeCab-Spezifikationen abgeschlossen.
** ipadic ** bedeutet im neuen Wortwörterbuch mecab-ipadic-neologd "IPA-Wörterbuch". Das IPA-Wörterbuch ist nach "IPA Part Lyrics System" organisiert.
Möglicherweise haben Sie zusätzlich zu IPAdic den Ausdruck ** UniDic ** gesehen. UniDic ist ein System, das vom "Kokugoken Short Unit Automatic Analysis Dictionary" organisiert wird.
Für Sudachi für die morphologische Analyse lautet das Standardwörterbuch beispielsweise UniDic.
UniDic und IPAdic haben unterschiedliche Teil-der-Sprache-Systeme. In UniDic gibt es beispielsweise kein Adjektivverb, sondern ein ** Formverb ** (UniDic-Teilesystem. % BB% F1% CE% C1 / UniDic% A4% CE% C9% CA% BB% EC% C2% CE% B7% CF)).
Es ist drei Jahre her, seit ich zu einem neuen Absolventen kam und anfing, IT zu lernen, und zweieinhalb Jahre, seit ich anfing, maschinelles Lernen und tiefes Lernen zu lernen.
Herr F., ein Senior, der seit meiner neuen Anstellung mein Mentor ist, stammt aus Indonesien, kann aber besser Japanisch als ich.
Herr F., ein indonesischer Mentor, sagte mir, dass Sudachis Standard kein Adjektiv, sondern ein Bild ist, und er sagte: "Eine solche Grammatik lernen Japaner in der Schule nicht. Ich war überrascht.
Lassen Sie uns nun den Text teilen (morphologische Analyse) und die Funktionsweise von MeCab überprüfen.
Der Text ist "Ich mag maschinelles Lernen." Lasst uns.
Das erste ist, wenn das neue Wortwörterbuch NEologd nicht verwendet wird.
import MeCab
m=MeCab.Tagger("-Ochasen")
text = "Ich mag maschinelles Lernen."
text_segmented = m.parse(text)
print(text_segmented)
(Ausgabe)
Ich bin meine Nomenklatur-Gleichbedeutend-Allgemeines
Ha ha ist ein Assistent-Hilfe
Maschine Kikai Maschine Nomen-Allgemeines
Gakushu lernen Nomenklatur lernen-Verbindung ändern
Gaga ist Assistentin-Fallassistent-Allgemeines
Lieblingsnomenklatur-Adjektiv Verbstamm
Es ist der Tod. Hilfsverb Spezial / Tod Grundform
.. .. .. Symbol-Phrase
EOS
** - Ochasen ** in MeCab.Tagger ("-Ochasen") ist eine Ausgabeoption. Dies, Wenn ** - Owakati ** gesetzt ist, wird nur die Division ausgegeben. Wenn ** - Oyomi ** eingestellt ist, wird nur der Messwert ausgegeben.
m=MeCab.Tagger("-Owakati")
text_segmented = m.parse(text)
print(text_segmented)
Die Ausgabe ist `Ich mag maschinelles Lernen. `` ist.
m=MeCab.Tagger("-Oyomi")
text_segmented = m.parse(text)
print(text_segmented)
Wenn, ist die Ausgabe `Watashihakikaigakushugaskides. `` ist.
Als nächstes wird das neue Wortwörterbuch NEologd verwendet.
m=MeCab.Tagger("-Ochasen -d "+str(path_neologd)) #Pfad zu NEologd hinzugefügt
text = "Ich mag maschinelles Lernen."
text_segmented = m.parse(text)
print(text_segmented)
(Ausgabe)
Ich bin meine Nomenklatur-Gleichbedeutend-Allgemeines
Ha ha ist ein Assistent-Hilfe
Maschinelles Lernen Kikaigakushu Nomenklatur für maschinelles Lernen-Proprietäre Nomenklatur-Allgemeines
Gaga ist Assistentin-Fallassistent-Allgemeines
Lieblingsnomenklatur-Adjektiv Verbstamm
Es ist der Tod. Hilfsverb Spezial / Tod Grundform
.. .. .. Symbol-Phrase
EOS
Um NEologd verwenden zu können, habe ich MeCab.Tagger eine Option mit -d hinzugefügt und den Pfad zu NEologd angegeben.
Wenn ich das neue Wortwörterbuch nicht verwendete, wurde das Wort "maschinelles Lernen" in "maschinelles" und "Lernen" getrennt. Mit dem neuen Wortwörterbuch wird es zu "maschinellem Lernen" (proprietäre Nomenklatur) und einem Wort.
Dies liegt daran, dass der Fachbegriff "maschinelles Lernen" im neuen Wortwörterbuch registriert ist.
Selbst in der neuen Wortwörterbuchversion wird nur die Division ausgegeben, wenn Sie ** - Owakati ** festlegen.
m=MeCab.Tagger("-Owakati -d "+str(path_neologd)) #Pfad zu NEologd hinzugefügt
text_segmented = m.parse(text)
print(text_segmented)
Die Ausgabe ist `Ich mag maschinelles Lernen. `` Es wird sein.
Bereiten Sie nun das trainierte Modell und die morphologische Analyse der japanischen Version von BERT vor.
Das BERT-Modell meines Buches "Learn while make! Development Deep Learning von PyTorch"](https://www.amazon.co.jp/dp/4839970254/) kann ebenfalls verwendet werden, wurde hier jedoch kürzlich als Standard verwendet. Ich werde das Modell von Hugging Face verwenden.
Umarmen bedeutet auf Japanisch umarmen.
Das BERT-Modell verwendet HuggingFace, gelernte Parameter auf Japanisch und Morphologische Analyse (Tokenizer) zum Zeitpunkt des Lernens Was Herr Masatoshi Suzuki an der Tohoku-Universität veröffentlicht hat (Professor Inui Suzuki Laboratory) Ich werde benützen.
Diese japanische Version des trainierten Modells der Tohoku-Universität wurde in die OSS ** -Transformatoren ** von HuggingFace integriert, sodass sie direkt von Transformatoren verwendet werden kann.
Installieren Sie zuerst die Transformatoren Version 2.9 mit pip.
!pip install transformers==2.9.0
Hinweis Die Transformatoren wurden am 8. Mai 2020 von 2,8 auf 2,9 aufgerüstet. In Version 2.8 ist der Dateipfad zu japanischen Daten ein Fehler. Installieren Sie daher unbedingt 2.9.
Importieren Sie jetzt PyTorch, BERT-Modell und Tokenizer (zu schreibende Klasse) für BERT auf Japanisch.
import torch
from transformers.modeling_bert import BertModel
from transformers.tokenization_bert_japanese import BertJapaneseTokenizer
Bereiten Sie einen Tokenizer für Japanisch vor. Geben Sie als Argument'bert-base-japanese-Whole-Word-Masking' als Argument an.
#Es ist ein Tokenizer, der in das Formular schreibt
tokenizer = BertJapaneseTokenizer.from_pretrained('bert-base-japanese-whole-word-masking')
Bereiten Sie ein geschultes Modell auf Japanisch vor.
#BERTs japanisch erlerntes Parametermodell
model = BertModel.from_pretrained('bert-base-japanese-whole-word-masking')
print(model)
Das Folgende ist eine kurze Überprüfung der Ergebnisse des Ausgabemodells.
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(
・ ・ ・
Überprüfen Sie hier die Einstellungen (Konfiguration) des japanischen Versionsmodells.
from transformers import BertConfig
#Tohoku Universität_Überprüfen Sie die Einstellungen der japanischen Version
config_japanese = BertConfig.from_pretrained('bert-base-japanese-whole-word-masking')
print(config_japanese)
Die Ausgabe ist unten.
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
}
Wenn Sie sich die Einstellungen ansehen, sehen Sie, dass der Wortvektor 768 Dimensionen hat, die maximale Anzahl von Wörtern (Unterwörtern) 512 beträgt, die Anzahl von BERT-Ebenen 12 beträgt und die Vokabulargröße 32.000 beträgt.
Mit dem oben Gesagten haben wir ein Modell vorbereitet, für das Japanisch gelernt wurde, und einen Tokenizer für Japanisch, der verwendet werden soll, bevor es in das Modell eingefügt wird.
Lassen Sie uns abschließend die Sätze mit der japanischen Version von BERT behandeln.
"Ich habe die Firma losgeworden." "Ich habe Nackenschmerzen, nur wegen Telearbeit." "Die Firma wurde gefeuert."
Bereiten Sie drei Sätze vor.
Vergleichen Sie dann die Drei-Wort-Vektoren von ** "Kubi" **, ** "Kubi" ** und ** "Entlassung" ** in jedem Satz.
BERT zeichnet sich dadurch aus, dass sich der Wortvektor je nach Kontext ändert, also im ersten und zweiten Satz Das gleiche Wort ** "Kubi" ** hat eine andere 768-dimensionale Vektordarstellung.
** Und ich bin froh, wenn das "Kubi" im ersten Satz näher am "Entlassen" im dritten Satz liegt als das "Kubi" im zweiten Satz. ** **.
Messen wir die Ähnlichkeit von Wortvektoren anhand der Kosinusähnlichkeit.
Lassen Sie es uns implementieren. Bereiten Sie zuerst einen Satz vor.
text1 = "Ich habe die Firma losgeworden."
text2 = "Mein Nacken tut nur wegen Telearbeit weh."
text3 = "Die Firma wurde entlassen."
Verarbeiten Sie text1 mit der japanischen Version des separaten Tokenizers von BERT.
#Trennen und in ID konvertieren
input_ids1 = tokenizer.encode(text1, return_tensors='pt') #pt steht für PyTorch
print(tokenizer.convert_ids_to_tokens(input_ids1[0].tolist())) #Satz
print(input_ids1) # id
Die Ausgabe ist
['[CLS]', 'Unternehmen', 'Zu', 'Hals', 'Zu', 'Wurde', 'Ta', '。', '[SEP]']
tensor([[ 2, 811, 11, 13700, 7, 58, 10, 8, 3]])
Es wird sein.
Das Wort "Kubi" war das dritte und ich fand die ID 13700.
Verarbeiten Sie den zweiten und dritten Satz auf die gleiche Weise. Die Ausgabe von jedem ist wie folgt.
['[CLS]', 'Tele', '##Arbeit', 'Gerade', 'damit', 'Hals', 'Aber', 'Schmerzen', '##ich', '。', '[SEP]']
tensor([[ 2, 5521, 3118, 4027, 12, 13700, 14, 4897, 28457, 8,
3]])
['[CLS]', 'Unternehmen', 'Zu', 'Entlassung', 'Sa', 'Re', 'Ta', '。', '[SEP]']
tensor([[ 2, 811, 11, 7279, 26, 20, 10, 8, 3]])
Ich fand, dass der zweite Satz "Kubi" der fünfte und der dritte Satz "Entlassung" der dritte war.
Geben Sie nun diesen identifizierten Inhalt in das japanische BERT-Modell ein und berechnen Sie den Ausgabevektor.
#Eingabe in das japanische BERT-Modell
result1 = model(input_ids1)
print(result1[0].shape)
print(result1[1].shape)
#Ergebnis ist Sequenz_output, pooled_output, (hidden_states), (attentions)ist.
#Allerdings versteckt_Zustände und Aufmerksamkeiten sind optional und werden nicht standardmäßig ausgegeben.
Die Ausgabe ist
torch.Size([1, 9, 768]) torch.Size([1, 768])
Es wird sein.
9 steht für die Anzahl der Wörter (Anzahl der Unterwörter) im ersten Satz.
768 ist die eingebettete Dimension des Wortes.
Da also das "Kubi" im ersten Satz im dritten war, ist der Wortvektor
result1[0][0][3][:]
Es wird sein.
Darüber hinaus, was bei der Berechnung des BERT-Modells ausgegeben wird
outputs # sequence_output, pooled_output, (hidden_states), (attentions)
(Hidden_states und Attentions sind jedoch optional und werden nicht standardmäßig ausgegeben.)
Referenz Erläuterung des BerT-Modells vorwärts
Ebenso finden Sie die Wortvektoren für "Kubi" (fünfter) im zweiten Satz und "Entlassung" (dritter) im dritten Satz.
#Eingabe in das japanische BERT-Modell
result2 = model(input_ids2)
result3 = model(input_ids3)
word_vec1 = result1[0][0][3][:] #"Kubi" im ersten Satz (dritter)
word_vec2 = result2[0][0][5][:] #"Kubi" im zweiten Satz (fünfter)
word_vec3 = result3[0][0][3][:] #"Entlassung" im dritten Satz (dritter)
Lassen Sie uns zum Schluss die Ähnlichkeit finden.
#Finden Sie Kosinusähnlichkeit
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)
Die Ausgabe ist
tensor(0.6647, grad_fn=<DivBackward0>) tensor(0.7841, grad_fn=<DivBackward0>)
ist geworden.
Daher lautet der von BERT verarbeitete Wortausdruck Die Ähnlichkeit zwischen "Kubi" im ersten Satz und "Kubi" im zweiten Satz beträgt 0,66. Die Ähnlichkeit zwischen "Kubi" im ersten Satz und "Entlassung" im dritten Satz beträgt 0,78.
Und Sie können sehen, dass das "Kubi" im ersten Satz nahe an der "Entlassung" im dritten Satz liegt (hoher Grad an Ähnlichkeit).
Mit BERT konnten wir bestätigen, dass dasselbe Wort "Kubi" zu einem Wortvektor geworden ist, dessen Bedeutung sich je nach Kontext geändert hat.
Wie oben erwähnt, [Erklärung zur Implementierung] Verwendung der japanischen Version von BERT in Google Colaboratory (PyTorch).
[Haftungsausschluss] Der Inhalt dieses Artikels selbst ist die Meinung / Übermittlung des Autors, nicht die offizielle Meinung des Unternehmens, zu dem der Autor gehört.
Verweise ● Verwenden Sie mecab ipadic-NEologd mit Google Colaboratory
Recommended Posts