2021年1月28日 星期四

[NLP] 自然語言處理觀念整理-3 (text classification)

 

自然語言處理觀念整理-3

text classification
text classification是將原始資料進行標註, 透過ML訓練模型, 用來預測新的一句話是屬於何種分類

文本分類有分為多種形態:

  1. 二元分類: 一個文件被賦予一個是非的答案
  2. 多元分類: 一個文件被賦予一個特定的答案
  3. 多標籤分類 : 一個文件被賦予多個標籤, 如體育新聞被標註體育.籃球...等等

文本分類有許多應用應用場景例如:

  • email分類, 垃圾郵件分類
  • 搜尋引擎, 推薦系統
  • 顧客問題分類
  • 評價情緒分析
  • 語言識別
  • 作者識別
  • 真假新聞

建構分類的pipeline

  1. 蒐集標籤資料組
  2. 將資料拆成訓練. 驗證. 測試
  3. 決定評估指標
  4. 將原文轉換維特徵向量
  5. 使用訓練組特徵向量來進行訓練模型
  6. 使用測試組與指標評估模型
  7. 部屬模型並進行監控

常用評估指標有

  • accuracy, precision, recall, F1, ROC, 矛盾矩陣
  • 特殊領域也有特定的評估KPI
一個簡單的範例如下, 可參考這裡
from sklearn.linear_model import LogisticRegression #import

logreg = LogisticRegression(class_weight="balanced") #instantiate a logistic regression model
logreg.fit(X_train_dtm, y_train) #fit the model with training data

#Make predictions on test data
y_pred_class = logreg.predict(X_test_dtm)

#calculate evaluation measures:
print("Accuracy: ", accuracy_score(y_test, y_pred_class))
print("AUC: ", roc_auc_score(y_test, y_pred_prob))
cnf_matrix = confusion_matrix(y_test, y_pred_class)
plt.figure(figsize=(8,6))
plot_confusion_matrix(cnf_matrix, classes=['Not Relevant','Relevant'],normalize=True,
                      title='Confusion matrix with normalization')

分類器性能低下原因

  • 過於稀疏矩陣, 特正向量太過龐大 >> embedding
  • 資料類別不平衡問題 >> upper or down sample
  • 更好的演算法與調參 >> 每個都要試試看
  • 更好的原文表示法 >> 依照功能需求調整

避免稀疏陣列文字表示法

  • word embedding : 範例請看這裡
  • 次單字embedding與fastText : 快速且可處理OOV問題
  • doc embedding : 學習整個文件(句子段落)的表示法

使用深度學習

  1. 將原文語義單元化, 並轉籌單字索引向量
  2. 填補原文序列, 使每個元文向量都有相同長度
  3. 將每個單字索引mapping到一個embedding向量, 可藉由單字索引向量語embedding矩陣相乘
  4. embedding可替換成訓練好的embedding
  5. 將3 or 4 當成神經網路結構輸入
  6. 多調整超參數與參數或使用自動調參
  7. LSTM比較擅長利用元文的連續性質, 他需要資料量比CNN多很多, 不足的話無法發揮
  8. 範例請看這裡

使用大型訓練好的模型進行分類(遷移學習)

  • 當資料量不足時, 可使用訓練好的模型如BERT
  • fine-tune接上自己的分類
  • 範例請看Keras ktrainpytorch

用lime來解釋分類器預測

  • 可解釋那些字影響的分類
  • 範例請看ML or DL

缺乏資料標籤建議作法

  • 使用既有API進行分類(google分類API)
  • 使用開放式data
  • 根據經驗法則上label再進行修正
  • 使用prodigy之類工具主動學習
  • 從隱性或顯性的回饋中學習

實用的建議

  • 採用最先進的演算法是個錯誤, 應該快速建立出baseline, 先進模型可能造成大量技術債
  • 平衡訓練資料, 設法蒐集更多資料
  • 交由專家協助標註
  • 將蒐集資料, 建構pipeline, 部屬, 測試, 監控做好, 快速建立模型, 再進行反覆測試
  • ensemble演算法, 採多數決


Ref:
  • 自然語言處理最佳實務, O'Reilly

沒有留言:

張貼留言