2021年02月04日

CoreMLでテキストを分類するアプリを作る (3)

さらに続きます。
macOS 11.0 Big Surからは、テキスト分類の機能が拡張され、複数の結果を配列で出力する命令が追加されました。つまり、
["晴れ": 0.80, "曇り": 0.12, "雨": 0.01]
のような結果が得られるわけです。
predictedLabelのかわりにpredictedLabelHypothesesという命令を使うのですが、Xcodeにこの命令を記述すると、Big Surが必要だから、そのように記述するか、if文で環境を切り分けるようにと注意されます。今回はif文を使うことを選択すると、自動的にifで区切ってそれらしき記述を組み立ててくれます。親切なEditorですね。
得られたデータを全て表示するために、それぞれの確立を%表示にして付記して、可能性が高い順に並べて表示しましょう。帰ってくる結果が0の場合は処理しないようにswitch ~しておきます。配列を数値にの大きさでソートして、for ~ in ~で要素ごとに回して結果の文字列を組み立てていきます。Swiftは配列の要素の順番が固定されないということなので、ソートした結果をlet ~で定数に入れて固定します(この理解でいいかどうかよくわからない)。文字列の組み立ては同じ変数に追加していくのでvar ~を使います。第1回ではわからなかったletとvarの違いがわかってきました(笑)。
さらに数値の計算、整数への丸め、文字列への変換、改行の記述方法などをググりながら記述していきます。様々なドキュメントを残してくれた先人たちに感謝です。
@IBAction func getCategory(_ sender: Any) {
do {
let config = MLModelConfiguration()
let mlModel = try myModel(configuration: config).model
let nlModel = try! NLModel(mlModel: mlModel)
if #available(OSX 11.0, *) {
let hypothhesis = nlModel.predictedLabelHypotheses(for: myInput.stringValue, maximumCount: 3)//上位3位の確率を出します
let pList = hypothhesis.sorted{ $0.value > $1.value }
switch hypothhesis.count {
case 0:
myResult.stringValue = "該当なし"
default:
var msg = ""
for value in pList {
msg = msg + "\(value.key): " + String(Int((value.value) * 100)) + "%\n"
}
myResult.stringValue = msg
}
} else {
let label = nlModel.predictedLabel(for: myInput.stringValue)
myResult.stringValue = label!//型変換している
}
} catch {
myResult.stringValue = error.localizedDescription
}
}

すごくアプリケーションらしくなってきました。しかも、MLモデルを入れ替えるだけで様々な分類に用いることができる汎用性が高いプログラムになっています。
posted by MacLab. at 21:41| Comment(0) | TrackBack(0) | 技術情報
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/188373224
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック