文章

创建文本分类器模型

训练机器学习模型来对自然语言文本进行分类。

概览

文本分类器是一种机器学习模型,经过训练将能够识别自然语言文本中的规律,例如句子所表达的情绪。

此图显示了文本串如何映射到标签。

训练文本分类器的方法是向它展示大量已标记的文本示例,例如你已标记为好评、差评或中立的影评。

此图显示了如何使用训练数据,通过 Create ML 来训练文本分类器。

导入数据

首先,收集文本数据并导入到 MLDataTable (英文) 实例中。你可以从 JSON 和 CSV 格式创建数据表。如果文本数据在一系列文件里,你也可以将它们整理到文件夹中,并使用文件夹名称作为标签,类似于“创建图像分类器模型”中使用的图像数据源。

例如,假设一个 JSON 文件中包含你按情绪分类的影评。每个条目都包含 textlabel 这样一对属性。这些属性值就是用来训练模型的输入样本。下面的 JSON 段落显示了三对句子以及对应的情绪标签。


						// JSON file
						[
						    {
						        "text": "The movie was fantastic!",
						        "label": "positive"
						    }, {
						        "text": "Very boring. Fell asleep.",
						        "label": "negative"
						    }, {
						        "text": "It was just OK.",
						        "label": "neutral"
						    } ...
						]
						

在 macOS Playground 中,可以使用 MLDataTable (英文)init(contentsOf:options:) (英文) 方法来创建数据表。


						import CreateML
						
						
						let data = try MLDataTable(contentsOf: URL(fileURLWithPath: "<#/path/to/read/data.json#>"))
						

得到的数据表包含两列,分别名为 textlabel,这两列从 JSON 文件中的键派生而来。列可以使用任意名称,只要对你有意义即可,因为你会在其他方法中将列名用作参数。

准备训练和评估数据

你用于训练模型的数据必须与用来评估模型的数据有所差别。使用 MLDataTable (英文)randomSplit(by:seed:) (英文) 方法将数据拆分到两个表中,分别用于训练和测试。训练数据表会包含大部分数据,测试数据表则包含其余 10% - 20% 的数据。


						let (trainingData, testingData) = data.randomSplit(by: 0.8, seed: 5)
						

创建和训练文本分类器

使用训练数据表和列名来创建 MLTextClassifier (英文) 实例。训练便会立即开始。


						let sentimentClassifier = try MLTextClassifier(trainingData: trainingData,
						                                               textColumn: "text",
						                                               labelColumn: "label")
						

在训练期间,Create ML 会分离出一小部分训练数据,供在训练阶段用来验证模型的进度。验证数据让训练过程能够使用模型未训练过的示例来衡量模型的表现。根据验证准确性,训练算法可以调整模型内部的值,甚至能在准确性足够高时停止训练过程。由于拆分是随机的,因此每次训练模型时可能会得到不同的结果。

要了解模型在训练和验证数据时的准确度,请使用模型里 trainingMetrics (英文)validationMetrics (英文) 属性中的 classificationError (英文) 属性。


						// Training accuracy as a percentage
						let trainingAccuracy = (1.0 - sentimentClassifier.trainingMetrics.classificationError) * 100
						
						
						// Validation accuracy as a percentage
						let validationAccuracy = (1.0 - sentimentClassifier.validationMetrics.classificationError) * 100
						

评估分类器的准确性

接着,使用新的句子对经过训练的模型进行测试,评估模型的表现情况。将你的测试数据表传递到 evaluation(on:) (英文) 方法,这将返回 MLClassifierMetrics (英文) 实例。


						let evaluationMetrics = sentimentClassifier.evaluation(on: testingData)
						

要获取评估准确性,请使用所返回 MLClassifierMetrics (英文) 实例的 classificationError (英文) 属性。


						// Evaluation accuracy as a percentage
						let evaluationAccuracy = (1.0 - evaluationMetrics.classificationError) * 100
						

如果评估表现不理想,你可能需要使用更多数据重新训练或进行其他调整。有关提升模型性能的信息,请参阅“提高模型准确性”。

存储 Core ML 模型

如果你对模型表现满意,就可以存储模型以便在 App 中使用了。使用 write(to:metadata:) (英文) 方法将 Core ML 模型文件 (SentimentClassifier.mlmodel) 写入磁盘。在 MLModelMetadata (英文) 实例中提供有关模型的任何信息,例如作者、版本或描述等。


						let metadata = MLModelMetadata(author: "John Appleseed",
						                               shortDescription: "A model trained to classify movie review sentiment",
						                               version: "1.0")
						
						
						try sentimentClassifier.write(to: URL(fileURLWithPath: "<#/path/to/save/SentimentClassifier.mlmodel#>"),
						                              metadata: metadata)
						

将模型添加到 App

在 Xcode 中打开 App 后,将 SentimentClassifier.mlmodel 文件拖到导航面板中。Xcode 会编译模型并生成 SentimentClassifier 类,供你在 App 中使用。在 Xcode 中选择 SentimentClassifier.mlmodel 文件可以查看关于模型的更多信息。

在自然语言框架中,从 SentimentClassifier 创建 NLModel,确保标记化在训练和部署中是一致的。然后,使用 predictedLabel(for:) (英文) 来生成新文本输入的预测。


						import NaturalLanguage
						import CoreML
						
						
						let mlModel = try SentimentClassifier(configuration: MLModelConfiguration()).model
						        
						let sentimentPredictor = try NLModel(mlModel: mlModel)
						sentimentPredictor.predictedLabel(for: "It was the best I've ever seen!")
						

另请参阅

文本模型