Natural Language Toolkit i prezentace do p edm tu PA154 Nástroje pro korpusy část 1 - možnosti NLTK Strana charakteristika NLTK je sada knihoven pro Python a program pro symbolické a statistické zpracování přirozeného jazyka k dispozici j sou - zdroj ové kódy - dokumentace - tutoriály NLTKje určeno pro studenty zpracování přirozeného jazyka pro podporu výzkumu souvisejících oblastí, nap íklad: - empirická ligvistika (korpusy) - kongitivní vědy - um lá inteligence, strojové učení - vyhledávání znalostí Motivační příklad 1 nltklite.draw.rdparser Recursive Descent Parser Demo DEJE3 Ukázka rekurzivní sestupné analýzy shora dol File Edit Apply View Animate Help Available Expansions fc S ->NP VP NP -> Det N PP NP -> Det N VP->VNP PP VP->VNP VP->V pp_;>PNP NP->'ľ Det -> 'the' Det -> 'a' N -> 'man' V -> 'saw' P -> 'in' (TRIED) NP Det N VP N -> 'park' P -> 'with' PP /\ P NP the dog the dog saw a man in the park ^l. J, \x Last Op g ration: Backtrack Step Autostep I Expand Match Backtrack Motivační příklad 2 nltkjite.draw.srparser ™if^'»w*i"ť DemoDEÍG File Edít Apply View Animate Help Ukázka posuvn reduĚní analýzy zdola nahoru Available Reductions 1 S->NP VP NP -> Det N NP->NPPP VP->VPPP VP->VNPPP VP->VNP PP->PNP NP->'ľ Det -> 'the' Det -> 'a' N -> 'man' Stack NP /V Det N I I my dog V Dat man -I I saw a V -> 'saw' P->'in' P -> 'with' N -> 'park' N ->'dog' N -> 'statue' Det -> 'my' Remaining Text \x in the park with a statue FI Last Operation: Reduce: N -> 'man' Step Shift Reduce Undo Motivační příklad 3 nltk lite.draw.chart Analýza zdola nahoru může najít jen jedno vyhodnocení, n kdy nenalezne existujcí řeš ení Analýza shora dol může být znaně neefektivní (pro LR gramatiky může cyklit) ešíme znovuužitím výpočtů (dynamické programování) -> chart parsing Motivační příklad 3 nltk lite.draw.chart Ukázka tabulková analýza 'John' John Sohn' lite' Chart Parsing DemoDiQ File Edit Apply Animate Zoom Help 'ate' ate Pet -rmy' Det my Det my • NP Tuet N NP "ľftppp "•Tip VP NP Det« N NP 'cookie' 4G: cookie 'A • cookie' 'cookie' Last edge generated by: IFundamental Rule Top Down Bottom Up Top Down Init Top down Bottom Up Init Strategy Strategy Rule Rule Rule W Step Fundamental Rule Motivační příklad 3 nltk lite.draw.chart Můžeme uložit jakoukoli hypotézu kompatibilní s gramatikou (ale nemusíme ji potom využít) Každá hypotéza reprezentována hranou NLTK - lite vývoj: červen - prosinec 2005 od prosince 2005 je to jediná podporovaná verze, proto se budeme zabývat právě j í stejná funkčnost jako klasické NLTK. avšak s nižšími nároky na programátora (používá standardní objekty Pythonu, atd.) Auto i a licence auto i: Steven Bird, Edward Loper mnoho p isp vatel licence: projekt je open source bez záruky GNU General Public License - dokumentace Creative Commons Attribution-Share Alike 2.5 License OpenNLP ů organizační centrum projekt zabývajících se zpracování přirozeného jazyka soust e uje - projekty - užitěné odkazy - diskuzní fórum http ://opennlp. sourceforge.net/ Instalace (1) Instalace vyžaduje Python 2.4 a vyšší Platformy - Linux - Mac - Windows Instalace (2) 1) Python http://www.python.org/download/ 2) Numerical Python (Numarray) http://sourceforge.net/project/showfiles.php? group_id=1369&package_id=32367 3) NLTK lite http://sourceforge.net/project/showfiles.php? group_id=30982&package_id=l 5604} 4) NLTK lite corpora http://prdownloads.sourceforge.net/nltk/nltk lite-corpora-0.6.3.zip Python a NLP Python je vhodný nástroj pro NLP jednoduchý snadno "debugovatelný výj imky interpretovaný jazyk strukturovatelný moduly, OOP výkonná práce nad (znakovými) et zci Moduly a balíky moduly modules umožňují znovu použít kód balíky packages jsou hierarchies moduly p íkazy pro práci - import - from ... import - reload Moduly a balíky import P íkaz import načítá modul: # Load the regular expression module >» import re Použití prístupu k metodám (pomocí tečkové notace) # Use the search method from the re mo >» re. search ( ' \w+ ' , str) Zobrazení obsahu modulu pomocí dir: >» dir (re) ['DOTALĽ, 'ľ 'IGNORECASE', . ..] Moduly a balíky from .. import P íkaz from. . . import načítá jednotlivé funkce: # Load the search function from the re module >» from re import search >» nltk lite.draw.rdparser import * Poté již může být p íkaz použit p ímo: # Use the search method from the re module >» search ( ' \w+ ' , str) >» demoO Moduly N nltklite nltk lite.chat nltklite.contrib nltklite.corpora nltk lite.draw LTK-lite nltk lite.misc nltklite.model nltklite.parse nltklite.tag nltk lite.tokenize Natural Language Toolkit i prezentace do p edm tu PA154 Nástroje pro korpusy část 2 - nástroje NLTK Tokenizace úvod Co je slovo? - Shluk znak odd leny mezerou? NE Konce ádk Interpunkce Rozdíl Type vs. Token - Type- to co je mnoha token m společné - Token - konkrétní realizace znaku ^^ "slovo " se vyskytuje dvakrát (dva tokeny), ale jde jen o jedno slovo (jeden type) Tokenizace text = sekvence token »> from nltk_lite import tokenize >» text = THello world. This is a test string.' >» list (tokenize.whitespace (text)) I['Hello', 'world.', 'This is test', 'string.'] >» text = 'That poster costs $22.40.' >» pattern = r T\w+| \$\d+\ .\d+| [A\w\s]+' »> list (tokenize. regexp (text, pattern)) ['That', 'poster', 'costs', '$22.40', '.'] >» list(tokenize.regexp(text, pattern=r'\s+', gaps=True)) ['That', 'poster', 'costs', '$22.40.'] |»> from nltk_lite.corpora import brown, extract >» print extract (0, brown.raw('a')) ['The', 'Fulton', 'County', 'Grand', 'Jury', 'said' 'Friday', 'an', 'investigation', of, "Atlanta's", 'recent', 'primary', 'election', 'produced' ,T", 'that', 'any', 'irregularities', 'took', 'place', '.'] no t i i evidence' Tokenizace stemming (hledání ko >» porter = tokenize.PorterStemmer () »> tokens = extract (0 , brown.raw(Ta')) >» for token tokens: print porter.stem(token) The Fulton Counti Grand Juri said Friday an investig 01 Atlanta' recent primari elect produc no evid T T that ani irregular took place Tokenizace statistiky Počet slov Tokenizace statistiky nltk_lite.probability.FreqDist Jméno P íklad Popis Count fd.count('the') Frequency f d. f req ( ' the ' ) Kolikrát se daný vzorek vyskytl Frekvence daného vzorku N fd.NO Počet vzork Samples Max fd.samples() fd.max() Seznam r zných zaznamenaných vzork Vzorek s nejvyšším počtem výskyt Tokenizace statistika pomocí token >» def length dist(text): f d = FreqDist () for token in genesis.raw(text): fd.inc(len(token)) for i in range(15): print TT%2dTT % int (100*fd.freq(i)) , print >» length dist(Tenglish-kjvT) 0 2 14 28 21 13 7 5 2 2 0 0 0 0 0 >» length dist(Tfinnish') 0 0 9 6 10 16 16 12 9632210________ Tokenizace ^podmíněná pravd podobnost >» from nltk_lite.probability import ConditionalFreqDist >» cfdist = ConditionalFreqDist () >» for text in genesis, items: for word in genesis.raw(text): cfdist[text].inc(len(word)) >» for cond in cfdist .conditions () : wordlens = cfdist[cond].samples() wordlens.sort() points = [(i, cfdist[cond].freq(i)) for i in wordlens] ■ >» from nltk_lite.draw.plot impc rt Plot |»> Plot (points) .mainloopO File i„i „i Zoom Axes Help \ \ \ \ \ \ J «I ►1' Tokenizace p edpovídání slov (kolokace) Trénovací korpus ConditionalFreqDist amax »> from nitk_lite.probability import ConditionalFreqDist >» cfdist = ConditionalFreqDist () J»> prev = None l»> for word genesis.raw() : cfdist[prev] .inc(word) prev = word >» word = 'better' >» for i in range (20) : print word, word = cfdist[word].max() better that he said, I will not be a wife of the land of the land Tagování nástroje NLTK tag »> sent = ...... John/nn saw/vb the/at book/nn on/in the/at table/nn ./end He/nn s ighed/vb ./end TT TT TT »> from nltk_lite.tag import tag2tuple »> for t in tokenize.whitespace (sent) : print tag2tuple(t), (TJohnT, TnnT) ('saw', TvbT) (TtheT, TatT) ('book', TnnT) ('on', ' in') ('the', 'at') ('table', 'nn') ('.', 'end') ('He', 'nn') (' sig hed', 'vb') ('.', 'end') Word Class Label Brown Tag Word Class Det at Article N nn Noun V vb Verb Adj jj Adjective P in Preposition Card cd Number end Sentence-ending punctuation Tagování nástroje NLTK tag Jednoduchý tagger >» text = "John saw 3 polar bears .TT l>» tokens = list (tokenize.whitespace (text)) l»> ['John', 'saw', '3', 'polar', 'bears', ' [['John', 'saw', '3', 'polar', 'bears', '.'] >» my tagger = tag .Default ('nn')___________ »> from nltk_lite import tag >» my_tagger = tag.Default ('nn') »> list (my_tagger. tag (tokens)) [('John', 'nn'), ('saw', TnnT), ('3', TnnT), ('polar', 'nn'), ('b ars', 'nn'), (' . ' , 'nn')] - Přesnost cca. 20-30% Používá se jako fallback solution Tagování nástroje NLTK tag Tagger sregul árními výrazy >» text = "John saw 3 polar bears .TT >» tokens = list (tokenize.whitespace (text)) ■ >» [ 'John' , 'saw I['John', 'saw', t: f-3 1 polar', 'bears i i polar'f 'bears ] >» patterns = [ (r' A-? [0-9] + (. [0-9]+) ?$ ' , Tcď), (r »> »> T * ! nn'J] ar - Vhodný pro slovní tvary s charakteristickou p íponou/p edponou - Vhodný pro čísla, mailové adresy, www stránky apod. - Používá se jako fallback solution Tagování nástroje NLTK tokenize ■ >» tokens = list (tokenize.whitespace (text)) l»> list (unigram_tagger. tag (tokens)) I[(TJohn', 'np'), ('saw', Tvbď) , ('the', 'at'), ('book', None), (j ^n^'in'), ('the', 'ar^^,('table'^lone^^^ ^^^^^^^^^^ >» unigram_tagger = tag.Unigram(backoff=nn_cd_tagger) »> unigram_tagger. train (train_sents) »> list (unigram_tagger. tag (tokens)) [('John', 'np'), ('saw', 'vbď), ('the', 'at'), ('book', 'nn'), (' on', 'in'); ('the', 'at'), ('table', 'nn')]_____________________ Tagování nástroje NLTK tag Kombinace >» tO = tag.Default (TnnT) >» ti = tag.Unigram(backoff=t0) >» t2 = tag. Bigram (backof f=tl) >» tO = tag.Default('nn') >» ti = tag. Unigram (backof f=t0) >» t2 = tag. Bigram (cutoff=2 , backof f=tl) »> ti. tra in (brown, tagged (TaT)) >» t2 .tra in (br own. tagged ('a')) >» accuracy2 = tag.accuracy(t2, brown.tagged(T bT »> print 'Bigram Accuracy = %4.1f%%T % (100 * accuracy2| Bigram Accuracy = 79.3% Brill v tagger »> from nltk_lite.tag import bril! »> brill, demo () Chunk parsing nástroje NLTK parse Příklad >» from nltk_lite.parse import tree >» tree.chunk("[ the/DT little/JJ cat/NN ] sat/VBD on/IN [ the/DT mat/NN ] (S: (NP: ('the', 'DT') ('little' , 'JJ') ('cat', 'NN')) ('sať, 'VBD') ('on' 'IN') (NP: ('the', 'DT') ('mať, 'NN'))) - Shlukování token do chunks^^^^^^^^M Tvo eny vedoucím slovem (nap . podst. jm) a souvisejícími slovy (nap . p id. jm.) - Chunks a uplynulé tokeny vytvá í tzv. chunk structure Dvojúrov ový strom obsahující celý text a obsahující jak chunks tak neparsované tokeny Chunk parsing nástroje NLTK parse Chunk tree >» from nltk_lite.corpora import treebank, extract >» chunk_tree = extract (603 , treebank. chunked ()) >» print chunk_tree (S: 'InT, 'IN') NP: ('happier' , 'JJR') ('news', 'NN')) TT T T \ ff f I NP: ('South', 'NNP') ('Korea', 'NNP')) TT T T \ f f II 'in', 'IN') 'establishing', 'VBG') NP: ('diplomatic', 'JJ') ('ties', 'NNS')) 'with', 'IN') NP: ('Poland', 'NNP') ('yesterday', 'NN')) ff 'M ff íl 'announced', 'VBD') NP: ('$', '$') ('450', 'CD') ('million', 'CD')) 'in', 'IN') NP: ('loans', 'NNS')) 'to', 'TO') NP: ('the', 'DT')) 'financially', 'RB') 'strapped', 'VBN') NP: ('Warsaw', 'NNP') ('government', 'NN')) I Shrnutí NLTK je vhodný nástroj pro NLP: - Umožňje rychlou a pohodlnou práci s textem r ^ - Mnoho obsažených výraz Literatura NLTK-Lite Tutorials Steven Bird, Ewan Klein, Edward Loper, 2001-2006 - http://nltk.sourceforge.net/lite/doc/en/ Getting Started with NLTK - http://nltk.sourceforge.net/gettingstarted.html nltk lite API - http ://nltk. sourceforge.net/lite/doc/api/