Pabuvojau Londone. Labai ++ miestas. Nusipirkau vat šitą knygą. Belenkoks gėris. Tai vat dabar bukmarkinsiuos įdomesnes vietas kaip reference:ą, kadangi pačios knygos tutorialo stilius atrodo idiot-proof and not so challenging. Prie to pačio bus belenkaip smagu pramokti python. Aio, ir dar vienas iš nedaugelio ištikimų skaitytojų/komentuotojų yra python fanas, tad tikiuosi gousous fydbeko iš jo.
Terminai
- nltk
- – Natural Language ToolKit – biblioteka su krūva tekstų bei naudingų modulių teksto analizei. Siurbits galima iš http://www.nltk.org/
- nltk.corpus / corpora
- – kategorizuotų tekstų rinkinys įvairiomis temomis (nuo paauglių irc/im pokalbių iki inauguracijos kalbų nuo 18.a pabaigos).
- nltk.concordance
- – žodžių sąrašas kartu su naudojamu kontekstu.
- vocabulary
- – žodynas. Bet ne tas, kurį slėpdavau po pagalve prieš miegą (TŽŽ) ir ne tas, kuriuo naudojasi mokyklose ir kitur. O tas, kurį sudaro vieno iš corpora tekstų nepasikartojančių žodžių rinkinys. Note: Švyturys (treidmarkas) == švyturys (pastatas). I.e. skirtingos kapitalizacijos žodžiai yra traktuojami kaip vienas ir tas pats
- collocations
- – žodžių pora, kuri tekste pasikartoja ypatingai dažnai. T.y. dažniau negu žodžių poros elementai atskirai. Svarbi savybė: atsparumas pakeitimui sinonimais: red wine yra collocation, kadangi šio žodžių junginio pakeitimas fraze maroon wine skambėtų be galo keistai.
- bigrams
- – žodžių poros, kurios naudojamos tekste rasti collocations.
Paprasčiausia teksto analizė
Tekstas dažniausiai analizuojamas (ne humanitarine prasme) pasitelkiant paprastus statistinius metodus. Pvz dažninį teksto vienetų pasiskirstymą (užmiršau tikslų statistinį terminą, bet angliškai tai skamba kaip “frequency distribution”), sąlyginį dažninį teksto vienetų pasiskirstymą (i.e. conditional frequency distribution), įvairiausių teksto vienetų vidurkius bei sumas.
Praktinis pavyzdys iš knygos – Gutenbergo tekstų analizė. NLTK yra bundlinama kartu su mažu kiekių tekstų iš Gutenbergo projekto (kuriame yra virš 25k nemokamų e-knygų):
>>> import nltk >>> from nltk.corpus import gutenberg >>> gutenberg.fildids() ['austen-emma.txt', 'austen-persuasion.txt', 'austen-sense.txt', ...]
Pasitelkus paprasčiausius skaičiavimo vidurkius bei sumas galima be didesnio vargo pasakyti tam tikrų tekstų ar jų autorių rašybos ypatybes. Pavyzdys žemiau:
>>> from __future__ import division # šito reikia, bear with me >>> for fileid in gutenberg.fileids(): ... num_chars = len(gutenberg.raw(fileid)) ... num_words = len(gutenberg.words(fileid)) ... num_sents = len(gutenberg.sents(fileid)) ... num_vocab = len(set([w.lower() for w in gutenberg.words(fileid)])) ... print int(num_chars/num_words), int(num_words/num_sents), int(num_words/num_vocab), fileid ... 4 21 26 austen-emma.txt 4 23 16 austen-persuasion.txt 4 23 22 austen-sense.txt 4 33 79 bible-kjv.txt 4 18 5 blake-poems.txt 4 17 14 bryant-stories.txt 4 17 12 burgess-busterbrown.txt 4 16 12 carroll-alice.txt 4 17 11 chesterton-ball.txt 4 19 11 chesterton-brown.txt 4 16 10 chesterton-thursday.txt 4 17 24 edgeworth-parents.txt 4 24 15 melville-moby_dick.txt 4 52 10 milton-paradise.txt 4 11 8 shakespeare-caesar.txt 4 12 7 shakespeare-hamlet.txt 4 12 6 shakespeare-macbeth.txt 4 35 12 whitman-leaves.txt
Šis kodo gabalas pateikia statistinę informaciją apie gutenbergo tekstus įtrauktus į NLTK biblioteką. Pirmas stulpelis rodo vidutinį žodžio ilgį, antras – sakinio, o trečias leksikologinį įvairumą (lexical diversity – kiek kartų vidutiniškai vienas žodis pasikartoja visame tekste). Esminis dalykas į kurį reikėtų atkreipti dėmesį šiame outpute yra tai, kad vidutinis 4 raidžių žodžio ilgis yra anglų kalbos savybė, tuo tarpu vidutinis sakinio ilgis žodžiais yra tam tikro autoriaus atributas (Austen: 21-23, Chesterton: 16-19, Shakespeare: 11-12). Kaip tokiai paprastai matematikai – pakankamai informatyvu. IMHO.
Viso teksto analizė
Viena iš teksto charakteristikų, kurias galime sužinoti be didelių sunkumų – teksto žodynas (vocabulary). Praktinis pavyzdys – NLTK biblioteka turi inaugiracinių kalbų rinkinį suskirstytą pagal metus. Galime lengvai pasakyti koks yra visų kalbų žodyno ilgis:
>>> import nltk >>> from nltk.book import * <...> >>> vocabulary = sorted(set([w for w in text4])) >>> len(vocabulary) 9754
Gan neblogai – beveik 10k žodžių per 200 metų. Bet lengvai galima pasakyti, kad tai nėra tikslus žodynas, kadangi žodis “american” ir “American” kode aukščiau yra skaičiuojami kaip du skirtingi žodžiai. Pabandom pakoreguoti algoritmą:
>>> vocabulary = sorted(set([w.lower() for w in text4])) >>> len(vocabulary) 9070
Žodynas sumažėjo beveik 700 žodžių. Gan neblogai. Bet iš esmės galime jį sutrumpinti dar! Kadangi anglų kalboje yra belenkiek žodžių kurie neturi didelės semantinės reikšmės, mes galime juos pramesti naudodami NLTK stopwords sąrašą. Kadangi sąrašų yra keletas (po vieną [beveik] kiekvienai kalbai), teks pasitelkti tik anglų kalbos žodžius:
>>> from nltk.corpus import stopwords >>> stopwords = stopwords.words('english') >>> vocabulary = set([w.lower() for w in text4 if w.lower() not in stopwords]) >>> len(vocabulary) 8944
Kokią išvadą galima padaryti iš tokio teksto analizavimo? Nuo pradinio žodyno kiekio nuėjome pakankamai trumpą kelią ir žiūrint į skaičius galima teigti, kad JAV prezidentai netuščiažodžiavo net per inauguracines kalbas. Esminių žodžių buvo pasakyta per virš 90% visos kalbos. Jeigu pastebėjai, nagrinėdamas inauguracinių kalbų tekstą naudojau text4 kintamąjį. Tai vienas iš kintamųjų, kuriuos gauni importuodamas viską iš nltk.book knygos. Beje, dar nepaminėjau nei bigramų (bigrams), nei kolokacijų (collocations). Vienas iš įdomesnių dalykų, tai sužinoti apie ką per 200 metų prišnekėjo JAV prezidentai:
>>> text4.collocations() Building collocations list United States; fellow citizens; four years; years ago; Federal Government; General Government; American people; Vice President; Old World; Almighty God; Fellow citizens; Chief Magistrate; Chief Justice; God bless; every citizen; Indian tribes; public debt; one another; foreign nations; political parties
Šiam kartui turbūt užteks. Kitą kartą bandysiu bukmarkinti keletą grafikų apie žodžių dažninį pasiskirstymą, kas iš to išeina bei pradėsiu konstruoti repavimo mašiną.
Jo, esminių žodžių gali būti 90 proc., bet kad suprasti likusius 10 proc. reikia turėti Rodo Koloso dydžio (kolosalią) žodžių atsargą galvoje :)
Likę 10% kaip tik buvo neesminiai žodžiai, kurie apjungdavo likusius į sakinius ir pastraipas. Įdomu pagal kokius raktinius žodžius čia užklydai. Įtartinas vardas ir URL .P