Как определить часть речи слова в NSString?

Приложение, над которым я сейчас работаю, требует, чтобы я определял часть речи слова в NSString.

Итак, есть ли библиотека/база данных/класс, к которым вы можете получить доступ в Objective C, который позволяет проверить, является ли одно слово (в форме NSString) существительным, прилагательным, наречием или глаголом?

Что-то вроде:

NSString *foo="cat";

if ([foo wordIsNoun]) {
    //do something
};

Аналогичная, но немного не связанная с этим заметка: можно ли проверить, имеют ли два NSString глагола с одной и той же основой, но разным временем (спрашивать, спрашивать, спрашивать и т. д.) одну и ту же основу? Тоже было бы очень полезно.


person Charles    schedule 06.02.2012    source источник
comment
эм... вау. База уже есть? Или вы сами пишете инструмент для языкового анализа? Это чудовищная задача, кстати.   -  person Almo    schedule 07.02.2012
comment
@Almo определенно чудовищная задача ... если только кто-то уже не сделал это за вас! :)   -  person Dave DeLong    schedule 07.02.2012


Ответы (1)


Вы можете сделать это с помощью NSLinguisticTagger! Я никогда не использовал его раньше, но я взломал это вместе:

NSString *str = @"i have a cat";

NSLinguisticTagger *tagger = [[NSLinguisticTagger alloc] initWithTagSchemes:[NSArray arrayWithObject:NSLinguisticTagSchemeLexicalClass] options:~NSLinguisticTaggerOmitWords];
[tagger setString:str];
[tagger enumerateTagsInRange:NSMakeRange(0, [str length]) 
                      scheme:NSLinguisticTagSchemeLexicalClass 
                     options:~NSLinguisticTaggerOmitWords 
                  usingBlock:^(NSString *tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop) {
                               NSLog(@"found: %@ (%@)", [str substringWithRange:tokenRange], tag);
                              }];
[tagger release];

Когда вы запускаете это, он регистрирует:

found: i (Pronoun)
found: have (Verb)
found: a (Determiner)
found: cat (Noun)

Обратите внимание, однако, что NSLinguisticTagger доступен только на iOS 5+ (и Mac OS X 10.7+).

person Dave DeLong    schedule 06.02.2012
comment
Вау. Спасибо. Могу поспорить, что в iOS такого не было. Я удивлен. - person arnaud del.; 07.02.2012
comment
@arnauddel. да, довольно аккуратно! Я еще не нашел вескую причину использовать его, но, возможно, в конце концов. - person Dave DeLong; 07.02.2012
comment
Спасибо! Это как раз то, что мне было нужно! - person Charles; 07.02.2012
comment
@DaveDeLong - я написал главу о NSLinguisticTagger в книге iOS5 by Tutorials, позвольте мне просто предупредить вас, что в iOS5 он работает только для английского языка (с запланированными немецким и французским языками). Что более раздражает, так это то, что для таких предложений, как у меня есть кошка, он возвращает довольно хорошие результаты, но с вводом, который я использовал, он с треском провалился, поэтому не рассчитывайте на него, если вам нужны 100% точные результаты. - person Marin Todorov; 10.02.2012
comment
Вы даже можете использовать NSLinguisticTagger для выделения синтаксиса англоязычного текста. Я сделал пример с открытым исходным кодом , который вы можете использовать. - person adib; 28.02.2013
comment
Как и в случае с любым POS-теггером, результаты во многом зависят от введенного текста. Например, если вы попытаетесь пометить инструкции рецепта, у любого создателя тегов возникнут трудности с начальными глаголами предложения (Готовить до коричневого цвета) и вместо этого они будут помечены как существительные. Ожидаемая производительность на общих текстах должна быть около 95% или около того. Это максимум, чего можно достичь в наши дни. - person Oliver Mason; 30.08.2013
comment
У меня похожая проблема stackoverflow.com/questions/24402415/, было бы здорово, если бы вы могли помочь с - person Ab'initio; 25.06.2014
comment
Блок завершения? Я пытаюсь проверить, выполнено ли перечисление, глядя на диапазон, но если входное предложение имеет конечные пробелы, мое условное выражение терпит неудачу. - person Albert Renshaw; 03.02.2018
comment
Мысли @DaveDeLong? stackoverflow.com/questions/48768919/ физические устройства не работают, не знаю, почему нельзя найти лексический класс... - person Will Von Ullrich; 18.02.2018