[PYTHON] Une époque où la classification de texte par BERT est possible avec 3 lignes de code

table des matières 1.Tout d'abord 2. Présentation de la bibliothèque 3. Code de test avec livingoor-corpus

introduction

Dans cet article, nous allons vous présenter une bibliothèque qui vous permet d'effectuer facilement une classification multi-classes (classification de documents, classification de texte) de texte par BERT. Les trois lignes du titre sont la signification de la bibliothèque, semblable à une méthode.

Qu'est-ce que BERT

BERT signifie Représentations d'encodeur bidirectionnel à partir de transformateurs Traduit comme «représentation codée bidirectionnelle par Transformer», il s'agit d'un modèle de traitement du langage naturel publié dans un article de Jacob Devlin et al. De Google en octobre 2018. Les domaines de travail du traitement du langage naturel tels que la traduction, la classification des documents et les questions et réponses sont appelés «tâches (de traitement du langage naturel)», et BERT a attribué à ce moment le score le plus élevé dans diverses tâches. Citation: Ledge.ai "Qu'est-ce que BERT | Expliquer les fonctionnalités et le mécanisme du fier modèle de traitement du langage naturel de Google"

Référence: Qiita "Explication approfondie de l'article de" BERT ", le roi du traitement du langage naturel"

Classification des textes par BERT

Heureusement, il existe déjà de nombreux exemples d'articles sur la classification de texte par BERT. Cependant, c'est assez long et il est difficile de démarrer.

référence: Classification des phrases japonaises à l'aide du modèle de traitement du langage naturel (BERT) Classification à valeurs multiples des phrases japonaises utilisant BERT [PyTorch] Introduction à la classification des documents japonais à l'aide de BERT

Donc, après quelques recherches, il y avait une personne qui l'a emballé dans une bibliothèque pratique ↓ ↓

「Simple Transformers」

Article original: [Simple Transformers - Classification de texte multi-classes avec BERT, RoBERTa, XLNet, XLM et DistilBERT](https://medium.com/swlh/simple-transformers-multi-class-text-classification-with-bert] -roberta-xlnet-xlm-et-8b585000ce3a)

Cette bibliothèque est une bibliothèque Transformer "fonctionnelle". C'est génial si vous souhaitez utiliser Transformer avec trois lignes de code sans vous soucier des détails techniques. (Traduit de l'article original)

Il existe plusieurs types de BERT, Une bibliothèque appelée Transformers peut exécuter huit de BERT, GPT, GPT-2, Transformer-XL, XLNet, XLM, RoBERTa et DistliBERT de la même manière. Ce "Simple Transformers" est une bibliothèque qui le rend encore plus facile à utiliser.

introduction

Officiellement, je recommande conda, mais je l'ai fait dans un environnement virtuel venv.

Prérequis: $ pip install pandas tqdm scipy scikit-learn transformers tensorboardx simples transformers ** En plus de cela, vous aurez besoin de pytorch. ** ** Si vous utilisez GPU, vous devez installer CUDA séparément, veuillez donc le vérifier. Dans le cas du CPU, il est possible d'installer uniquement pytorch. Vous pouvez obtenir la commande d'installation de celle officielle qui convient à votre environnement. → Officiel de Pytorch

Au fait, dans mon environnement, je n'ai pas pu éviter l'erreur de manque de mémoire GPU, alors je l'ai exécuté sur le processeur. C'est long.

Essayez d'utiliser

Tout d'abord, si vous résumez la démo officielle en japonais

L'acquisition des données

  1. Téléchargez les données d'ici
  2. Extrayez train.csv et test.csv dans le répertoiredata /

Prétraitement

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)

Génération d'instance

from simpletransformers.classification import ClassificationModel

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

Entraînement

model.train_model(train_df)

Évaluation

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

Ce qui précède est l'exemple publié dans l'article original. C'est facile.

Et en japonais?

Ensuite, je me demande à quel point il peut être utilisé dans les phrases japonaises (même si je ne comprends pas assez BERT). Je l'ai essayé avec le familier livingoor corpus.

Prétraitement

S'il est à l'état téléchargé, il est dispersé dans .txt pour chaque domaine, je l'ai donc résumé en CSV. À ce moment-là, remplacez le domaine par une étiquette, ne laissant que l'étiquette et le corps. Comme il est un peu difficile d'utiliser le CPU, le test a été réalisé dans 3 domaines de 0 à 2. (dokujo-tsushin、it-life-hack、kaden-channel) 22222222.png

Divisez ceci en train et testez

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")

Formation et évaluation

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)

résultat

Précision: 0.8798329801724872 
Perte: 0.24364208317164218

était. Je n'ai pas lu correctement les données originales, donc je ne connais pas les caractéristiques de chaque domaine, mais c'est une bonne précision.

De plus, lorsque je prédis d'autres articles de domaine, cela ressemble à ceci. 000000000000000000000.png

Il semble que le hack de la vie informatique et le S-MAX du site de gadgets soient similaires.

Probabilité globale

Je l'ai tracé grossièrement sans le diviser en domaines, mais il est assez divisé. image.png

Probabilité par domaine

image.png

fin

Vous pouvez facilement effectuer une classification de texte par BERT simplement en préparant les données de cette manière. github Il semble qu'il puisse être utilisé pour des paramètres détaillés et d'autres tâches. Je l'ai touché avant d'en apprendre davantage sur BERT, je vais donc étudier un peu et réessayer avec diverses données. Veuillez l'utiliser.

Recommended Posts

Une époque où la classification de texte par BERT est possible avec 3 lignes de code
Classification des textes du défi par Naive Bayes avec sklearn
Résumé des sites de référence lors de l'édition de Blender Script avec un éditeur externe (VS Code)
Répertoriez rapidement plusieurs lignes de texte que vous écrivez dans votre code