Идентификация имен людей с помощью NSLinguisticTagger

Я возиться с NSLinguisticTagger.

Идентификация основных типов слов, таких как существительное, глагол, предлоги, работает очень хорошо.

Однако распознавание имен людей NSLinguisticTagPersonalName вряд ли работает в моих тестах (iOS8). Места NSLinguisticTagPlaceName также, кажется, работают довольно хорошо, однако в большинстве случаев имена людей также классифицируются как места.

Вот мои основные настройки (используя NSLinguisticTagSchemeNameTypeOrLexicalClass)

    var tagger:NSLinguisticTagger = NSLinguisticTagger(tagSchemes: NSLinguisticTagger.availableTagSchemesForLanguage("en") , options: 3)
    tagger.string = entryString
    tagger.enumerateTagsInRange(NSMakeRange(0, entryString.length), scheme: NSLinguisticTagSchemeNameTypeOrLexicalClass, options: (NSLinguisticTaggerOptions.OmitWhitespace | NSLinguisticTaggerOptions.JoinNames), usingBlock: {
        tag,tokenRange,sentenceRange,_ in
        let token = entryString.substringWithRange(tokenRange)
        println("[\(tag)] \(token) \(tokenRange)")

Пример 1

 "Meeting with John in Paris"

  Evaluation

 [Verb] Meeting
 [Preposition] with
 [Noun] John
 [Preposition] in
 [PlaceName] Paris

Пример 2

 "Meeting with John"

  Evaluation

 [Verb] Meeting (0,7)
 [Preposition] with (8,4)
 [PlaceName] John (13,4)

Любая идея, как я мог бы улучшить сопоставление имен людей?

Также мне было бы интересно узнать, как должно появиться имя, чтобы быть узнаваемым. (Я предположил, например, что предлог типа "с" будет хорошим индикатором… очевидно, этого недостаточно). Буду признателен за любые идеи или дополнительные идеи по этому вопросу. Это захватывающее поле.

1 ответ

Решение

Видимо, правильный ответ таков: "Подождите несколько лет, пока Apple улучшит NSLinguisticTagger в Swift 4 ".

Вот код Swift 4, написанный и выполненный в Xcode 9 (бета):

let entryString = "Meeting with John"

let schemes = NSLinguisticTagger.availableTagSchemes(forLanguage: "en")
let options: NSLinguisticTagger.Options = [
    .omitWhitespace, .omitPunctuation, .joinNames
]

let tagger = NSLinguisticTagger(tagSchemes: schemes, options: Int(options.rawValue))
tagger.string = entryString

let rangeOfEntireEntryString = NSRange(location: 0, length: entryString.utf16.count)

tagger.enumerateTags(
    in: rangeOfEntireEntryString,
    scheme: .nameTypeOrLexicalClass,
    options: options)
{ (tag, tokenRange, sentenceRange, _) in
    guard let tag = tag?.rawValue else { return }
    let token = (entryString as NSString).substring(with: tokenRange)
    print("[\(tag)] \(token) \(tokenRange)")
}

и вот результаты с вашей первой примерной строкой:

let entryString = "Meeting with John in Paris"

[Noun] Meeting {0, 7}
[Preposition] with {8, 4}
[PersonalName] John {13, 4}
[Preposition] in {18, 2}
[PlaceName] Paris {21, 5}

и ваш второй пример строки:

let entryString = "Meeting with John"

[Noun] Meeting {0, 7}
[Preposition] with {8, 4}
[PersonalName] John {13, 4}
Другие вопросы по тегам