建立垃圾留言機器學習模型

1. 事前準備

在本程式碼研究室中,您將審查使用 TensorFlow 和 TensorFlow Lite Model Maker 建立的程式碼,使用含有垃圾留言的資料集建立模型。原始資料可透過 kaggle 取得。系統已將該註解收集成單一 CSV 檔案,並移除損壞的文字、標記、重複字詞等項目來清理。這樣會比較容易聚焦於模型,而非文字。

這裡會列出您要查看的程式碼,但我們強烈建議您一併遵循 Google Colab 中的程式碼

必要條件

  • 本程式碼研究室的適用對象為剛接觸機器學習的資深開發人員,
  • 這個程式碼研究室是「開始使用行動裝置文字分類」課程的一部分。如果您尚未完成之前的活動,請立即停止報名。

課程內容

  • 如何使用 Google Colab 安裝 TensorFlow Lite Model Maker
  • 如何將雲端伺服器中的資料下載到裝置
  • 如何使用資料載入器
  • 如何建構模型

軟硬體需求

2. 安裝 TensorFlow Lite Model Maker

開啟 Colab。筆記本中的第一個儲存格會為你安裝 TensorFLow Lite Model Maker:

!pip install -q tflite-model-maker

完成後,再前往下一個儲存格。

3. 匯入程式碼

下一個儲存格中有多項匯入項目,筆記本中的程式碼需要使用:

import numpy as np
import os
from tflite_model_maker import configs
from tflite_model_maker import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import text_classifier
from tflite_model_maker.text_classifier import DataLoader

import tensorflow as tf
assert tf.__version__.startswith('2')
tf.get_logger().setLevel('ERROR')

系統也會檢查您是否執行的是 TensorFlow 2.x,這是使用 Model Maker 的必要條件。

4. 下載資料

接著,請將 Cloud 伺服器中的資料下載至裝置,並將 data_file 設為指向本機檔案:

data_file = tf.keras.utils.get_file(fname='comment-spam.csv', 
  origin='https://storage.googleapis.com/laurencemoroney-blog.appspot.com/lmblog_comments.csv', 
  extract=False)

Model Maker 可以運用這類簡單的 CSV 檔案訓練模型。您只需指定包含文字的欄,並指定要保留標籤的資料欄。我們稍後會在程式碼研究室中說明如何執行這項操作。

5. 預先學習的嵌入

一般來說,使用 Model Maker 時,您無法從零開始建構模型,您可以使用可依需求自訂的現有模型,

像這樣的語言模型需要採用預先學習的嵌入。嵌入背後的概念就是將字詞轉換為數字,整體語料庫中的每個字詞都有一個數字。嵌入是一種向量,可以建立「方向」來判定字詞情緒。舉例來說,垃圾留言訊息中經常出現的字詞,會將向量指向類似的方向,反之亦然。

透過使用預先學習的嵌入,您必須先從大型語料庫中開始訓練出某些字詞的語料庫或集合,如此一來,您將能更快取得解決方案,而不必從零開始。

模型製作工具提供多種預先學習的嵌入,但最簡單的入門方式是 average_word_vec

程式碼如下:

spec = model_spec.get('average_word_vec')
spec.num_words = 2000
spec.seq_len = 20
spec.wordvec_dim = 7

num_words 參數

也可以指定您希望模型使用的字詞數量。

你可能想「越多越好」但通常根據每個字詞的使用頻率,制定最適當的數字如果使用整個語料庫中的每個字詞,模型可能會試圖學習,以及只使用一次的字詞方向。許多文字語料庫中只會出現一或兩次的字詞,在模型中使用這些字詞對整體情緒的影響微乎其微,因此通常不值得。您可以使用 num_words 參數,針對指定的字詞數量調整模型。

這個數字越小,模型越短越好,但因為辨識出較少的字詞,精確度可能會降低。這裡的數字越大,模型越大、速度越慢。找出最佳平衡點是關鍵!

wordvec_dim 參數

wordved_dim 參數是指您要為每個字詞向量使用的維度數量。根據研究判斷,原則是字詞數量的第四根。假設您輸入 2000 個字,一開始可以採用 7 個字。如果您變更了使用的字數,也可以進行變更。

seq_len 參數

關於輸入值,模型通常都相當嚴謹。對語言模型而言,這表示語言模型可分類特定、靜態長度的語句。此決定取決於 seq_len 參數或 sequence 長度

