Результаты Swift NSLinguisticTagger для языков, отличных от английского
В настоящее время я проверяю 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: определитель
раунд: существительное
колышки: существительное
...
Apple Inc.: Существительное
Стив Джобс: PersonalName
Apple Inc.: название организации
Но для немецкого предложения
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
умереть: OtherWord
Hitliste: OtherWord
...
Кто-нибудь пытался использовать этот класс на других языках, кроме английского, или его можно использовать только при работе с английским текстом. Я не смог найти никакой документации Apple, объясняющей языковые возможности, кроме списка языков, которые должны поддерживаться. Или я что-то не так делаю?
Любой комментарий, указывающий мне на решение, очень ценится.
Крид
0 ответов
Я не проверял вашу вышеуказанную ситуацию, но прилагаю следующее, которое я использую для разработки части речевого тегера. Он включает в себя команду 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)
}