首页 > 解决方案 > MLDataTable 中的多个目标列 - Swift 中的 CreateML 框架

问题描述

我想使用 Create ML 框架创建一个具有一个功能和三个目标的 MLDataTable。例如,假设我正在创建一个日历应用程序,该应用程序具有添加快速事件的功能,例如本机 Mac 日历应用程序。我有一个专题栏文本,其中包含诸如周六早上钦奈尼赫鲁体育场的俱乐部比赛之类的字符串。我想要三个目标列titlelocationtime来获得Club game , Nehru Stadium, Chennai24 Nov 2018, 08:00的值。

另外,请让我知道是否有任何其他方法可以使用 CreateML 框架实现相同的功能。

标签: swiftmachine-learningcreateml

解决方案


您可以为此任务训练MLWordTagger 。以这种格式创建一个训练数据文件 (JSON)。

[
    {
      "tokens": [
        "Club game",
        "at",
        "Nehru Stadium Chennai",
        "on",
        "Saturday Morning"
      ],
      "labels": [
        "TITLE",
        "NONE",
        "LOCATION",
        "NONE",
        "TIME"
      ]
    },
    ... other sample records...

  ]

您可以在 Playground 中使用以下代码进行训练。

var trainingData = try MLDataTable(contentsOf: URL(fileURLWithPath: "/pathto..train.json"))

let model = try! MLWordTagger(trainingData: trainingData, tokenColumn: "tokens", labelColumn: "labels")

然后使用这种预测方法来预测句子中的每个标记。

func prediction(from tokens: [MLWordTagger.Token]) throws -> [String]

此方法返回标记的标签数组。

另一种方法是使用 NLTagger,它已经能够检测地名、组织名称但时间。

import NaturalLanguage

let text = "Club game at Nehru Stadium, Chennai on Saturday Morning."
let tagger = NLTagger(tagSchemes: [.nameType])
tagger.string = text
let options: NLTagger.Options = [.omitPunctuation, .omitWhitespace, .joinNames]
let tags: [NLTag] = [.personalName, .placeName, .organizationName]
tagger.enumerateTags(in: text.startIndex..<text.endIndex, unit: .word, scheme: .nameType, options: options) { tag, tokenRange in
    if let tag = tag, tags.contains(tag) {
        print("\(text[tokenRange]): \(tag.rawValue)")
    }
    return true
} 

这将返回下面的输出,因此您只需要训练模型来检测时间副词。

Nehru Stadium: PlaceName
Chennai: OrganizationName

推荐阅读