[PYTHON] Versuchen Sie, Ihre Tweets zu visualisieren, während Sie BERT Hands-on verstehen

Dieser Artikel ist der 13. Tagesartikel von NTT Communications Adventskalender 2019. Gestern war @ nitkys Artikel Wir beschäftigen uns mit Bedrohungsinformationen in einer Atmosphäre.

Einführung

Hallo, das ist Yuki Uchida, die zum SkyTay-Team von NTT Communications gehört. In diesem Artikel werde ich versuchen, meine Tweets mit dem Sprachmodell "BERT" zu visualisieren, das für die Verarbeitung natürlicher Sprache verwendet wird und kürzlich auf die Google-Suche angewendet wurde. Ich werde es in einem praktischen Format schreiben, damit so viele Leute wie möglich es ausprobieren können. Wenn Sie also interessiert sind, versuchen Sie es bitte.

Googles Suchmaschine "der größte Sprung in den letzten 5 Jahren"

Was ist BERT?

BERT ist ein Modell für natürliche Sprache, das 2018 von Google angekündigt wurde und bei vielen Aufgaben in natürlicher Sprache eine hohe Genauigkeit erzielt hat. Diese Genauigkeit war erstaunlich und gewann im Bereich der Verarbeitung natürlicher Sprache große Popularität. (Übrigens wurde im Bereich der Verarbeitung natürlicher Sprache 2014 ein Modell für natürliche Sprache namens Word2Vec angekündigt, und es gab viel Lärm, aber dies ist auch ein Artikel von Google.) Viele Leute haben bereits die Details dieses BERT erklärt, deshalb werde ich einige Links posten.

Verschieben Sie das allgemeine Sprachausdrucksmodell BERT auf Japanisch (PyTorch) Lassen Sie uns die interne Funktionsweise des allgemeinen Sprachausdrucksmodells BERT erläutern

Was können Sie diesmal mit diesem BERT machen? Um dies intuitiv zu verstehen, öffnen wir die folgende Site!

https://transformer.huggingface.co/

Auf dieser Seite können Sie eine Bibliothek namens "Transformers" (früher Pytorch-Pretrained-Bert) ausprobieren, die von "huggingface" online bereitgestellt wird. Wählen wir dieses Mal gpt aus, das das gleiche Sprachmodell wie BERT ist, und demonstrieren es. Write_With_Transformer.png

Wenn diese Option ausgewählt ist, wechselt der Bildschirm zu einem wortähnlichen Bildschirm, in den Sie wie unten gezeigt Text eingeben können.

Geben Sie in diesem Zustand Text ein und drücken Sie die Tabulatortaste. Dann können Sie sehen, dass die Sätze als drei Kandidaten angezeigt werden. Wenn Sie diesen Satz auswählen, wird er dem Satz hinzugefügt. 68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3132343631312f33346433643539312d323735372d323363312d613638612d6362303766333964303031372e706e67.png

Diese Demo ist ein Test der ** Satzgenerierung **.

** Satzgenerierung ** ist eine Technologie, die seit langem im Bereich der Verarbeitung natürlicher Sprache untersucht wird. Durch die Verwendung des ** natürlichen Sprachmodells **, um den Computer ** Textinformationen ** gut verstehen zu lassen, ist es möglich geworden, ** Sätze ** auf natürliche Weise auf diese Weise zu generieren.

Wenn Sie mehrmals versuchen, Sätze zu generieren, erhalten Sie interessante Ergebnisse. I have never met anyone who did not find it useful or useful for others . It was originally released as an open source project

Screenshot 2019-12-12 21.05.18.png

Dieses Mal habe ich das Modell "GPT" auf dieser Demo-Site ausgewählt, aber das Nachfolgemodell "GPT2" wurde für eine Weile privat gehalten, da der Befürworter OpenAI über seinen Missbrauch besorgt war. (Derzeit veröffentlicht und kann auf der Demo-Site ausprobiert werden)

