[PYTHON] Eine Ära, in der eine Textklassifizierung durch BERT mit 3 Codezeilen möglich ist

Inhaltsverzeichnis

  1. Zuallererst
  2. Einführung in die Bibliothek
  3. Testcode mit Livedoor-Corpus

Einführung

In diesem Artikel stellen wir eine Bibliothek vor, mit der Sie auf einfache Weise eine Mehrklassenklassifizierung (Dokumentklassifizierung, Textklassifizierung) von Text durch BERT durchführen können. Die drei Zeilen im Titel sind die methodenähnliche Bedeutung der Bibliothek.

Was ist BERT?

BERT steht für Bidirectional Encoder Representations from Transformers Übersetzt als "bidirektional codierte Darstellung durch Transformer", handelt es sich um ein Verarbeitungsmodell in natürlicher Sprache, das im Oktober 2018 in einem Artikel von Jacob Devlin et al. Von Google veröffentlicht wurde. Die Arbeitsbereiche der Verarbeitung natürlicher Sprache wie Übersetzung, Klassifizierung von Dokumenten sowie Frage und Antwort werden als "Aufgaben (Verarbeitung natürlicher Sprache)" bezeichnet, und BERT erzielte zu diesem Zeitpunkt die höchste Punktzahl bei verschiedenen Aufgaben. Zitat: [Ledge.ai "Was ist BERT?

Referenz: Qiita "Gründliche Erklärung des Papiers von" BERT ", dem König der Verarbeitung natürlicher Sprache"

Textklassifizierung nach BERT

Zum Glück gibt es bereits viele Beispielartikel zur Textklassifizierung durch BERT. Es ist jedoch ziemlich lang und es ist schwierig, loszulegen.

Referenz: Klassifizierung japanischer Sätze unter Verwendung des Verarbeitungsmodells für natürliche Sprache (BERT) Mehrwertklassifizierung japanischer Sätze mit BERT [PyTorch] Einführung in die Klassifizierung japanischer Dokumente mit BERT

Nach ein wenig Recherche gab es also eine Person, die es in eine handliche Bibliothek gepackt hat ↓ ↓

「Simple Transformers」

Originalartikel: [Einfache Transformatoren - Mehrklassentextklassifizierung mit BERT, RoBERTa, XLNet, XLM und DistilBERT](https://medium.com/swlh/simple-transformers-multi-class-text-classification-with-bert] -roberta-xlnet-xlm-and-8b585000ce3a)

Diese Bibliothek ist eine "funktionierende" Transformer-Bibliothek. Dies ist ideal, wenn Sie Transformer mit drei Codezeilen verwenden möchten, ohne sich um die technischen Details kümmern zu müssen. (Übersetzt aus dem Originalartikel)

Es gibt verschiedene Arten von BERT, Eine Bibliothek namens Transformers kann acht von BERT, GPT, GPT-2, Transformer-XL, XLNet, XLM, RoBERTa und DistliBERT auf ähnliche Weise ausführen. Diese "einfachen Transformatoren" sind eine Bibliothek, die die Verwendung noch einfacher macht.

Einführung

Offiziell empfehle ich conda, aber ich habe es in einer virtuellen Umgebung gemacht.

Voraussetzungen: $ pip install pandas tqdm scipy scikit-learn transformatoren tensorboardx simple transformers ** Zusätzlich benötigen Sie Pytorch. ** **. Wenn Sie eine GPU verwenden, müssen Sie CUDA separat installieren. Überprüfen Sie dies daher bitte. Bei CPU ist es in Ordnung, nur Pytorch zu installieren. Sie können den Installationsbefehl von dem offiziellen Befehl erhalten, der zu Ihrer Umgebung passt. → Pytorch Official

Übrigens konnte ich in meiner Umgebung den Fehler bei der GPU-Speichermangel nicht vermeiden, also habe ich ihn auf der CPU ausgeführt. Es ist lang.

Versuchen Sie es mit

Zunächst einmal, wenn Sie die offizielle Demo auf Japanisch zusammenfassen

Datenerfassung

  1. Daten von hier herunterladen
  2. Extrahieren Sie "train.csv" und "test.csv" in das Verzeichnis "data /"

Vorverarbeitung

import pandas as pd

train_df = pd.read_csv('data/train.csv', header=None)
train_df['text'] = train_df.iloc[:, 1] + " " + train_df.iloc[:, 2]
train_df = train_df.drop(train_df.columns[[1, 2]], axis=1)
train_df.columns = ['label', 'text']
train_df = train_df[['text', 'label']]
train_df['text'] = train_df['text'].apply(lambda x: x.replace('\\', ' '))
train_df['label'] = train_df['label'].apply(lambda x:x-1)

eval_df = pd.read_csv('data/test.csv', header=None)
eval_df['text'] = eval_df.iloc[:, 1] + " " + eval_df.iloc[:, 2]
eval_df = eval_df.drop(eval_df.columns[[1, 2]], axis=1)
eval_df.columns = ['label', 'text']
eval_df = eval_df[['text', 'label']]
eval_df['text'] = eval_df['text'].apply(lambda x: x.replace('\\', ' '))
eval_df['label'] = eval_df['label'].apply(lambda x:x-1)

Instanzgenerierung

from simpletransformers.classification import ClassificationModel

model = ClassificationModel('roberta', 'roberta-base', num_labels=4)

Ausbildung

model.train_model(train_df)

Auswertung

result, model_outputs, wrong_predictions = model.eval_model(eval_df)

Das Obige ist das im Originalartikel veröffentlichte Beispiel. Es ist einfach.

Wie wäre es auf Japanisch?

Als nächstes frage ich mich, wie viel es in japanischen Sätzen verwendet werden kann (obwohl ich BERT nicht genug verstehe). Ich habe es mit dem bekannten [Livedoor Corpus] versucht (https://www.rondhuit.com/download.html).

Vorverarbeitung

Wenn es sich im heruntergeladenen Zustand befindet, wird es für jede Domain in .txt verteilt, daher habe ich es in CSV zusammengefasst. Ersetzen Sie zu diesem Zeitpunkt die Domain durch ein Label, und lassen Sie nur das Label und den Text übrig. Da es für die CPU etwas schwierig ist, wurde der Test in 3 Domänen von 0 bis 2 durchgeführt. (dokujo-tsushin、it-life-hack、kaden-channel) 22222222.png

Teilen Sie dies in Zug und Test

from sklearn.model_selection import train_test_split
X_train_df, X_test_df, y_train_s, y_test_s = train_test_split(
    data["text"], data["label"], test_size=0.2, random_state=0, stratify=data["label"]
)

train_df = pd.DataFrame([X_train_df,y_train_s]).T
test_df = pd.DataFrame([X_test_df,y_test_s]).T

train_df["label"] = train_df["label"].astype("int")
test_df["label"] = test_df["label"].astype("int")

Schulung & Bewertung

from simpletransformers.classification import ClassificationModel

model = ClassificationModel('roberta', 'roberta-base', num_labels=3,use_cuda=False)
model.train_model(train_df)
result, model_outputs, wrong_predictions = model.eval_model(test_df)

Ergebnis

Genauigkeit: 0.8798329801724872 
Verlust: 0.24364208317164218

war. Ich habe die Originaldaten nicht richtig gelesen, daher kenne ich die Eigenschaften der einzelnen Domänen nicht, aber die Genauigkeit ist gut.

Wenn ich andere Domain-Artikel vorhersage, sieht es außerdem so aus. 000000000000000000000.png

Es scheint, dass IT Life Hack und S-MAX der Gadget-Site ähnlich sind.

Gesamtwahrscheinlichkeit

Ich habe es grob geplottet, ohne es in Domänen zu unterteilen, aber es ist ziemlich geteilt. image.png

Wahrscheinlichkeit pro Domain

image.png

Ende

Sie können die Textklassifizierung durch BERT einfach durchführen, indem Sie die Daten wie folgt vorbereiten. github Es scheint, dass es für detaillierte Einstellungen und andere Aufgaben verwendet werden kann. Ich habe es berührt, bevor ich etwas über BERT gelernt habe, also werde ich ein wenig lernen und es dann erneut mit verschiedenen Daten versuchen. Bitte benutzen Sie es.

Recommended Posts

Eine Ära, in der eine Textklassifizierung durch BERT mit 3 Codezeilen möglich ist
Fordern Sie die Textklassifizierung von Naive Bayes mit sklearn heraus
Zusammenfassung der Referenzseiten beim Bearbeiten von Blender Script mit einem externen Editor (VS Code)
Listen Sie schnell mehrere Textzeilen auf, die Sie in Ihren Code schreiben