記事

テキスト分類モデルの作成

自然言語テキストを分類する機械学習モデルをトレーニングします。

概要

テキスト分類は、自然言語テキスト内のパターン(文によって表現される感情など)を認識するようにトレーニングされた機械学習モデルです。

テキスト文字列がどのようにラベルにマッピングされるかを表す図。

テキスト分類をトレーニングするには、すでにラベル付けをしたテキストのサンプルを多数見せます。例えば、ポジティブ、ネガティブ、ニュートラルとしてすでにラベル付けした映画の批評などを見せます。

トレーニングデータを使ってCreate MLでテキスト分類をトレーニングする方法を示す図。

データのインポート

まずテキストデータを収集し、MLDataTable(英語)インスタンスにインポートします。データテーブルは、JSON形式およびCSV形式から作成できます。また、テキストデータがファイルの集まりである場合は、フォルダ名をラベルとして使用し、ファイルをフォルダに分別します。画像分類モデルの作成で使用した画像データソースの場合と同じです。

例として、感情別に分類した映画の批評を含む、JSONファイルを考えます。各エントリには、textキーとlabelキーのペアが含まれています。それらのキーの値が、モデルのトレーニングに使用される入力サンプルです。以下のJSONスニペットには、「文」と「感情を示すラベル」のペアが 3 つ含まれています。

[
	{
		"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#>"))

この結果生成されるデータテーブルには、JSONファイルのキーから取得された2つの列、textlabelが含まれます。列の名前は任意ですが、ほかのメソッドでパラメータとして使うことになるので、意味のわかるものにしてください。

トレーニング用と評価用のデータの準備

モデルのトレーニングに使うデータは、モデルの評価に使うデータとは別のものでなければなりません。MLDataTable(英語)randomSplit(by:seed:)(英語)メソッドを使用してデータを2つのテーブルに分割し、一方をトレーニングに、もう一方をテストに使用します。トレーニング用のデータテーブルにデータの大部分を含め、テスト用のデータには残りの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(英語)プロパティのclassificationError(英語)プロパティとvalidationMetrics(英語)プロパティを使用します。

// 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モデルファイル(SentimentClassiifer.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がモデルをコンパイルし、Appで使用するためのSentimentClassifierクラスを生成します。XcodeでSentimentClassifier.mlmodelファイルを選択すると、モデルについての追加情報が表示されます。

SentimentClassifierからNatural LanguageフレームワークのNLModelを作成し、トレーニングとデプロイとの間でトークン化が一致していることを確認します。次に、predictedLabel(for:)(英語)を使って、新しいテキスト入力で予測を生成します。

import NaturalLanguage

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

関連項目

自然言語処理

struct MLTextClassifier(英語)

テキストを分類するために訓練するモデル。

struct MLWordTagger(英語)

自然言語のテキストを単語レベルで分類するために訓練するモデル。