[Techcrunch: OpenAI hat einen sehr guten Textgenerator entwickelt, aber ich denke, es ist zu gefährlich, ihn so zu veröffentlichen, wie er ist](https://jp.techcrunch.com/2019/02/18/2019-02-17 -openai-text-generator-gefährlich /)

Somit verbessert ** ein besseres Modell in natürlicher Sprache die Genauigkeit vieler Verarbeitungsaufgaben in natürlicher Sprache. ** ** **

Installation von Transformatoren

Verwenden Sie die Bibliothek "huggingface", die von "pytorch-pretrained-bert" in "transformers" umbenannt wurde. Die Demo-Site, die ich zuvor verwendet habe, wird die Online-Demo dieser "Transformatoren" sein. Mit dieser Bibliothek können Sie BERT ganz einfach in Kombination mit "pytorch (oder tensorflow)" aufrufen.

https://github.com/huggingface/transformers

Für diese praktische Übung rufen wir "BERT" mit "pytorch" anstelle von "transformers" auf. Wenn Sie pytorch und transformers noch nicht installiert haben, installieren Sie sie mit dem folgenden Befehl.

pip install torch torchvision pip install transformers

Verwenden Sie das englischsprachige Modell von BERT, um versteckte Wörter zu erraten

Dieses Mal werde ich das BERT-Modell ziehen, das Japanisch unterstützt. Wenn Sie Englisch sprechen können, müssen Sie nichts vorbereiten und können es mit dem folgenden Code lesen. model = BertForMasked.from_pretrained('bert-base-uncased')

** Die Verwendung des japanisch trainierten Modells dauert etwas. Bevor Sie das japanisch trainierte Modell verwenden, verwenden Sie das englisch trainierte Modell von BERT, das leicht aufgerufen werden kann. ** ** **

Importieren Sie zunächst die erforderlichen Bibliotheken. Erstellen Sie test.py und schreiben Sie wie folgt.

import torch
from transformers import BertTokenizer, BertForMaskedLM
import numpy as np

Als nächstes setzen wir einen einfachen englischen Satz.


text = "How many lakes are there in Japan."

Lassen Sie uns nun die Wörter mit dem BERT-spezifischen Teilungsschreibwerkzeug "BertTokenizer" teilen. Fügen Sie den folgenden Code ein. Wort-für-Wort-Aufteilung ist das, was der Computer tun muss, um zu bestimmen, wo Wort-für-Wort-Unterbrechungen vorgenommen werden. (Auf Englisch können Sie jedes Wort grundsätzlich teilen, indem Sie es durch ein Leerzeichen trennen.)

** (Hinweis: Fügen Sie Anfang und Ende mit [CLS] [SEP] ein.) **

test.py


##Beim Importieren der Bibliothek wird auch BertTokenizer geladen
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
tokenized_text = tokenizer.tokenize(text)
tokenized_text.insert(0, "[CLS]")
tokenized_text.append("[SEP]")
# ['[CLS]', 'how', 'many', 'lakes', 'are', 'there', 'in', 'japan', '.', '[SEP]']

Dadurch konnten wir jedes Wort teilen.

** Wählen Sie als Nächstes das Wort aus, das Sie ausblenden möchten. BERT wird versuchen, das Wort zu erraten. ** ** ** Diesmal möchte ich mich verstecken ** sind **. Beschreiben wir den Vorgang des Ersetzens dieses Wortes durch "[MASKE]".

test.py


masked_index = 4
tokenized_text[masked_index] = '[MASK]'
# ['[CLS]', 'how', 'many', 'lakes', '[MASK]', 'there', 'in', 'japan', '.', '[SEP]']

Dies hat ** are ** durch ** [MASK] ** ersetzt. Jetzt weiß ich nicht, was das Wort hier ist.

Geben Sie BERT nun diesen Text und bitten Sie sie, das Wort ** [MASKE] ** vorherzusagen! !! !!

test.py


##Anstatt es so wie es ist an BERT zu übergeben, konvertieren Sie es mit einem Wörterbuch und machen Sie es zu einer ID.
tokens = tokenizer.convert_tokens_to_ids(tokenized_text)
tokens_tensor = torch.tensor([tokens])
##Lesen Sie BERT. Hier kann es einige Zeit dauern
model = BertForMaskedLM.from_pretrained('bert-base-uncased')
model.eval()

with torch.no_grad():
    outputs = model(tokens_tensor)
    predictions = outputs[0]
## masked_Extrahieren Sie das Vorhersageergebnis des Wortes im Indexteil und geben Sie das Vorhersageergebnis top5 aus
_, predict_indexes = torch.topk(predictions[0, masked_index], k=5)
predict_tokens = tokenizer.convert_ids_to_tokens(predict_indexes.tolist())
print(predict_tokens)
# ['are', 'were', 'lie', 'out', 'is']

Als Ergebnis der Vorhersage versteckter Wörter wurde TOP5 zu "[" sind "," waren "," liegen "," raus "," ist "]". Wie Sie diesem Ergebnis entnehmen können, konnte ** BERT die versteckten Wörter erraten. ** Es ist unglaublich!

Dieses Mal habe ich ** BertForMaskedLM ** verwendet, um versteckte Wörter vorherzusagen. Andere Dinge, die Sie leicht ausprobieren können, sind wie folgt. Versuch es bitte.

  1. BertForNextSentencePrediction
  2. BertForSequenceClassification
  3. BertForTokenClassification
  4. BertForQuestionAnswering

Das japanisch erlernte Modell von BERT ziehen

Dann ist von hier aus die Produktion. ** Verwenden Sie BERT, um zu visualisieren, welche Art von Tweet Sie machen ** Bereiten Sie zunächst BERT vor, das Japanisch unterstützt. Ursprünglich würde ich das Vorlernen von BERT gerne selbst durchführen, aber das Lernen von BERT nimmt viel Zeit in Anspruch. Daher verteilt HP der Kyoto University Kurohashi / Kawahara Laboratory die trainierten Modelle. Besuchen Sie% E6% 97% A5% E6% 9C% AC% E8% AA% 9EPretrained% E3% 83% A2% E3% 83% 87% E3% 83% AB), um das Modell herunterzuladen.

