BERTで超かんたんにテキスト分類する方法(2値分類のみ)

2019/10/25

機械学習 自然言語処理

t f B! P L
テキスト分類なんて基礎の基礎なので意外とBERTでやったことなかったりする。
今回はBERTでさくっとテキスト分類をやる方法についてです。
ただし、さくっとできるのはテキストの2値分類(binary classification)のみで、多クラス分類をやりたい場合は、ソースの書き換えが必要です

ファイルのI/OがGLUEタスク向け

GLUEは自然言語処理のベンチマークセットです。

BERTのclassification(テキスト分類)スクリプトは、ファイル入力の部分が親切にもGLUEのフォーマット準拠になっており、引数でどのGLUEタスクをやりたいかを指定すると、データをよしなに読み込んでくれる仕様になっています。

ようは、自分のデータを、このGLUEタスクのフォーマットに合うように用意すれば、あとはスクリプトがよしなにファイル読み込みから学習までやってくれます。

そのため、標準的なテキスト分類をしたいだけであれば、ファイル読み込みの部分を自分で書く必要がないです。

以下はpytorch版BERT(transformers)で説明します。
https://github.com/huggingface/transformers

Google本家のtensorflow版BERTでも分類スクリプトがGLUE仕様になっていることなどは共通ですが、pytorch版のほうが対応しているGLUEタスクが多いので、pytorch版をおすすめします。
examples/run_glue.pyのtask_nameという引数にGLUEのタスク名を指定します。

1 sentence classification

ふつうのテキスト分類をしたいのであればこちら。
有名なのだと、映画レビューのポジネガ判定、Eメールのスパム判定なんかは2値分類でできます。

1 sentence classificationの場合は、The Stanford Sentiment Treebank形式がおすすめです。
センチメントとあるように評判分析、ポジネガ判定の典型的なデータセットです。

データは以下の形式のTSVで用意します。
"sentence" "label"

1行目が上記のカラム名
2行目からデータが入ります。
sentence列は、テキストをそのもの。
label列はラベルによって1か0が入ります。

対応する--task_nameは"SST-2"です。

次項も同じですが、ファイル名は訓練データをtrain.tsv, 評価データはdev.tsvで用意してください。
この名前はハードコードされているので必ず守ってください。

2 sentence classification

あまりメジャーではないですが2つのセンテンスの関係性を評価したいケースの場合はこちらです。

これは研究で多いのですが、よくあるのが「2文の等価性」を評価するデータセットです。
(文章1,文章2,ラベル)のセットになっていて、文章1と2が似てる場合はラベル=1、似ていない場合はラベル=0になります。
GLUEの中でも、QQP、MRPC、STS-Bなどが該当します。

ラベルのフォーマットの関係でおすすめなのはWinograd NLIです。
データは以下の形式のTSVで用意します。
"index" "sentence1" "sentence2" "label"

Indexは適当でOKです。
BERT的にはテキスト2つとラベルがあればいいので。

対応する--task_nameはWNLIです。

今日のベストプラクティス

ぎりぎりまで楽しよう。

ラベル

QooQ