Более одного целевого столбца в MLDataTable - платформа CreateML в Swift

Я хочу создать MLDataTable с одной функцией и тремя целями, используя каркас Create ML. Например, давайте предположим, что я создаю приложение календаря, в котором есть функция добавления быстрого события, например приложение "Календарь Native Mac". У меня есть текст колонки, которая содержит строки, такие как клубная игра на стадионе Неру в Ченнае в субботу утром. Я хочу, чтобы три целевых столбца заголовок, место и время, чтобы получить значения клуба игры, Стадион им. Неру, Ченнаи и 24 ноября 2018 года, 08:00.

Также, пожалуйста, дайте мне знать, если есть какие-либо другие способы реализовать то же самое с помощью среды CreateML.

0 ответов

Вы можете обучить MLWordTagger для этой задачи. Создайте файл данных тренировки (JSON) в этом формате.

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

  ]

Вы можете тренироваться с кодом ниже на игровой площадке.

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
Другие вопросы по тегам