Es scheint, dass es ungefähr 30 Tage dauert, um BERT zu lernen, also bin ich wirklich dankbar, dass Sie es gerne ausprobieren können, wenn Sie es so veröffentlichen ...

30 Epochen (1 GPU (mit GeForce GTX 1080 Ti) dauert ungefähr 1 Tag für 1 Epoche, also dauert das Pretraining ungefähr 30 Tage)

Entpacken Sie die heruntergeladene Datei und platzieren Sie sie am selben Speicherort wie die Python-Datei. (Erstellen Sie einen Bert-Ordner wie unten gezeigt und speichern Sie ihn dort.)

test.py


import torch
from transformers import BertTokenizer, BertModel, BertForMaskedLM
import numpy as np
model = BertModel.from_pretrained('bert/Japanese_L-12_H-768_A-12_E-30_BPE_transformers')
bert_tokenizer = BertTokenizer("bert/Japanese_L-12_H-768_A-12_E-30_BPE_transformers/vocab.txt",
                               do_lower_case=False, do_basic_tokenize=False)

Versuchen wir nun einmal, festzustellen, ob das BERT-Modell verwendet werden kann.

Versuchen Sie, die versteckten Wörter in Japanisch-kompatiblem BERT zu erraten

Ich möchte den Code verwenden, den ich gerade erstellt habe, aber dieses Mal habe ich es mit Japanisch statt mit Englisch zu tun, daher kann ich ihn nicht mit "BertTokenizer" trennen. (Da die Wörterbuchfunktion verwendet wird, die Wörter durch id ersetzt, lesen Sie sie wie oben beschrieben.) Verwenden wir dieses Mal "Juman", um die Wörter zu teilen und die Wörter zu teilen. Da für juman eine Pip-Installation erforderlich ist, geben Sie den folgenden Befehl ein, um es zu installieren. pip install pyknp

