Apple a jazyk

7. 4. 2012 22:43 zboj

Cocoa v OS X 10.7 (Lion) a iOS 5 obsahuje velice zajímavou třídu: NSLinguisticTagger. Co to je tagger? Agentivní substantivum od to tag, kteréžto sloveso je odvozené od substantiva tag, jež znamená „značka“. V kontextu zpracování přirozeného jazyka můžeme méně krkolomně napsat, že se jedná o komponentu, jež morfologicky analyzuje (a zpravidla zjednoznačňuje) text.

Mějme například tento vstup:

NSString* text = @"The girl reads books.";

Obvyklým způsobem můžeme získat instanci taggeru:

NSLinguisticTagger* tagger = [[[NSLinguisticTagger alloc] initWithTagSchemes: [NSArray arrayWithObject: NSLinguisticTagSchemeNameTypeOrLexicalClass] options: 0] autorelease];

Použití je velmi jednoduché:

[tagger setString: text]; [tagger enumerateTagsInRange: NSMakeRange(0, [text length]) scheme: NSLinguisticTagSchemeNameTypeOrLexicalClass options: 0 usingBlock: ^(NSString* tag, NSRange tokenRange, NSRange sentenceRange, BOOL* stop) { if ([tag isEqualToString: NSLinguisticTagWhitespace] == NO) { NSLog(@"%@ %@", [text substringWithRange: tokenRange], tag); } }];

Výsledkem bude toto:

The Determiner girl Noun reads Verb books Noun . SentenceTerminator

Samotné POS tagy (POS=part of speech, tedy slovní druh) pocházejí z primitivní databáze. Mnohem složitější je ale zjednoznačnění. Zkuste například tento text:

NSString* text = @"The flight he books.";

Zcela v souladu s anglickou gramatikou dostaneme pro slovo books nyní „books Verb“. Možná vám to přijde samozřejmé, ale algoritmy pro tagger jsou velmi složité, buď jde o nějaký typ unifikační gramatiky, nebo o HMM (Hidden Markov Model) založený obvykle na trigramech vzatých z ručně anotovaného korpusu. Obvyklejší je asi použití HMM, neboť se dá vyvinout rychleji (stačí nějaký dostatečně velký anotovaný korpus). Přiřazení tagů slovům se provede Viterbiho algoritmem.

Pro většinu úloh je sice tato třída nedostatečná (dává jen POS, ne další většinou nezbytné informace o morfologii), ale pro základní hraní třeba s bezkontextovými gramatikami postačuje.

NB: Pokud vás zajímají všechny možné tagy pro dané slovo, můžete použít metodu possibleTagsAtIndex.

Sdílet