table des matières 1.Tout d'abord 2. Présentation de la bibliothèque 3. Code de test avec livingoor-corpus
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.
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"
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.
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.
Tout d'abord, si vous résumez la démo officielle en japonais
train.csv
et test.csv
dans le répertoiredata /
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)
from simpletransformers.classification import ClassificationModel
model = ClassificationModel('roberta', 'roberta-base', num_labels=4)
model.train_model(train_df)
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.
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.
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)
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")
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)
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.
Il semble que le hack de la vie informatique et le S-MAX du site de gadgets soient similaires.
Je l'ai tracé grossièrement sans le diviser en domaines, mais il est assez divisé.
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