<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Eimantas Vaičiūnas &#187; python</title>
	<atom:link href="http://vaiciunas.info/tag/python/feed" rel="self" type="application/rss+xml" />
	<link>http://vaiciunas.info</link>
	<description>diskretus gyvenimas</description>
	<lastBuildDate>Sat, 26 Jun 2010 07:36:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Python ir NLTK</title>
		<link>http://vaiciunas.info/282-python-ir-nltk</link>
		<comments>http://vaiciunas.info/282-python-ir-nltk#comments</comments>
		<pubDate>Sat, 05 Dec 2009 15:03:41 +0000</pubDate>
		<dc:creator>eimantas</dc:creator>
				<category><![CDATA[it]]></category>
		<category><![CDATA[bigrams]]></category>
		<category><![CDATA[collocations]]></category>
		<category><![CDATA[concordance]]></category>
		<category><![CDATA[corpora]]></category>
		<category><![CDATA[corpus]]></category>
		<category><![CDATA[lexical diversity]]></category>
		<category><![CDATA[nltk]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[vocabulary]]></category>

		<guid isPermaLink="false">http://vaiciunas.info/?p=282</guid>
		<description><![CDATA[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. [...]]]></description>
			<content:encoded><![CDATA[<p>Pabuvojau Londone. Labai ++ miestas. Nusipirkau vat <a title="Natural Language Processing with Python" href="http://www.amazon.com/Natural-Language-Processing-Python-Steve/dp/0596516495">šitą knygą</a>. Belenkoks gėris. Tai vat dabar bukmarkinsiuos įdomesnes vietas kaip reference:ą, kadangi pačios knygos tutorialo stilius atrodo <em>idiot-proof and not so challenging</em>. Prie to pačio bus belenkaip smagu pramokti python. Aio, ir dar <a href="http://www.sandbox.lt/" title="Dalius Dobravolskas">vienas</a> iš nedaugelio ištikimų skaitytojų/komentuotojų yra python fanas, tad tikiuosi <em>gousous fydbeko</em> iš jo.<br />
<span id="more-282"></span></p>
<h3>Terminai</h3>
<dl>
<dt>nltk</dt>
<dd> &#8211; <em>Natural Language ToolKit</em> &#8211; biblioteka su krūva tekstų bei naudingų modulių teksto analizei. Siurbits galima iš <a href="http://www.nltk.org/" title="Natural Language ToolKit">http://www.nltk.org/</a></dd>
<dt>nltk.corpus / corpora</dt>
<dd> &#8211; kategorizuotų tekstų rinkinys įvairiomis temomis (nuo paauglių irc/im pokalbių iki inauguracijos kalbų nuo 18.a pabaigos).</dd>
<dt>nltk.concordance</dt>
<dd> &#8211; žodžių sąrašas kartu su naudojamu kontekstu.</dd>
<dt>vocabulary</dt>
<dd> &#8211; ž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š <em>corpora</em> tekstų nepasikartojančių žodžių rinkinys. <strong>Note:</strong> Švyturys (treidmarkas) == švyturys (pastatas). I.e. skirtingos kapitalizacijos žodžiai yra traktuojami kaip vienas ir tas pats</dd>
<dt>collocations</dt>
<dd> &#8211; žodžių pora, kuri tekste pasikartoja ypatingai dažnai. T.y. dažniau negu žodžių poros elementai atskirai. Svarbi savybė: atsparumas pakeitimui sinonimais: <em>red wine</em> yra collocation, kadangi šio žodžių junginio pakeitimas fraze <em>maroon wine</em> skambėtų be galo keistai.</dd>
<dt>bigrams</dt>
<dd> &#8211; žodžių poros, kurios naudojamos tekste rasti collocations.</dd>
</dl>
<h3>Paprasčiausia teksto analizė</h3>
<p>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 &#8220;frequency distribution&#8221;), sąlyginį dažninį teksto vienetų pasiskirstymą (i.e. conditional frequency distribution), įvairiausių teksto vienetų vidurkius bei sumas.</p>
<p>Praktinis pavyzdys iš knygos &#8211; Gutenbergo tekstų analizė. NLTK yra bundlinama kartu su mažu kiekių tekstų iš Gutenbergo projekto (kuriame yra virš 25k nemokamų e-knygų):</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">import</span> nltk
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">from</span> nltk.<span style="color: black;">corpus</span> <span style="color: #ff7700;font-weight:bold;">import</span> gutenberg
<span style="color: #66cc66;">&gt;&gt;&gt;</span> gutenberg.<span style="color: black;">fildids</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#91;</span><span style="color: #483d8b;">'austen-emma.txt'</span>, <span style="color: #483d8b;">'austen-persuasion.txt'</span>, <span style="color: #483d8b;">'austen-sense.txt'</span>, ...<span style="color: black;">&#93;</span></pre></div></div>

<p>Pasitelkus paprasčiausius skaičiavimo vidurkius bei sumas galima be didesnio vargo pasakyti tam tikrų tekstų ar jų autorių rašybos ypatybes. Pavyzdys žemiau:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">__future__</span> <span style="color: #ff7700;font-weight:bold;">import</span> division <span style="color: #808080; font-style: italic;"># šito reikia, bear with me</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">for</span> fileid <span style="color: #ff7700;font-weight:bold;">in</span> gutenberg.<span style="color: black;">fileids</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
...    <span style="color: black;">num_chars</span> = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>gutenberg.<span style="color: black;">raw</span><span style="color: black;">&#40;</span>fileid<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
...    <span style="color: black;">num_words</span> = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>gutenberg.<span style="color: black;">words</span><span style="color: black;">&#40;</span>fileid<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
...    <span style="color: black;">num_sents</span> = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>gutenberg.<span style="color: black;">sents</span><span style="color: black;">&#40;</span>fileid<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
...    <span style="color: black;">num_vocab</span> = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">set</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>w.<span style="color: black;">lower</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> w <span style="color: #ff7700;font-weight:bold;">in</span> gutenberg.<span style="color: black;">words</span><span style="color: black;">&#40;</span>fileid<span style="color: black;">&#41;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
...    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #008000;">int</span><span style="color: black;">&#40;</span>num_chars/num_words<span style="color: black;">&#41;</span>, <span style="color: #008000;">int</span><span style="color: black;">&#40;</span>num_words/num_sents<span style="color: black;">&#41;</span>, <span style="color: #008000;">int</span><span style="color: black;">&#40;</span>num_words/num_vocab<span style="color: black;">&#41;</span>, fileid
... 
<span style="color: #ff4500;">4</span> <span style="color: #ff4500;">21</span> <span style="color: #ff4500;">26</span> austen-emma.<span style="color: black;">txt</span>
<span style="color: #ff4500;">4</span> <span style="color: #ff4500;">23</span> <span style="color: #ff4500;">16</span> austen-persuasion.<span style="color: black;">txt</span>
<span style="color: #ff4500;">4</span> <span style="color: #ff4500;">23</span> <span style="color: #ff4500;">22</span> austen-sense.<span style="color: black;">txt</span>
<span style="color: #ff4500;">4</span> <span style="color: #ff4500;">33</span> <span style="color: #ff4500;">79</span> bible-kjv.<span style="color: black;">txt</span>
<span style="color: #ff4500;">4</span> <span style="color: #ff4500;">18</span> <span style="color: #ff4500;">5</span> blake-poems.<span style="color: black;">txt</span>
<span style="color: #ff4500;">4</span> <span style="color: #ff4500;">17</span> <span style="color: #ff4500;">14</span> bryant-stories.<span style="color: black;">txt</span>
<span style="color: #ff4500;">4</span> <span style="color: #ff4500;">17</span> <span style="color: #ff4500;">12</span> burgess-busterbrown.<span style="color: black;">txt</span>
<span style="color: #ff4500;">4</span> <span style="color: #ff4500;">16</span> <span style="color: #ff4500;">12</span> carroll-alice.<span style="color: black;">txt</span>
<span style="color: #ff4500;">4</span> <span style="color: #ff4500;">17</span> <span style="color: #ff4500;">11</span> chesterton-ball.<span style="color: black;">txt</span>
<span style="color: #ff4500;">4</span> <span style="color: #ff4500;">19</span> <span style="color: #ff4500;">11</span> chesterton-brown.<span style="color: black;">txt</span>
<span style="color: #ff4500;">4</span> <span style="color: #ff4500;">16</span> <span style="color: #ff4500;">10</span> chesterton-thursday.<span style="color: black;">txt</span>
<span style="color: #ff4500;">4</span> <span style="color: #ff4500;">17</span> <span style="color: #ff4500;">24</span> edgeworth-parents.<span style="color: black;">txt</span>
<span style="color: #ff4500;">4</span> <span style="color: #ff4500;">24</span> <span style="color: #ff4500;">15</span> melville-moby_dick.<span style="color: black;">txt</span>
<span style="color: #ff4500;">4</span> <span style="color: #ff4500;">52</span> <span style="color: #ff4500;">10</span> milton-paradise.<span style="color: black;">txt</span>
<span style="color: #ff4500;">4</span> <span style="color: #ff4500;">11</span> <span style="color: #ff4500;">8</span> shakespeare-caesar.<span style="color: black;">txt</span>
<span style="color: #ff4500;">4</span> <span style="color: #ff4500;">12</span> <span style="color: #ff4500;">7</span> shakespeare-hamlet.<span style="color: black;">txt</span>
<span style="color: #ff4500;">4</span> <span style="color: #ff4500;">12</span> <span style="color: #ff4500;">6</span> shakespeare-macbeth.<span style="color: black;">txt</span>
<span style="color: #ff4500;">4</span> <span style="color: #ff4500;">35</span> <span style="color: #ff4500;">12</span> whitman-leaves.<span style="color: black;">txt</span></pre></div></div>

<p>Šis kodo gabalas pateikia statistinę informaciją apie gutenbergo tekstus įtrauktus į NLTK biblioteką. Pirmas stulpelis rodo vidutinį žodžio ilgį, antras &#8211; sakinio, o trečias leksikologinį įvairumą (lexical diversity &#8211; kiek kartų vidutiniškai vienas žodis pasikartoja visame tekste). Esminis dalykas į kurį reikėtų atkreipti dėmesį šiame <em>outpute</em> 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 &#8211; pakankamai informatyvu. IMHO.</p>
<h3>Viso teksto analizė</h3>
<p>Viena iš teksto charakteristikų, kurias galime sužinoti be didelių sunkumų &#8211; teksto žodynas (vocabulary). Praktinis pavyzdys &#8211; NLTK biblioteka turi inaugiracinių kalbų rinkinį suskirstytą pagal metus. Galime lengvai pasakyti koks yra visų kalbų žodyno ilgis:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">import</span> nltk
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">from</span> nltk.<span style="color: black;">book</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span>
<span style="color: #66cc66;">&lt;</span>...<span style="color: #66cc66;">&gt;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> vocabulary = <span style="color: #008000;">sorted</span><span style="color: black;">&#40;</span><span style="color: #008000;">set</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>w <span style="color: #ff7700;font-weight:bold;">for</span> w <span style="color: #ff7700;font-weight:bold;">in</span> text4<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>vocabulary<span style="color: black;">&#41;</span>
<span style="color: #ff4500;">9754</span></pre></div></div>

<p>Gan neblogai &#8211; beveik 10k žodžių per 200 metų. Bet lengvai galima pasakyti, kad tai nėra tikslus žodynas, kadangi žodis &#8220;american&#8221; ir &#8220;American&#8221; kode aukščiau yra skaičiuojami kaip du skirtingi žodžiai. Pabandom pakoreguoti algoritmą:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> vocabulary = <span style="color: #008000;">sorted</span><span style="color: black;">&#40;</span><span style="color: #008000;">set</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>w.<span style="color: black;">lower</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> w <span style="color: #ff7700;font-weight:bold;">in</span> text4<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>vocabulary<span style="color: black;">&#41;</span>
<span style="color: #ff4500;">9070</span></pre></div></div>

<p>Ž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:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">from</span> nltk.<span style="color: black;">corpus</span> <span style="color: #ff7700;font-weight:bold;">import</span> stopwords
<span style="color: #66cc66;">&gt;&gt;&gt;</span> stopwords = stopwords.<span style="color: black;">words</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'english'</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> vocabulary = <span style="color: #008000;">set</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>w.<span style="color: black;">lower</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> w <span style="color: #ff7700;font-weight:bold;">in</span> text4 <span style="color: #ff7700;font-weight:bold;">if</span> w.<span style="color: black;">lower</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #ff7700;font-weight:bold;">in</span> stopwords<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>vocabulary<span style="color: black;">&#41;</span>
<span style="color: #ff4500;">8944</span></pre></div></div>

<p>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 <code>text4</code> kintamąjį. Tai vienas iš kintamųjų, kuriuos gauni importuodamas viską iš <code>nltk.book</code> 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:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> text4.<span style="color: black;">collocations</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
Building collocations <span style="color: #008000;">list</span>
United States<span style="color: #66cc66;">;</span> fellow citizens<span style="color: #66cc66;">;</span> four years<span style="color: #66cc66;">;</span> years ago<span style="color: #66cc66;">;</span> Federal
Government<span style="color: #66cc66;">;</span> General Government<span style="color: #66cc66;">;</span> American people<span style="color: #66cc66;">;</span> Vice President<span style="color: #66cc66;">;</span> Old
World<span style="color: #66cc66;">;</span> Almighty God<span style="color: #66cc66;">;</span> Fellow citizens<span style="color: #66cc66;">;</span> Chief Magistrate<span style="color: #66cc66;">;</span> Chief Justice<span style="color: #66cc66;">;</span>
God bless<span style="color: #66cc66;">;</span> every citizen<span style="color: #66cc66;">;</span> Indian tribes<span style="color: #66cc66;">;</span> public debt<span style="color: #66cc66;">;</span> one another<span style="color: #66cc66;">;</span>
foreign nations<span style="color: #66cc66;">;</span> political parties</pre></div></div>

<p>Š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ą.</p>
]]></content:encoded>
			<wfw:commentRss>http://vaiciunas.info/282-python-ir-nltk/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
