見出し画像

Huggingface Transformers 入門 (12) -日本語のテキスト分類の学習

「Huggingface Transformers」による日本語のテキスト分類の学習手順をまとめました。

・Huggingface Transformers 4.1.1
・Huggingface Datasets 1.2

前回

1. データセットの準備

livedoorニュースコーパス」を使って「IT」「スポーツ」「映画」のニュースのタイトルを分類するデータセットを作成します。

(1) livedoorニュースコーパスのダウンロード。

# livedoorニュースコーパスのダウンロード
!wget https://www.rondhuit.com/download/ldcc-20140209.tar.gz
!tar zxvf ldcc-20140209.tar.gz

(2) 学習データ(train.csv)と検証データ(dev.csv)の作成。

import os
import pandas as pd

# タイトルリストの取得
def get_title_list(path):
    title_list = []
    filenames = os.listdir(path)
    for filename in filenames:
        # ファイルの読み込み
        with open(path+filename) as f:
            title = f.readlines()[2].strip()
            title_list.append(title)
    return title_list
       
# データセットの生成
df = pd.DataFrame(columns=['label', 'sentence'])
title_list = get_title_list('text/it-life-hack/')
for title in title_list:
    df = df.append({'label':0 , 'sentence':title}, ignore_index=True)
title_list = get_title_list('text/sports-watch/')
for title in title_list:
    df = df.append({'label':1 , 'sentence':title}, ignore_index=True)
title_list = get_title_list('text/movie-enter/')
for title in title_list:
   df = df.append({'label':2 , 'sentence':title}, ignore_index=True)

# シャッフル
df = df.sample(frac=1)

# データセットの保存
num = len(df)
df[:int(num*0.8)].to_csv('train.csv', sep=',', index=False)
df[int(num*0.8):].to_csv('dev.csv', sep=',', index=False)

「train.csv」と「dev.csv」の書式は、次のとおりです。ヘッダの1列目はlabel、2列目はsentenceを指定します。

label,sentence
0,Excel操作を簡略化! ドラッグ&ドロップでシート間コピー【知っ得!虎の巻】
1,【Sports Watch】日本代表戦士に訊く、岡田監督とザッケローニ監督の違いとは?
    :

(3) 削除。

# 削除
!rm -rf text
!rm ldcc-20140209.tar.gz

2. 日本語のテキスト分類の学習

(1) Huggingface Transformersをソースコードからインストール。

# Huggingface Transformersのインストール
!git clone https://github.com/huggingface/transformers
%cd transformers
!pip install .

(2) 日本語対応パッケージのインストール。

# 日本語対応パッケージのインストール
!pip install fugashi[unidic-lite]
!pip install ipadic

(3) 「Huggingface Datasets」のインストール。

# Huggingface Datasetsのインストール
!pip install datasets

(4) run_glue.pyで学習を実行。
「output」フォルダにモデルが出力されます。

%%time

# テキスト分類の学習
!python ./examples/text-classification/run_glue.py \
    --model_name_or_path=cl-tohoku/bert-base-japanese-whole-word-masking \
    --do_train \
    --do_eval \
    --max_seq_length=128 \
    --per_device_train_batch_size=32 \
    --use_fast_tokenizer=False \
    --learning_rate=2e-5 \
    --num_train_epochs=10 \
    --output_dir=output/ \
    --overwrite_output_dir \
    --train_file=../train.csv \
    --validation_file=../dev.csv  
***** Eval results None *****
  epoch = 10.0
  eval_accuracy = 0.967863917350769
  eval_loss = 0.15605099499225616
  eval_runtime = 4.5529
  eval_samples_per_second = 116.189
CPU times: user 1.28 s, sys: 237 ms, total: 1.51 s
Wall time: 8min 26s

3. 日本語のテキスト分類の推論

import torch
from transformers import BertJapaneseTokenizer, AutoModelForSequenceClassification

# 入力テキスト
text = "Huggingfaceに新しいテキスト生成モデルが追加"

# モデルとトークナイザーの準備
model = AutoModelForSequenceClassification.from_pretrained('output/')    
tokenizer = BertJapaneseTokenizer.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking') 

# テンソルに変換
tokenized_text = tokenizer.tokenize(text)
indexed_tokens = tokenizer.convert_tokens_to_ids(tokenized_text)
tokens_tensor = torch.tensor([indexed_tokens])

# 推論の実行
labels = ['IT', 'スポーツ', '映画']
model.eval()
with torch.no_grad():
   outputs = model(tokens_tensor)[0]
   print(labels[torch.argmax(outputs)])
IT

次回



この記事が気に入ったらサポートをしてみませんか?