struct MLTextClassifier (英語)
struct MLWordTagger (英語)
struct MLGazetteer(英語)
struct MLWordEmbedding (英語)
テキスト分類は、自然言語テキスト内のパターン(文によって表現される感情など)を認識するようにトレーニングされた機械学習モデルです。
テキスト分類をトレーニングするには、すでにラベル付けをしたテキストのサンプルを多数見せます。たとえば、ポジティブ、ネガティブ、ニュートラルとしてすでにラベル付けした映画のレビューのサンプルなどです。
まずテキストデータを収集し、 MLData
(英語)インスタンスにインポートします。データテーブルは、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で、MLData
(英語)のinit(contents
(英語)メソッドを使用してデータテーブルを作成します。
import CreateML
let data = try MLDataTable(contentsOf: URL(fileURLWithPath: "<#/path/to/read/data.json#>"))
この結果生成されるデータテーブルには、JSONファイルのキーから取得された2つの列、textとlabelが含まれます。列の名前は任意ですが、ほかのメソッドでパラメータとして使うことになるので、意味のわかるものにしてください。
モデルのトレーニングに使うデータは、モデルの評価に使うデータとは別のものでなければなりません。MLData
(英語)のrandom
(英語)メソッドを使用してデータを2つのテーブルに分割し、一方をトレーニングに、もう一方をテストに使用します。トレーニング用のデータテーブルにデータの大部分を含め、テスト用のデータには残りの10~20パーセントを含めます。
let (trainingData, testingData) = data.randomSplit(by: 0.8, seed: 5)
トレーニングデータのテーブルと列の名前を使って、MLText
(英語)のインスタンスを作成します。トレーニングはすぐに始まります。
let sentimentClassifier = try MLTextClassifier(trainingData: trainingData,
textColumn: "text",
labelColumn: "label")
トレーニング中、Create MLはトレーニングデータのごく一部を別にしておき、これを使ってトレーニングフェーズ中にモデルの学習状況を検証します。検証データによって、トレーニングされていないサンプルにおけるモデルのパフォーマンスをトレーニングプロセスが測定することができます。検証の精度に応じて、トレーニングアルゴリズムは、モデル内の値を調整したり、精度が十分であればトレーニングプロセスを終了したりします。分割はランダムに行われるため、モデルをトレーニングするたびに異なる結果になる場合があります。
トレーニングデータと検証データでモデルがどれだけ正確に実行したかを確認するには、モデルのtraining
(英語)プロパティとvalidation
(英語)プロパティのclassification
(英語)プロパティを使用します。
// 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:)
(英語)メソッドに渡すと、MLClassifier
(英語)インスタンスが返されます。
let evaluationMetrics = sentimentClassifier.evaluation(on: testingData)
評価の精度を得るには、返されたMLClassifier
(英語)インスタンスのclassification
(英語)プロパティを使います。
// Evaluation accuracy as a percentage
let evaluationAccuracy = (1.0 - evaluationMetrics.classificationError) * 100
評価のパフォーマンスが不十分な場合は、より多くのデータで再トレーニングを行うか、別の方法で調整する必要があります。モデルのパフォーマンスを高める方法については、モデルの精度の向上を参照してください。
モデルのパフォーマンスが十分になったら、アプリで使えるように保存します。write(to:
(英語)メソッドを使用してCore MLモデルファイル(Sentiment
)をディスクに書き込みます。作者、バージョン、説明など、モデルに関する情報があればMLModel
(英語)インスタンスで提供します。
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)
Xcodeでアプリを開いた状態で、Sentiment
ファイルをナビゲーションペインにドラッグします。Xcodeがモデルをコンパイルし、アプリで使用するためのSentiment
クラスを生成します。XcodeでSentiment
ファイルを選択すると、モデルについての追加情報が表示されます。
Sentiment
からNatural LanguageフレームワークのNLModel
を作成し、トレーニングとデプロイとの間でトークン化が一致していることを確認します。次に、predicted
(英語)を使って、新しいテキスト入力で予測を生成します。
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!")
struct MLTextClassifier (英語)
struct MLWordTagger (英語)
struct MLGazetteer(英語)
struct MLWordEmbedding (英語)