Подтвердить что ты не робот

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?

Я совершенно не знаком с этой лингвистикой.

4b9b3361

Ответ 1

Взяв эту тему немного дальше. Правильная капитализация имени и фамилии - это требование для NSLinguisticTagger для идентификации имен.

После нескольких часов разочарования я решил создать различные тесты с прописными, строчными и заглавными словами.

NSLinguisticTagger имел разные результаты почти во всех тестах

Когда NSLinguisticTagger анализирует строку в заглавном виде, почти все существительные помечены как personalName. WTF?

Это было очень неприятно.

Урок, который я хочу поделиться, заключается в том, что NSLinguistic tagger может угадывать теги, которые он помещает на слова, но в конце концов это всего лишь грамматическая оценка слов. Оценка зависит от правильных языковых конструкций, таких как размещение слов, и является ли слово капитализированным или нет.

Я все еще нахожу это полезным классом, но мораль этой должности - "Быть ​​правильной" .

При разборе текста иногда программисты имеют тенденцию играть с верхним и нижним кодами, чтобы упростить нашу работу. Мы все еще можем это сделать, но просто имейте в виду, что оболочка слова изменяет результаты NSLinguisticTagger.

Ответ 2

Это уже упоминалось в комментариях, но в любом случае хотелось бы указать на это. NSLinguisticTagger считает, что "Нью-Йорк" и "Нью-Йорк" разные, потому что они есть. Столица N говорит, что это собственное имя. Насколько мне известно, в NSLinguisticTagger нет ничего, что могло бы изменить это поведение.

Однако, что вы можете сделать, это полагаться на автозаполнение iOS. Просто убедитесь, что текстовое поле, в которое вводится значение, активировано автокоррекция, и оно должно автоматически корректировать "новый йорк" на "Нью-Йорк" и аналогичные случаи. Если autocorrect не поймает это, тогда я попытаюсь найти другую библиотеку для лингвистического анализа.

Retroactive autocorrect уже включен в iOS (до некоторой степени), поэтому это должно быть достаточно хорошим, чтобы исправить "новый йорк" до "Нью-Йорка". Если вы хотите исправить все предложение (т.е. "Выходные в Нью-Йорке" на "Выходные в Нью-Йорке" ), вам нужно будет реализовать эту функциональность самостоятельно. Это не должно быть ужасно трудным, так как есть несколько простых правил грамматики, за которыми вы должны следовать, и многие вещи будут подхвачены автокоррекцией.

Надеюсь, что это поможет, дайте мне знать, если вам нужна дополнительная информация.