构建垃圾评论机器学习模型

1. 准备工作

在此 Codelab 中,您将了解使用 TensorFlow 和 TensorFlow Lite Model Maker 创建的代码,以使用垃圾评论数据集创建模型。Kaggle 上提供原始数据。系统已将此文件汇总到一个 CSV 文件中,并通过移除损坏的文本、标记、重复字词等将其清理干净。这样可以更轻松地专注于模型,而不是文本。

您需要查看的代码已在此处提供,但我们强烈建议您在 Google Colab 中遵循此代码

前提条件

  • 此 Codelab 专为刚接触机器学习的有经验的开发者编写。
  • 此 Codelab 是“适用于移动设备的文本分类入门”在线课程的一部分。如果您尚未完成之前的活动,请立即停止。

学习内容

  • 如何使用 Google Colab 安装 TensorFlow Lite Model Maker
  • 如何将 Cloud 服务器中的数据下载到您的设备
  • 如何使用数据加载器
  • 如何构建模型

所需物品

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 文件训练模型。您只需指定哪些列包含文本,哪些列包含标签。稍后在此 Codelab 中,您将了解如何执行此操作。

5. 学到的嵌入

通常,使用 Model Maker 时,您无需从头开始构建模型。您可以根据自己的需求使用现有模型。

对于像这样的语言模型,这涉及使用预学嵌入。嵌套背后的理念是将字词转换为数字,整个正文中的每个字词都对应一个数字。“嵌入”是一种向量,通过确定字词的“方向”,确定该字词的情感。 例如,垃圾评论消息中常用的字词最终会使其向量指向类似方向,而不常使用的字词将指向相反的方向。

使用预学的嵌入,您可以从大量从大量文本中学习到的词语(或语料库)着手。与从零开始的解决方案相比,这将使您更快地找到解决方案。

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 参数或序列长度

将字词转换为数字(或词法单元)时,一个句子就会成为这些词法单元的序列。因此,您的模型将接受训练(在本例中为)对具有 20 个词法单元的句子进行分类和识别。如果句子长度超过此值,则会被截断。如果短,则填充内边距。您将在用于此分类的语料库中看到专用的 <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 文件后,您会看到每行只有 2 个值,这些值在文件的第一行中会带有文字说明。通常,每个条目都会被视为一个列。

您会看到第一列的描述符是 commenttext,每行中的第一个条目是注释的文本。同样,第二列的描述符是 spam,每行上的第二个条目是 TrueFalse,,用于表明该文本是否被视为垃圾评论。其他属性可设置您之前创建的 model_spec 以及分隔符,在本例中为逗号分隔文件。您将使用此数据训练模型,因此 is_Training 会设置为 True

您需要保留一部分数据,以便测试模型。将数据拆分,其中 90% 用于训练,其余 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

到第 50 个周期时,该模型报告的准确性要高得多。在本例中显示 99%!

右侧会显示验证准确率数据。这些预测值通常略低于训练准确率,因为它们表明模型如何对之前未见过的数据进行分类。它使用的是我们之前预留的 10% 测试数据。

5be7967ec70e4302.png

8. 导出模型

训练完成后,您可以导出模型。

TensorFlow 以自己的格式训练模型,这需要转换为 TFLITE 格式才能在移动应用内使用。 Model Maker 可为您处理这种复杂性。

只需导出模型,然后指定目录即可:

model.export(export_dir='/mm_spam')

在该目录中,您会看到一个 model.tflite 文件。下载。在下一个 Codelab 中,您需要将其添加到 Android 应用中!

iOS 注意事项

您刚刚导出的 .tflite 模型非常适合 Android,因为其中嵌入了该模型的元数据,并且 Android Studio 可以读取这些元数据。

此元数据非常重要,因为它包含代表模型识别字词的词法单元的字典。还记得前面您知道单词会变成词法单元吗?然后,系统会用这些词法单元来为其情感指定向量。 您的移动应用需要知道这些令牌。例如,如果将“dog”标记化为 42,并且您的用户将“dog”输入到一个句子中,则您的应用需要将“dog”转换为 42,以便模型能够理解。作为 Android 开发者,您将获得一个“TensorFlow Lite Task 库” Model Maker 可以通过指定 export_format 参数来为您导出这些数据。因此,如需获取模型的标签和词汇表,您可以使用以下代码:

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

9. 恭喜

此 Codelab 将引导您构建 Python 代码以构建和导出模型。该文件末尾会包含 .tflite 文件。

在下一个 Codelab 中,您将了解如何修改 Android 应用以使用此模型,以便开始对垃圾评论进行分类。