более одного целевого столбца в MLDataTable - среда CreateML в Swift - PullRequest
0 голосов
/ 18 ноября 2018

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

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

1 Ответ

0 голосов
/ 09 декабря 2018

Вы можете обучить 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
...