Nachdem Sie es installiert haben, verwenden wir diesen "Juman", um ein Wort zu schreiben und Wörter zu teilen. Der Zielsatz lautet "Ich spiele gerne Fußball mit meinen Freunden", genau wie ich es auf Englisch getan habe.

test.py


from pyknp import Juman
jumanpp = Juman()
text = "Ich spiele gerne Fußball mit meinen Freunden"
result = jumanpp.analysis(text)
tokenized_text = [mrph.midasi for mrph in result.mrph_list()]
# ['ich', 'Ist', 'Freund', 'Wann', 'Fußball', 'Zu', 'Machen', 'こWann', 'Aber', 'ich liebe']

Von hier aus erfolgt die Vorhersage auf die gleiche Weise wie in der englischen Version.

test.py



tokenized_text.insert(0, '[CLS]')
tokenized_text.append('[SEP]')
masked_index = 5
tokenized_text[masked_index] = '[MASK]'
print(tokenized_text)
# ['[CLS]', 'ich', 'Ist', 'Freund', 'Wann', '[MASK]', 'Zu', 'Machen', 'こWann', 'Aber', 'ich liebe', '[SEP]']
tokens = bert_tokenizer.convert_tokens_to_ids(tokenized_text)
tokens_tensor = torch.tensor([tokens])
model.eval()


with torch.no_grad():
    outputs = model(tokens_tensor)
    predictions = outputs[0]

_, predict_indexes = torch.topk(predictions[0, masked_index], k=5)
predict_tokens = bert_tokenizer.convert_ids_to_tokens(predict_indexes.tolist())
print(predict_tokens)
# ['Geschichte', 'Arbeitsplätze', 'Kuss', 'Spiel', 'Fußball']

In der japanischen Version von BERT habe ich versucht, das "Ich spiele gerne Fußball mit meinen Freunden" zu verbergen und vorherzusagen. Es wurde "[" Geschichte "," Arbeit "," Kuss "," Spiel "," Fußball "]". ** Fußball war nicht die Nummer eins, aber Sie können fühlen, dass die anderen Antworten richtig sind. ** ** **

Ich konnte bestätigen, dass die japanische Version von BERT hier funktioniert.

Bereiten Sie Ihren eigenen Tweet vor

Bereiten wir nun einen Tweet für die Visualisierung vor. Bitte besuchen Sie die folgende Seite und klicken Sie auf "Twitter-Daten". https://twitter.com/settings/account

Wenn der folgende Bildschirm angezeigt wird, geben Sie das Passwort ein und drücken Sie dann "Archiv anfordern". Wenn Sie bereit sind und eine E-Mail erhalten, ändert sich diese in "Archiv herunterladen" und Sie können sie herunterladen. Twitterデータ___Twitter.png Twitterデータ___Twitter.png

Nachdem der Download abgeschlossen ist, entpacken Sie ihn und überprüfen Sie den Inhalt. Wie nachstehend. Es ist in Ordnung, wenn Sie viele Javascript-Dateien und tweet.js haben.

yuki-u_と_「BERTを理解しながら自分のツイートを可視化してみるハンズオン」を編集_-_Qiita.png

Konvertieren Sie Ihre Tweets in CSV

Der gesamte aktuelle Tweet-Verlauf wird in tweet.js gespeichert und ist etwas schwierig zu handhaben. Konvertieren Sie ihn daher in csv. Sie können tweet.js auf der folgenden Site in csv konvertieren.

** Wenn Sie sich jedoch Sorgen über die Verwendung dieses Tools machen, konvertieren Sie es, wie auf dieser Website beschrieben, auf andere Weise in CSV. ** ** ** Ich habe ein Tool "tweet.js loader" erstellt, das tweet.js von Twitter-Daten liest und den gesamten Tweet-Verlauf anzeigt

