В настоящее время я проверяю 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, объясняющей языковые возможности, кроме списка языков, которые должны поддерживаться.Или я что-то не так делаю?
Любой комментарий, указывающий мне на решение, приветствуется.
Крид