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
次回
この記事が気に入ったらサポートをしてみませんか?