【NLP 自然語言處理】BERT + Fast.ai — 多標籤分類模型實作

Fast.ai 是基於 PyTorch 的深度學習函式庫,為深度學習應用提供統一的 API,使開發者更無痛上手

JiunYi Yang (JY)
資料探員 Data Agent
6 min readAug 22, 2021

--

PyTorch 源碼牽涉一些底層程式,能夠自由修改但出錯機會也大,而 Fastai 提供統一的 API 調用 PyTorch 函式。本文將使用 fastai 及 BERT pretrained model 訓練多標籤文本分類模型。

本文任務‌

  • 了解多標籤分類任務
  • 認識 Fast.ai
  • 使用 Fast.ai 進行文本多標籤分類任務
在開始前不免俗的…
.如果你喜歡這篇文章的選題,請幫我拍手👏 +5 下,讓我瞭解這是不是讀者所喜歡的方向
.如果這篇文章的整理對你有幫助,請幫我拍手👏 +20 下,讓我瞭解內容對讀者的幫助程度
.如果還希望有類似的知識點整理,請幫我拍手👏 +50 下,讓類似的內容可以繼續出現!

何謂多標籤分類‌?

和「二元分類」、「多類別分類」相比,「多標籤分類」是指每個樣本能夠被賦予多個 label,各個 label 是否標上樣本,由 sigmoid function 產生一個 0~1之間的機率、設定門檻後決定。

資料探員站長自製整理圖

認識 Fast.ai‌

Fast.ai 是基於 PyTorch 的深度學習函式庫,為深度學習應用提供統一的 API,使開發者更無痛上手、加速深度學習應用開發。透過 Fast.ai 可以使用統一的架構進行影像辨識、文本、時間序列、協同過濾等應用。‌

使用 Fast.ai 進行文本多標籤分類任務

此 Kaggle 比賽使用來自維基百科的留言資料,將留言標上 6 種代表負面情緒的標籤,分別是 toxic, severe_toxic, obscene, threat, insult, identity_hate,幫助平台判斷是否阻擋用戶的不當留言。

  1. 安裝所需套件
!pip install pytorch-pretrained-bert

2. 引入所需套件

包含基本的 numpy, pandas, sklearn 的 train_test_split 及 pytorch, fastai套件,並自 pretrained model 提取 BERT Tokenizer 及 BERT 文本分類模型。

import numpy as np
import pandas as pd
from typing import *
from sklearn.model_selection import train_test_split
import torch
import torch.optim as optim
from fastai import *
from fastai.vision import *
from fastai.text import *
from fastai.callbacks import *
from pytorch_pretrained_bert import BertTokenizer
bert_tok = BertTokenizer.from_pretrained(config.bert_model_name)
from pytorch_pretrained_bert.modeling import BertForSequenceClassification
model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=6)

3. 引入本任務訓練資料集

label_cols = ['toxic', 'severe_toxic', 'obscene', 'threat', 'insult', 'identity_hate']train = pd.read_csv('train.csv', error_bad_lines=False, engine='python')
train['comment_text'] = train['comment_text'].str.replace('([“”"¨«»®´·º½¾¿¡§£₤‘’])', '')
test = pd.read_csv('test.csv', error_bad_lines=False, engine='python')
test['comment_text'] = test['comment_text'].str.replace('([“”"¨«»®´·º½¾¿¡§£₤‘’])', '')
train, val = train_test_split(train)

4. 創建所需的 BertTokenizer 及 Vocab

5. 調用 Fastai 的 TextClasDataBunch 方法,將資料集轉成可以丟進 Fastai 模型的格式

6. 產生多標籤模型架構

7. 設定指標評估 function 並建置模型

8. 測試模型效果

  • 正面案例:沒有被標上任何負面情緒 label,機率分數也低於門檻很多
  • 負面案例:被標上負面情緒 label = {‘toxic’, ‘threat’},其他標籤的機率分數也更為接近門檻

9. 印出模型成效指標

以上是運用 Fast.ai 及 BERT 預訓練模型進行文本多標籤分類的實作案例,希望對你有幫助!

若想獲得完整代碼請至粉專貼文留言,Chatbot 會將連結火速送到你手中。

.如果你喜歡這篇文章的選題,請幫我拍手👏 +5 下,讓我瞭解這是不是讀者所喜歡的方向
.如果這篇文章的整理對你有幫助,請幫我拍手👏 +20 下,讓我瞭解內容對讀者的幫助程度
.如果還希望有類似的知識點整理,請幫我拍手👏 +50 下,讓類似的內容可以繼續出現!

--

--

JiunYi Yang (JY)
資料探員 Data Agent

Master @ NCCU MIS.Founder @ jiunyiyang.me .Data Scientist & Digital Ads Optimizer.Feel free to PM me at: m.me/Abao.JiunYiYang or linkedin.com/in/jiunyiyang