ドキュメント

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

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

概要

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

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

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

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

データのインポート

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

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


						// 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#>"))
						

この結果生成されるデータテーブルには、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(英語)プロパティと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がモデルをコンパイルし、Appで使用するためのSentimentClassifierクラスを生成します。XcodeでSentimentClassifier.mlmodelファイルを選択すると、モデルについての追加情報が表示されます。

SentimentClassifierからNatural Languageフレームワークの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!")
						

関連項目

テキストモデル