2013-02-18 11 views
18

Ho appena iniziato a giocare con NSLinguisticTagger basando il mio codice su questo blog: NSLinguisticTagger @ NSHipster.comObjective-C: NSLinguisticTagger "New York" vs "New York"

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); }]; 

Quando eseguo questo con question = @"Weekend in New York", "New York" ottiene etichettato come PlaceName che è fantastico. Ma quando eseguo questo con question = @"Weekend in new york", "new" viene taggato come "Adjective" e "york" viene contrassegnato come PlaceName. C'è un modo per aggirare questo in modo tale che "New York" e "new york" vengono entrambi etichettati come PlaceName?

Sono assolutamente nuovo a questa cosa della linguistica.

+0

"Weekend a New York" e "Weekend a New York" in realtà ha 2 significati diversi (York è anche una città). Il Tagger sceglie quello che pensa sia giusto quando usa "Weekend in new york". Probabilmente la soluzione migliore è correggere l'ortografia, se possibile. – Daniel

+2

questo non è possibile, da un punto di vista grammaticale "new york" e "New York" sono completamente diversi – tkanzakic

+0

C'è un modo per applicare retroattivamente il commento automatico a una stringa? Ad esempio, se digito "week end a new york" su un dispositivo, verrà automaticamente eseguita la correzione in "Weekend a New York" quando toccherò la barra spaziatrice dopo "york". –

risposta

2

Questo è già stato menzionato nei commenti, ma volevo farlo notare comunque. NSLinguisticTagger crede che "New York" e "New York" siano diversi, perché lo sono. La capitale N dice che è un nome proprio. Per quanto ne so, non c'è nulla in NSLinguisticTagger che possa modificare questo comportamento.

Tuttavia, ciò che si può fare è fare affidamento su iOS. Assicurati solo che il campo di testo in cui viene inserito il valore abbia la correzione automatica abilitata e che corregga automaticamente "new york" in "New York" e ricorrenze simili. Se la correzione automatica non cattura questo, allora proverei a trovare qualche altra libreria per l'analisi linguistica.

La correzione automatica retroattiva è già inclusa in iOS (in una certa misura), pertanto dovrebbe essere sufficiente per correggere "new york" in "New York". Se si desidera correggere l'intera frase (ad esempio "Weekend a New York" a "Weekend a New York"), è necessario implementare tale funzionalità autonomamente. Questo non dovrebbe essere terribilmente difficile, in quanto ci sono solo alcune semplici regole grammaticali da seguire, e molte cose verranno selezionate automaticamente.

Spero che questo aiuti, fammi sapere se hai bisogno di ulteriori informazioni.

3

Riprendendo questo argomento un po 'oltre. La corretta capitalizzazione del nome e del cognome è un requisito per NSLinguisticTagger per identificare i nomi.

Dopo diverse ore di frustrazione, ho deciso di creare vari test con parole maiuscole, minuscole e maiuscole.

Il NSLinguisticTagger avevano risultati diversi in quasi tutti i test

Quando il NSLinguisticTagger analizza una stringa in maiuscolo caso quasi tutti i sostantivi vengono contrassegnati come personalname. WTF?

Era molto frustrante.

La lezione che voglio condividere è che il tagger NSLinguistic può indovinare i tag posti sulle parole, ma alla fine è solo una valutazione grammaticale delle parole. La valutazione dipende da costrutti linguistici appropriati come il posizionamento delle parole e se la parola è maiuscola o meno.

Sto ancora trovando una classe utile, ma la morale di questo post è di "Essere corretto".

Quando analizziamo il testo a volte, i programmatori tendono a giocare con maiuscole e minuscole per semplificare il nostro lavoro. Possiamo ancora fare questo, ma tieni a mente che il word case cambia i risultati di NSLinguisticTagger.