當您將字詞轉換為數字 (或符記) 時,一個句子會成為這些符記的序列。因此,您的模型經過訓練 (在本範例中),分類及辨識含有 20 個符記的句子。如果句子長超過此長度,將遭到截斷。如果片長短於 15 分鐘,系統會將其填補。您會在語料庫中看到用於此的 <PAD> 專用權杖。

6. 使用資料載入器

您先前下載了 CSV 檔案。接著請使用資料載入器,將上述值轉換為模型可辨識的訓練資料:

data = DataLoader.from_csv(
    filename=data_file,
    text_column='commenttext',
    label_column='spam',
    model_spec=spec,
    delimiter=',',
    shuffle=True,
    is_training=True)

train_data, test_data = data.split(0.9)

在編輯器中開啟 CSV 檔案時,您會發現每一行都有兩個值,而這些項目的第一行將以文字描述。一般而言,每個項目都會視為資料欄。

您會看到第一欄的描述元是 commenttext,而每一行的第一個項目就是註解的文字。同樣地,第二欄的描述元是 spam,您會看到每一行的第二個項目是 TrueFalse,,表示該文字是否被視為垃圾評論。其他屬性會設定您先前建立的 model_spec,以及分隔符號字元,在本範例中為以半形逗號分隔檔案。您將使用此資料訓練模型,因此 is_Training 設定為 True

建議您保留一部分資料來測試模型。分割資料,其餘 10% 用於訓練,另外 10% 則用於測試/評估。因為我們需要確保測試資料是隨機選擇,而不是「底部」10% 的資料集,因此在載入資料時使用 shuffle=True

7. 建構模型

下一個儲存格只是建構模型,只需要一行程式碼:

# Build the model
model = text_classifier.create(train_data, model_spec=spec, epochs=50, 
                               validation_data=test_data)

這項操作會使用 Model Maker 建立文字分類器模型,並指定要使用的訓練資料 (如步驟 4 所設定)、模型規格 (如步驟 4 中的設定),以及多個訓練週期 (本例為 50)。

機器學習的基本原則是模式比對的形式。一開始,它會載入字詞的預先訓練權重,然後嘗試將這些字詞與預測結果分組,以表示垃圾字詞,哪些則沒有。第一次使用這種模型時,可能將近 50:50 模型,因為這個模型才剛開始。

b94b00f0b155db3d.png

接著,工具會評估這項結果,並執行最佳化程式碼來調整預測結果,然後再試一次。這是一個週期只要指定 epochs=50,就會進入「迴圈」50 次。

85f1d21c0b64d654.png

當達到第 50 個週期時,模型的準確度就會大幅提升。在本例中是 99%!

右側會顯示驗證準確度數據。這類偏誤通常會比訓練準確率略低,因為表示模型如何對先前從未「看過」的資料進行分類。並使用我們稍早設定的 10% 測試資料。

5be7967ec70e4302.png

8. 匯出模型

訓練完成後,即可匯出模型。

TensorFlow 會以自己的格式訓練模型,因此必須轉換成 TFLITE 格式,才能在行動應用程式中使用。模型製作工具可為您處理這種複雜性。

只要匯出模型並指定目錄即可:

model.export(export_dir='/mm_spam')

您會在該目錄中看到 model.tflite 檔案。那就趕快下載,在下一個程式碼研究室中,您會需要用到這項資訊,因此請將其新增至 Android 應用程式!

iOS 注意事項

您剛剛匯出的 .tflite 模型適用於 Android,因為模型中繼資料嵌入於其中,而 Android Studio 可以讀取該中繼資料。

這項中繼資料相當重要,因為其中包含代表字詞的符記字典,方便模型辨識。之前還記得,您知道字詞會成為符記時,這些符記可以獲得情緒分析嗎?您的行動應用程式將需要知道這些權杖。舉例來說,如果您搜尋的是「狗」符記化為 42,使用者輸入「dog」就必須將「dog」轉換為句子以便模型理解內容Android 開發人員擁有「TensorFlow Lite 工作程式庫」雖然更容易上手,但在 iOS 裝置上則需要處理詞彙,所以你必須支援詞彙。但可以指定 export_format 參數,由模型製作工具匯出此內容。因此,如要取得模型的標籤和詞彙,您可以使用下列程式碼:

model.export(export_dir='/mm_spam/', 
             export_format=[ExportFormat.LABEL, ExportFormat.VOCAB])

9. 恭喜

本程式碼研究室將逐步引導您完成 Python 程式碼,以建構並匯出模型。結尾會顯示 .tflite 檔案。

在下一個程式碼研究室中,您將瞭解如何編輯 Android 應用程式以使用此模型,以便開始分類垃圾留言。