MLDataTable中的多个目标列-Swift中的CreateML框架

时间:2018-11-18 04:53:26

标签: swift machine-learning createml

我想使用Create ML框架创建具有一个功能和三个目标的MLDataTable。 例如,假设我们正在创建一个日历应用程序,该应用程序具有添加快速事件的功能,例如Native Mac Calendar应用程序。 我有一个功能列 text ,其中包含类似周六上午在钦奈的尼赫鲁球场的俱乐部比赛这样的字符串。我希望三个目标列 title location time 获得值 Club game Nehru钦奈体育场 2018年11月24日,08:00

另外,请告诉我是否还有其他方法可以使用CreateML框架实现相同的功能。

1 个答案:

答案 0 :(得分:0)

您可以为此任务训练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