tweet_js_loader_-_全ツイート履歴_表示er.png tweet_js_loader_-_全ツイート履歴_表示er.png

Klicken Sie auf die Schaltfläche "CSV-Ausgabe", um die CSV herunterzuladen.

Sobald die Konvertierung in CSV abgeschlossen ist und Sie sie herunterladen können, ist es in Ordnung. (Nennen wir es tweets.csv)

Konvertieren Sie Tweets in Satzvektoren

Lassen Sie uns nun diesen tweet.csv-Tweet mit BERT in einen Satzvektor konvertieren. ** Ein Satzvektor ist eine vektorisierte Version dieses Satzes **. Lassen Sie uns überprüfen, welche Art von Tweet gesagt wird, indem Sie den von BERT konvertierten Satzvektor in das Visualisierungstool einfügen.

test.py


import pandas as pd
import re
tweets_df = pd.read_csv("./tweets.csv")
tweets_df["text"] = tweets_df["text"].astype(str) #Machen Sie es vorerst zu einer Zeichenkette
##Deklarieren Sie ein Array zum Speichern des Ergebnisses nach der Satzvektorkonvertierung und ein Array zum Speichern des ursprünglichen Tweets
vectors = []
tweets = []
for tweet in tweets_df["text"]:
    tweet = re.sub('\n', " ", tweet)  #Zeilenvorschubzeichen entfernen
    strip_tweet = re.sub(r'[︰-@]', "", tweet)  #Entfernen von Symbolen voller Breite
    try:
        if len(strip_tweet) > 3: #Weil zu wenige Wörter möglicherweise nicht den richtigen Vektor ergeben
            vector = compute_vector(
                strip_tweet, model, bert_tokenizer, juman_tokenizer)
            vectors.append(vector)
            tweets.append(tweet)
    except Exception as e:
        continue
##Fügen Sie den konvertierten Textvektor in tsv ein.(Das Visualisierungstool benötigt tsv, also machen Sie es tsv)
pd.DataFrame(tweets).to_csv('./tweets_text.tsv', index=False, header=None))
pd.DataFrame(vectors).to_csv('./tweets_vector.tsv', sep='\t', index=False, header=None))

Der hier angezeigte compute_vector ist der Prozess der Konvertierung in einen Satzvektor unter Verwendung des BERT-Modells.

test.py


def compute_vector(text, model, bert_tokenizer, juman_tokenizer):
    use_model = model
    tokens = juman_tokenizer.tokenize(text)
    bert_tokens = bert_tokenizer.tokenize(" ".join(tokens))
    ids = bert_tokenizer.convert_tokens_to_ids(
        ["[CLS]"] + bert_tokens[:126] + ["[SEP]"])
    tokens_tensor = torch.tensor(ids).reshape(1, -1)
    use_model.eval()
    with torch.no_grad():
        all_encoder_layers, _ = use_model(tokens_tensor)
    pooling_layer = -2
    embedding = all_encoder_layers[0][pooling_layer].numpy()
    # embedding = all_encoder_layers[0].numpy()
    # return np.mean(embedding, axis=0)
    return embedding

Wenn Sie die durch diesen Prozess gespeicherte Datei überprüfen, sollte es "tweets_vector.tsv" geben, in dem der Satzvektor in Tabulatortrennzeichen gespeichert ist, und "tweets_text.tsv", in dem der ursprüngliche Tweet gespeichert ist. ist.

tweets_vector_tsv_—_AIResearch.png tweets_text_tsv_—_AIResearch.png

Versuchen Sie zu visualisieren

Jetzt sind Sie bereit für die Visualisierung. Lassen Sie uns diese Satzvektoren mit EmbeddingProjector visualisieren! !! !! !! !!

http://projector.tensorflow.org/

