Objective-C: NSLinguisticTagger "Нью-Йорк" против "Нью-Йорка"
Я только начал играть с NSLinguisticTagger
, основываясь на моем коде в этом блоге: NSLinguisticTagger @NSHipster.com
NSLinguisticTaggerOptions options = NSLinguisticTaggerOmitWhitespace | NSLinguisticTaggerOmitPunctuation | NSLinguisticTaggerJoinNames;
NSLinguisticTagger *tagger = [[NSLinguisticTagger alloc] initWithTagSchemes: [NSLinguisticTagger availableTagSchemesForLanguage:@"en"] options:options];
tagger.string = question;
[tagger enumerateTagsInRange:NSMakeRange(0, [question length]) scheme:NSLinguisticTagSchemeNameTypeOrLexicalClass options:options usingBlock:^(NSString *tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop) {
NSString *token = [question substringWithRange:tokenRange];
NSLog(@"%@: %@", token, tag); }];
Когда я запускаю это с помощью question = @"Weekend in New York"
, "New York"
получает помечен как PlaceName
, что отлично. Но когда я запускаю это с помощью question = @"Weekend in New York"
, "new"
получает помечен как "Adjective"
и "york"
получает помечен как PlaceName
. Есть ли способ обойти это, чтобы "New York"
и "New York"
оба помечены как PlaceName
?
Я совершенно не знаком с этой лингвистикой.
Ответы
Ответ 1
Взяв эту тему немного дальше. Правильная капитализация имени и фамилии - это требование для NSLinguisticTagger для идентификации имен.
После нескольких часов разочарования я решил создать различные тесты с прописными, строчными и заглавными словами.
NSLinguisticTagger имел разные результаты почти во всех тестах
Когда NSLinguisticTagger анализирует строку в заглавном виде, почти все существительные помечены как personalName. WTF?
Это было очень неприятно.
Урок, который я хочу поделиться, заключается в том, что NSLinguistic tagger может угадывать теги, которые он помещает на слова, но в конце концов это всего лишь грамматическая оценка слов. Оценка зависит от правильных языковых конструкций, таких как размещение слов, и является ли слово капитализированным или нет.
Я все еще нахожу это полезным классом, но мораль этой должности - "Быть правильной" .
При разборе текста иногда программисты имеют тенденцию играть с верхним и нижним кодами, чтобы упростить нашу работу. Мы все еще можем это сделать, но просто имейте в виду, что оболочка слова изменяет результаты NSLinguisticTagger.
Ответ 2
Это уже упоминалось в комментариях, но в любом случае хотелось бы указать на это. NSLinguisticTagger считает, что "Нью-Йорк" и "Нью-Йорк" разные, потому что они есть. Столица N говорит, что это собственное имя. Насколько мне известно, в NSLinguisticTagger нет ничего, что могло бы изменить это поведение.
Однако, что вы можете сделать, это полагаться на автозаполнение iOS. Просто убедитесь, что текстовое поле, в которое вводится значение, активировано автокоррекция, и оно должно автоматически корректировать "новый йорк" на "Нью-Йорк" и аналогичные случаи. Если autocorrect не поймает это, тогда я попытаюсь найти другую библиотеку для лингвистического анализа.
Retroactive autocorrect уже включен в iOS (до некоторой степени), поэтому это должно быть достаточно хорошим, чтобы исправить "новый йорк" до "Нью-Йорка". Если вы хотите исправить все предложение (т.е. "Выходные в Нью-Йорке" на "Выходные в Нью-Йорке" ), вам нужно будет реализовать эту функциональность самостоятельно. Это не должно быть ужасно трудным, так как есть несколько простых правил грамматики, за которыми вы должны следовать, и многие вещи будут подхвачены автокоррекцией.
Надеюсь, что это поможет, дайте мне знать, если вам нужна дополнительная информация.