Результаты Swift NSLinguisticTagger для языков, отличных от английского - PullRequest
0 голосов
/ 10 июня 2018

В настоящее время я проверяю NSLinguisticTagger Свифта.Для целей тестирования я использовал код из appcoda Введение в обработку естественного языка .

Для английского языка он работает, как и ожидалось, и описан в руководстве.Но когда я использую NSLinguisticTagger на языках, отличных от английского, лемматизация, части речи и распознавание именованных объектов не дают полезных результатов.Я могу понять это для Распознавания Именованных Сущностей, но для первых двух вариантов я думал, что по крайней мере основной результат должен быть возможен.Я пропустил настройку для конкретного языка или NSLinguisticTagger подходит только для обнаружения и токенизации языка при использовании для языков, отличных от английского?

Вот код, который Саи Камбампати использует в своем уроке:

import Foundation

let quote = "Here's to the crazy ones. The misfits. The rebels. The troublemakers. The round pegs in the square holes. The ones who see things differently. They're not fond of rules. And they have no respect for the status quo. You can quote them, disagree with them, glorify or vilify them. About the only thing you can't do is ignore them. Because they change things. They push the human race forward. And while some may see them as the crazy ones, we see genius. Because the people who are crazy enough to think they can change the world, are the ones who do. - Steve Jobs (Founder of Apple Inc.)"

let tagger = NSLinguisticTagger(tagSchemes:[.tokenType, .language, .lexicalClass, .nameType, .lemma], options: 0)
let options: NSLinguisticTagger.Options = [.omitPunctuation, .omitWhitespace, .joinNames]

func determineLanguage(for text: String) {
  tagger.string = text
  let language = tagger.dominantLanguage
  print("The language is \(language!)")
}

determineLanguage(for: quote)

func tokenizeText(for text: String) {
  tagger.string = text
  let range = NSRange(location: 0, length: text.utf16.count)
  tagger.enumerateTags(in: range, unit: .word, scheme: .tokenType, options: options) { tag, tokenRange, stop in
      let word = (text as NSString).substring(with: tokenRange)
      print(word)
  }
}

tokenizeText(for: quote)

func partsOfSpeech(for text: String) {
  tagger.string = text
  let range = NSRange(location: 0, length: text.utf16.count)
  tagger.enumerateTags(in: range, unit: .word, scheme: .lexicalClass, options: options) { tag, tokenRange, _ in
      if let tag = tag {
          let word = (text as NSString).substring(with: tokenRange)
          print("\(word): \(tag.rawValue)")
      }
  }
}

partsOfSpeech(for: quote)

func namedEntityRecognition(for text: String) {
  tagger.string = text
  let range = NSRange(location: 0, length: text.utf16.count)
  let tags: [NSLinguisticTag] = [.personalName, .placeName, .organizationName]
  tagger.enumerateTags(in: range, unit: .word, scheme: .nameType, options: options) { tag, tokenRange, stop in
      if let tag = tag, tags.contains(tag) {
          let name = (text as NSString).substring(with: tokenRange)
          print("\(name): \(tag.rawValue)")
      }
  }
}

namedEntityRecognition(for: quote)

Для предложения на английском языке результат в точности соответствует ожидаемому.

Например, для частей речевого тега и распознавания именованного объекта:

The: Определитель

смутьяны: Существительное

The: Определитель

round: существительное

колышки: существительное

...

Apple Inc .: существительное

Стив Джобс: PersonalName

Apple Inc .: OrganizationName

Но для предложения на немецком языке

let quote = "Apple führt die Hitliste der Silicon-Valley-Unternehmen an, bei denen sich Ingenieure das Wohnen in der Nähe nicht mehr leisten können. Dahinter folgen das Portal Reddit (San Francisco), der Suchriese Google (Mountain View) und die sozialen Netzwerke Twitter (San Francisco) und Facebook (Menlo Park)"

только правильное определение языка и токенизация работают.Для частей речевого тега только «OtherWord» и для распознавания именованного субъекта результат не возвращается вообще:

Apple: OtherWord

führt: OtherWord

die: OtherWord

Hitliste: OtherWord

...

Кто-нибудь пытался использовать этот класс на других языках, кроме английского, или он серьезно применим только при работе с текстом на английском языке.Я не смог найти никакой документации Apple, объясняющей языковые возможности, кроме списка языков, которые должны поддерживаться.Или я что-то не так делаю?

Любой комментарий, указывающий мне на решение, приветствуется.

Крид

1 Ответ

0 голосов
/ 07 марта 2019

Я не проверял вашу вышеуказанную ситуацию, но прилагаю следующее, которое я использую для разработки части речевого тегера.Он включает в себя команду setLanguage и команду setOthography.(С последним я еще не экспериментировал).

Насколько я понимаю, тегер должен распознавать язык и переключать языки, если это необходимо, или его можно установить.Похоже, используемая здесь логика раскрыта не полностью.Я решил, что моя лучшая практика - установить язык, если смогу.В этом коде язык хранится как строковый язык.(Кстати, в моем случае это сделано путем прочтения большого документа, который также доступен.)

Наконец, у меня был шанс увидеть это в действии на этой неделе.Я был в магазине Apple (в США) по другому вопросу и заметил, что другой клиент тестирует телефон и обсуждает желание отправлять сообщения на французском языке.Технология продемонстрировала, что если iMessage продолжит видеть французский, он начнет понимать.Моя мысль, наблюдая за этим, заключается в том, что это сработало, но было бы лучше, если бы переключение могло быть выполнено извне, если это возможно.

    if let language = language {
    // If language has a value, it is taken as a specification for the language of the text and set on the tagger.
    let orthography = NSOrthography.defaultOrthography(forLanguage: language)
    POStagger.setOrthography(orthography, range: range)
    POStagger.setLanguage(NLLanguage(rawValue: language), range: range)
}
...