Wenn Sie darauf zugreifen, sollte die Word2Vec-Wortverteilung wie unten gezeigt angezeigt werden. Embedding_projector_-_visualization_of_high-dimensional_data.png

Dieses Mal möchte ich die Verteilung meiner Tweets sehen, also verwenden wir die zuvor generierten tweets_vector.tsv und tweets_text.tsv als Datenquellen. Drücken Sie die Load-Taste und wählen Sie "tweets_vector.tsv" für das erste und "tweets_text.tsv" für das zweite. Embedding_projector_-_visualization_of_high-dimensional_data.png

Embedding_projector_-_visualization_of_high-dimensional_data.png

** Sie sollten jetzt in der Lage sein, Ihre Tweets zu visualisieren. ** ** **

Da der von BERT konvertierte Satzvektor ursprünglich 768 Dimensionen hat, kann er nicht in drei Dimensionen wie dieser angezeigt werden. Da jedoch PCA (eine der Dimensionskomprimierungsmethoden) automatisch ausgeführt wird, wird Folgendes ausgeführt Wird angezeigt. Für die Dimensionskomprimierung können nicht nur PCA, sondern auch T-SNE und UMAP ausgewählt werden.

Embedding_projector_-_visualization_of_high-dimensional_data.png

Wenn Sie einen Punkt auswählen, wird ein Satz ähnlich diesem Satz angezeigt. Dieses Mal werden die Top 10 Ähnlichkeiten angezeigt.

スクリーンショット 2019-12-12 1.19.36.png

** Sätze in Bezug auf Studium und Dissertation wurden als ähnliche Sätze ausgewählt! !! Es scheint, dass die Ähnlichkeit von Sätzen ziemlich gut berechnet werden kann. ** ** **

Dies ist die Verteilung, wenn sie in zwei Dimensionen abgelegt wird. Embedding_projector_-_visualization_of_high-dimensional_data.png

** Ursprünglich werden 768-dimensionale Objekte gewaltsam in einige Dimensionen fallen gelassen, sodass die Verteilung nicht klar voneinander getrennt ist. ** ** ** ** Aufgrund der PCA lag die Erklärungsrate bei 25% auf dem zweiten Platz, 30% auf dem dritten Platz und 50% auf dem zehnten Platz. Dies war also auch ein überzeugendes Ergebnis. ** ** **

Zusammenfassung

Dieses Mal war es eine praktische Übung **, bei der ich versuchte, meine Tweets zu visualisieren, während ich BERT verstand. Wenn Sie die Verteilung Ihrer eigenen Tweets visualisieren, können Sie bis zu einem gewissen Grad verstehen, welche Art von Tweets Sie twittern. In meinem Beispiel war ich ziemlich voreingenommen gegenüber Programmierung und negativen Tweets und fand heraus, dass "ich aus objektiver Sicht eine solche Person bin ...". Ich bedauere, dass ich keine Zeit hatte, das Satzstück zu verwenden, deshalb werde ich Ihnen einen weiteren Artikel mit dem Satzstück geben.

Die Verarbeitung natürlicher Sprache führt häufig nicht zu leicht verständlichen Ergebnissen, aber die Visualisierung liefert neue Entdeckungen. Wenn Sie diesen Artikel interessant finden, ** versuchen Sie es bitte mit Ihren eigenen Tweets **.

Wenn Sie Twitter folgen, murmeln Sie auch über Verarbeitungs- und Empfehlungssysteme in natürlicher Sprache und schreiben Artikel.

Nun, das ist das Ende meines Artikels. Morgen ist ein Artikel von @Mahito. freue mich auf!

Recommended Posts

Versuchen Sie, Ihre Tweets zu visualisieren, während Sie BERT Hands-on verstehen
[Einführung in TensorBoard] Visualisieren Sie die TensorFlow-Verarbeitung, um das Verständnis zu vertiefen
[Einführung in TensorBoard: image] TensorFlow Visualisieren Sie die Bildverarbeitung, um das Verständnis zu vertiefen