<?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>El vol de l&#039;home ocell &#187; Jo</title>
	<atom:link href="http://www.elvoldelhomeocell.net/archives/category/jo/feed" rel="self" type="application/rss+xml" />
	<link>http://www.elvoldelhomeocell.net</link>
	<description>Vull tenir dret a volar.</description>
	<lastBuildDate>Thu, 26 Apr 2012 00:57:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Update</title>
		<link>http://www.elvoldelhomeocell.net/archives/1749</link>
		<comments>http://www.elvoldelhomeocell.net/archives/1749#comments</comments>
		<pubDate>Sun, 26 Feb 2012 10:43:24 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Estudis]]></category>
		<category><![CDATA[Jo]]></category>
		<category><![CDATA[educació]]></category>
		<category><![CDATA[erasmus]]></category>
		<category><![CDATA[exàmens]]></category>
		<category><![CDATA[internship]]></category>
		<category><![CDATA[sistema educatiu]]></category>
		<category><![CDATA[suècia]]></category>

		<guid isPermaLink="false">http://www.elvoldelhomeocell.net/?p=1749</guid>
		<description><![CDATA[Des de que he tornat de les vacances de Nadal que no he pogut mantenir massa actualitzat el blog. Avui, com que és el meu aniversari, m&#8217;he dit: &#8220;Xe, Joan, actualitza!&#8221;. La setmana passada volia publicar un article sobre la &#8230; <a href="http://www.elvoldelhomeocell.net/archives/1749">Continua llegint <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Des de que he tornat de les vacances de Nadal que no he pogut mantenir massa actualitzat el blog. Avui, com que és el meu aniversari, m&#8217;he dit: &#8220;Xe, Joan, actualitza!&#8221;.</p>
<p>La setmana passada volia publicar un article sobre la reforma de les beques que vol dur endavant el ministre Wert. És un tema del que ja he parlat moltes vegades amb els amics, i fins i tot vam tenir una discussió que va durar fins altes hores de la nit este estiu. Al final no vaig acabar d&#8217;escriure la nota perquè m&#8217;estava quedant un post massa llarg i no aconseguia dir exactament el que volia. Però vaig a fer-vos un resum: Ojito, que tots no partim de les mateixa base per a obtenir uns determinats resultats. No és el mateix el fill d&#8217;una família de professors que el fill d&#8217;una família de <em>camells.</em></p>
<p>El títol de l&#8217;entrada és &#8220;Update&#8221;, però poca cosa tinc que contar. Vaig estar cinc dies a París fa dos setmanes, visitant a <a href="http://otto-ta.blogspot.com" target="_blank">Anna</a>, i des de que he tornat el meu dia es resumeix en fer les pràctiques de classe i mirar les quatre sèries setmanals que seguisc (<em><a href="http://en.wikipedia.org/wiki/Californication_(TV_series)" target="_blank">Californication</a></em>, <em><a href="http://en.wikipedia.org/wiki/The_Walking_Dead_(TV_series)" target="_blank">The Walking Dead</a></em>, <em><a href="http://en.wikipedia.org/wiki/Modern_Family" target="_blank">Modern Family</a></em> i <em><a href="http://en.wikipedia.org/wiki/The_Big_Bang_Theory" target="_blank">The Big Bang Theory</a></em>).</p>
<p>El més destacable és que ja he rebut tots els papers que necessitava per a demanar el visat J-1 a l&#8217;ambaixada dels Estats Units a Madrid. La putada és que m&#8217;hauré de traslladar fins allà per fer l&#8217;entrevista amb els d&#8217;immigració i que em donen el visat. I damunt, per demanar la cita haig de cridar per telèfon i des de fora d&#8217;Espanya et cobren el mòdic preu de 10 euros per la cridada! En fi, quan estiga <em>frikejant</em> en <a href="http://www.google.com" target="_blank">Mountain View</a>, haurà valgut la pena.</p>
<p>Poca cosa més, ara vaig a seguir pegant-li canya al <a href="http://en.wikipedia.org/wiki/Paxos_(computer_science)" target="_blank">Paxos</a>. En dues setmanes estic d&#8217;exàmens. Ja us contaré més quan passen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elvoldelhomeocell.net/archives/1749/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Kommer tillbaka till Stockholm</title>
		<link>http://www.elvoldelhomeocell.net/archives/1724</link>
		<comments>http://www.elvoldelhomeocell.net/archives/1724#comments</comments>
		<pubDate>Fri, 13 Jan 2012 10:15:25 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Erasmus]]></category>
		<category><![CDATA[Estudis]]></category>
		<category><![CDATA[Jo]]></category>
		<category><![CDATA[coses meves]]></category>
		<category><![CDATA[enginyeria informàtica]]></category>
		<category><![CDATA[estocolm]]></category>
		<category><![CDATA[exàmens]]></category>
		<category><![CDATA[fiv]]></category>
		<category><![CDATA[kth]]></category>
		<category><![CDATA[oracle de woody allen]]></category>
		<category><![CDATA[suècia]]></category>
		<category><![CDATA[upv]]></category>

		<guid isPermaLink="false">http://www.elvoldelhomeocell.net/?p=1724</guid>
		<description><![CDATA[Ja ha passat Nadal. Avui he fet un examen a la UPV d&#8217;Optimització Automàtica de Programes i demà torne cap a Suècia. Ha sigut un Nadal relaxat. Això de no tenir (pràcticament) exàmens després de les vacances és una passada! &#8230; <a href="http://www.elvoldelhomeocell.net/archives/1724">Continua llegint <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ja ha passat Nadal. Avui he fet un examen a la UPV d&#8217;<a href="http://users.dsic.upv.es/~gvidal/oap.html" target="_blank">Optimització Automàtica de Programes</a> i demà torne cap a Suècia.</p>
<p>Ha sigut un Nadal relaxat. Això de no tenir (pràcticament) exàmens després de les vacances és una passada! Ara bé, no he fet quasi res del que volia fer durant les vacances.</p>
<p>Abans de venir cap a Espanya us vaig dir des de Suècia que acabaria de contar-vos les últimes idees sobre correcció automàtica en l&#8217;<a href="http://joapuipe.dyndns.org/allen/" target="_blank">Oracle</a>. Zero. Res.</p>
<p>Esperava rebre part dels <em>papelorios</em> de Google i cridar a l&#8217;<a href="http://spanish.madrid.usembassy.gov/" target="_blank">ambaixada dels EUA</a> per preguntar algunes coses, però no els he rebut encara i tampoc he pogut avançar en aquest tema.</p>
<p>El que sí que he fet aquests Nadals ha sigut enganxar-me a una sèrie més (<a href="http://en.wikipedia.org/wiki/Modern_Family" target="_blank">Modern Family</a>) i jugar a un videojoc (<a href="http://en.wikipedia.org/wiki/Half-Life_2" target="_blank">Half-Life 2</a>). Feia un parell d&#8217;anys que no jugava a cap joc!</p>
<p>En fi, que dilluns comencem les classes del tercer període a la <a href="http://www.kth.se" target="_blank">KTH</a> amb <a href="http://www.csc.kth.se/utbildning/kth/kurser/DD2432/ann12/" target="_blank">Artificial Neural Networks and Other Learning Systems</a>, <em><a href="http://www.csc.kth.se/utbildning/kth/kurser/DD2476/ir12/" target="_blank">Search Engines and Information Retrieval</a></em> i <em><a href="http://www.ict.kth.se/courses/ID2203/" target="_blank">Distributed Systems: Advanced Course</a></em>. Ja tinc ganes!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elvoldelhomeocell.net/archives/1724/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2011</title>
		<link>http://www.elvoldelhomeocell.net/archives/1708</link>
		<comments>http://www.elvoldelhomeocell.net/archives/1708#comments</comments>
		<pubDate>Sat, 31 Dec 2011 10:48:43 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Jo]]></category>
		<category><![CDATA[Reflexions]]></category>
		<category><![CDATA[2011]]></category>
		<category><![CDATA[2012]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[resum]]></category>
		<category><![CDATA[suècia]]></category>
		<category><![CDATA[zeitgeist]]></category>

		<guid isPermaLink="false">http://www.elvoldelhomeocell.net/?p=1708</guid>
		<description><![CDATA[Toca despedir-se del 2011 i ho faig amb el típic post recopilatori. Abans que res, perdoneu-me per no escriure res la setmana passada sobre l&#8217;Oracle i la correcció automàtica, però no he pogut acabar encara el que volia contar-vos així &#8230; <a href="http://www.elvoldelhomeocell.net/archives/1708">Continua llegint <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Toca despedir-se del 2011 i ho faig amb el típic post recopilatori.</p>
<p>Abans que res, perdoneu-me per no escriure res la setmana passada sobre l&#8217;Oracle i la correcció automàtica, però no he pogut acabar encara el que volia contar-vos així que haurem d&#8217;esperar un poc més.</p>
<p>En un sol adjectiu, aquest any ha sigut genial. Va acabar prou bé el meu <a href="http://www.elvoldelhomeocell.net/archives/1125" target="_blank">últim</a> any de classes a la UPV com a estudiant d&#8217;Enginyeria Informàtica, han anat prou bé també en la primera meitat de la meva <a href="http://www.elvoldelhomeocell.net/archives/category/jo/erasmus-jo" target="_blank">estada</a> a Estocolm i espere que vagen almenys igual de bé en la segona meitat, ara que les assignatures tenen pinta d&#8217;agradar-me més.</p>
<p><a title="Stockholm from Västerbron por Joan Puigcerver, en Flickr" href="http://www.flickr.com/photos/joanpuigcerver/6179466774/"><img class="aligncenter" src="http://farm7.staticflickr.com/6172/6179466774_4c4e4625ec.jpg" alt="Stockholm from Västerbron" width="500" height="180" /></a></p>
<p>He pogut fer un bon grapat de viatges aprofitant que he tingut un quadrimestre més relaxat (viatge a <a href="http://www.elvoldelhomeocell.net/archives/1479" target="_blank">Tallin</a>, a Londres i diverses escapades per <a href="http://www.elvoldelhomeocell.net/archives/tag/suecia" target="_blank">Suècia</a> i un parell de voltes que he tornat a casa a passar uns dies). Espere poder fer-ne també uns quants el segon quadrimestre, encara que el tindré prou més carregat que el primer.</p>
<p>I professionalment, que dir: Ha sigut l&#8217;any que <a href="http://www.google.com" target="_blank">els de Mountain View</a> m&#8217;han convidat a col·laborar amb ells. Estic segur que aquest tema centrarà moltes entrades el pròxim any.</p>
<p><a href="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/12/newyearseve-2011-hp.jpg" rel="lightbox[1708]"><img class="aligncenter size-full wp-image-1709" title="newyearseve-2011-hp" src="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/12/newyearseve-2011-hp.jpg" alt="" width="466" height="163" /></a></p>
<p>Alguna cosa em fa pensar que el 2012 serà millor encara, espere no enganyar-me i que el vostre us vaja també de meravella.</p>
<p>En fi, si voleu veure un vídeo resum més global, doneu-li un cop d&#8217;ull al meravellós, fantàstic, espectacular i emotiu <a href="http://www.youtube.com/watch?v=SAIEamakLoY" target="_blank">vídeo</a> de Google (sí, m&#8217;he posat en mode <em>spammer</em>).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elvoldelhomeocell.net/archives/1708/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google: què faré?</title>
		<link>http://www.elvoldelhomeocell.net/archives/1693</link>
		<comments>http://www.elvoldelhomeocell.net/archives/1693#comments</comments>
		<pubDate>Fri, 16 Dec 2011 15:03:43 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[Informàtica]]></category>
		<category><![CDATA[Jo]]></category>
		<category><![CDATA[google books]]></category>
		<category><![CDATA[google research]]></category>
		<category><![CDATA[internship]]></category>
		<category><![CDATA[ocr]]></category>
		<category><![CDATA[remco teunen]]></category>

		<guid isPermaLink="false">http://www.elvoldelhomeocell.net/?p=1693</guid>
		<description><![CDATA[En primer lloc, gràcies per les felicitacions que heu anat enviant-me aquests dies a través de diferents canals: correu electrònic, Facebook, Twitter, aquesta web, etc. Moltíssimes gràcies! Val, val. M&#8217;han fixat com a Software Engineer Intern a Google. Però què &#8230; <a href="http://www.elvoldelhomeocell.net/archives/1693">Continua llegint <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>En primer lloc, gràcies per les felicitacions que heu anat enviant-me aquests dies a través de diferents canals: correu electrònic, <a href="http://www.facebook.com/joanpuigcerver" target="_blank">Facebook</a>, <a href="http://twitter.com/joapuipe" target="_blank">Twitter</a>, aquesta web, etc. Moltíssimes gràcies!</p>
<p>Val, val. M&#8217;han <em>fixat</em> com a <a href="http://www.google.com/intl/en/jobs/students/tech/internships/uscanada/software-engineering-intern-summer-north-america-locations-1/index.html" target="_blank">Software Engineer Intern</a> a Google. Però què vaig a fer allà?</p>
<p><a href="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/12/google_research.png" rel="lightbox[1693]"><img class="aligncenter size-full wp-image-1696" title="" src="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/12/google_research.png" alt="" width="360" height="150" /></a></p>
<p>Treballaré amb l&#8217;equip OCR (<a href="http://en.wikipedia.org/wiki/Optical_character_recognition" target="_blank">Optical Character Recognition</a>), integrat dins de <a href="http://research.google.com/" target="_blank">Google Research</a>, que és l&#8217;equip de recerca de la companyia. La <em><a href="http://www.google.com/about/corporate/company/" target="_blank">missió</a></em> de Google és:</p>
<blockquote><p>Organitzar la informació mundial i fer-la útil i accessible universalment.</p></blockquote>
<p>I això òbviament passa per organitzar la informació escrita en llibres. L&#8217;equip d&#8217;OCR és un dels que treballa, per exemple, en el <a href="http://books.google.com/" target="_blank">Google Books</a> i el seu treball dins d&#8217;aquest producte és fer que els ordinadors puguen reconèixer el que hi ha escrit en els llibres. Una vegada sabem el que diu en una imatge escanejada d&#8217;una pàgina d&#8217;un llibre, podem fer que quan l&#8217;usuari cerque informació, no sols li apareguen dades que provinguen de pàgines web, sinó també de llibres. La meva tasca en concret serà millorar una part d&#8217;aquest procés.</p>
<p>Els escànners domèstics i aplicacions com l&#8217;<a href="http://www.adobe.com/products/reader.html" target="_blank">Adobe Reader</a> o el <a href="http://docs.google.com" target="_blank">Google Docs</a> tenen funcions de reconeixement de text des de fa molt de temps. No és l&#8217;OCR un problema resolt? En el següent vídeo, Remco Teunen explica quin és el treball que ha fet l&#8217;equip de OCR i què és el que li queda per fer. Remco és qui em va fer l&#8217;entrevista i qui serà el meu <em>host</em> (Google <strong>mai</strong> utilitza paraules com <em>boss</em>, <em>supervisor</em>, <em>director</em>, etc). La seva part dura 8 minuts, però si us interessa saber en què treballa l&#8217;equip de recerca de Google (<a href="http://www.youtube.com/watch?v=YGBZGhzlL14&amp;t=8m10s" target="_blank">Reconeixement de Veu</a>, <a href="http://www.youtube.com/watch?v=YGBZGhzlL14" target="_blank">Traducció Automàtica</a>, <em><a href="http://www.youtube.com/watch?v=YGBZGhzlL14#t=39m55s" target="_blank">Machine Hearing</a></em> i <em><a href="http://www.youtube.com/watch?v=YGBZGhzlL14#t=23m33s" target="_blank">Machine Perception</a></em>), us recomane que el veieu complet.</p>
<p><iframe width="640" height="360" src="http://www.youtube.com/embed/YGBZGhzlL14?start=928&#038;fs=1&#038;feature=oembed" frameborder="0" allowfullscreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.elvoldelhomeocell.net/archives/1693/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Internship: Google</title>
		<link>http://www.elvoldelhomeocell.net/archives/1684</link>
		<comments>http://www.elvoldelhomeocell.net/archives/1684#comments</comments>
		<pubDate>Wed, 14 Dec 2011 21:10:48 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[Informàtica]]></category>
		<category><![CDATA[Jo]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[internship]]></category>

		<guid isPermaLink="false">http://www.elvoldelhomeocell.net/?p=1684</guid>
		<description><![CDATA[Qui m&#8217;anava a dir a mi que, un bon dimecres 14 de desembre, hauria de dir-li a una simpàtica encarregada de Recursos Humans de Facebook que no podia seguir entrevistant-me amb ells? Doncs això he hagut de fer (sempre cordial &#8230; <a href="http://www.elvoldelhomeocell.net/archives/1684">Continua llegint <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Qui m&#8217;anava a dir a mi que, un bon dimecres 14 de desembre, hauria de dir-li a una simpàtica encarregada de Recursos Humans de <a href="http://www.facebook.com/" target="_blank">Facebook</a> que no podia seguir entrevistant-me amb ells? Doncs això he hagut de fer (sempre cordial i deixant la porta oberta per al futur), dir-li que no al <a href="http://en.wikipedia.org/wiki/Mark_Zuckerberg" target="_blank">Zuckerberg</a> perquè me&#8217;n vaig amb <a href="http://en.wikipedia.org/wiki/Larry_Page" target="_blank">Page</a> i <a href="http://en.wikipedia.org/wiki/Sergey_Brin" target="_blank">Brin</a>!</p>
<p>Doncs sí, com ho llegiu! Si res canvia i el govern dels EUA em dóna el visat J-1 que necessite per a treballar allà, el pròxim estiu (del 10 de Juliol al 12 d&#8217;Octubre) estaré treballant en la seu central de <a href="http://www.google.com/" target="_blank">Google</a>, a <a href="http://en.wikipedia.org/wiki/Mountain_View,_California" target="_blank">Mountain View</a>!</p>
<p><a href="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/12/Googlelogo.png" rel="lightbox[1684]"><img class="aligncenter size-full wp-image-1691" title="" src="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/12/Googlelogo.png" alt="" width="500" height="177" /></a></p>
<p>El passat dilluns 12 vaig fer una entrevista amb un investigador de <a href="http://research.google.com/" target="_blank">Google Research</a>, a les 19.30h de la nit. Va durar un poc més de mitja hora, més culpa de les meves preguntes que no pas de les seves. Jo vaig eixir amb molt bona sensació de l&#8217;entrevista: tenia experiència relacionada amb el projecte, m&#8217;agradaven molt els dos projectes que em proposava i vaig saber demostrar-li que tenia els coneixements i la il·lusió per a fer el treball, que és del que es tractava. Unes hores més tard, rebia un correu de RH informant-me de que volien comptar amb mi aquest estiu i que els diguera les dates de començament i acabament de les pràctiques.</p>
<p>Avui, m&#8217;han cridat de matí des de Facebook i els he hagut de dir que no podia seguir fent entrevistes amb ells i per la vesprada m&#8217;han cridat els de Google per a donar-me tots els detalls sobre el contracte i demanar-me la meva pre-acceptació (encara no he firmat cap contracte, me l&#8217;enviaran per correu).</p>
<p>Com podreu comprendre, estic que me&#8217;n puge per les parets!  Per a qualsevol informàtic, treballar a Google és com treballar a la <a href="http://www.nasa.gov/" target="_blank">NASA</a> o al <a href="http://public.web.cern.ch/public/" target="_blank">CERN</a> per a un físic, per a <a href="http://www.ferrari.com/" target="_blank">Ferrari</a> per a un enginyer en mecànica, o que sé jo!</p>
<p>No obstant això, l&#8217;important no és estar ací o allà, és el que fas en el lloc. La grandesa de treballar a Google no és el propi fet de treballar allà i que tingues menjar i massatges gratis, sinó de tot el que pots fer i el que pots aprendre amb la enorme quantitat de dades i del personal humà que tenen. Quan tens la oportunitat de treballar i aprendre amb la <a href="http://en.wikipedia.org/wiki/Category:Google_employees" target="_blank">gent</a> que ha escrit els llibres i publicacions que has estat estudiant, amb la gent que marca les tendències en allò que t&#8217;apassiona: no pots negar-te, no vols fer-ho.</p>
<p>Fa mig any us descrivia <a href="http://www.elvoldelhomeocell.net/archives/1094" target="_blank">el més prop que havia estat mai d&#8217;aquests genis</a>, ara ja estic més prop. Moltes gràcies a tots els que m&#8217;han ajudat a assolir-lo i han confiat en mi: als meus pares i la meua germana, a Anna, als amics del poble i la universitat, professors d&#8217;institut amb els que he aprés un muntó, professors d&#8217;universitat amb els que he aprés més encara (especial agraïment a Moisés per confiar en mi oferint-me una beca quan encara no havia començat ni el 3r curs, i que ha sigut un factor clau) i moltes gràcies també a <a href="http://liboh.wordpress.com/" target="_blank">Ivan</a> que en el seu moment m&#8217;ajudà a preparar el CV i em dona un bon grapat de consells.</p>
<p>Ho haig de reconèixer: sóc una persona amb sort, <strong>molta sort</strong>.</p>
<p>PS: Amb este <em>subidón</em> d&#8217;adrenalina, qui estudia ara?!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elvoldelhomeocell.net/archives/1684/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Viu</title>
		<link>http://www.elvoldelhomeocell.net/archives/1680</link>
		<comments>http://www.elvoldelhomeocell.net/archives/1680#comments</comments>
		<pubDate>Tue, 13 Dec 2011 16:46:03 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Erasmus]]></category>
		<category><![CDATA[Estudis]]></category>
		<category><![CDATA[Jo]]></category>
		<category><![CDATA[Viatges]]></category>
		<category><![CDATA[acm]]></category>
		<category><![CDATA[coses meves]]></category>
		<category><![CDATA[erasmus]]></category>
		<category><![CDATA[exàmens]]></category>
		<category><![CDATA[friki]]></category>
		<category><![CDATA[icpc]]></category>
		<category><![CDATA[kiruna]]></category>
		<category><![CDATA[oracle de woody allen]]></category>
		<category><![CDATA[suècia]]></category>
		<category><![CDATA[swerc]]></category>

		<guid isPermaLink="false">http://www.elvoldelhomeocell.net/?p=1680</guid>
		<description><![CDATA[Seguisc viu, si no he escrit res des de fa més de 30 dies és perquè he estat prou ocupat. Vaig participar un any més a la SWERC, una de les fases del Campionat Internacional de Programació organitzat per la ACM i &#8230; <a href="http://www.elvoldelhomeocell.net/archives/1680">Continua llegint <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Seguisc viu, si no he escrit res des de fa més de 30 dies és perquè he estat prou ocupat.</p>
<p>Vaig participar un any més a la <a href="http://swerc.eu/" target="_blank">SWERC</a>, una de les fases del <a href="http://cm.baylor.edu/welcome.icpc" target="_blank">Campionat Internacional de Programació</a> organitzat per la <a href="http://www.acm.org/" target="_blank">ACM</a> i que enguany es cel·lebrava de nou en la Complutense de Madrid (vaig poder viure sobre el terreny la victòria del PP, quina &#8220;alegria&#8221;). Ja que estava allí, vaig aprofitar per passar uns quants dies en <em>Egpaña</em>, que feia temps que no la xafava.</p>
<p>En tornar a Suècia vam fer un viatget, Fernando, <a href="http://alloquenotenom.wordpress.com/" target="_blank">Adrià</a> i jo, a <a href="http://en.wikipedia.org/wiki/Kiruna" target="_blank">Kiruna</a>: una ciutat situada al nord de Suècia, en la regió de Lapònia i ben al nord que està! Literalment, al <a href="http://www.exodus.co.uk/assets/images/trips/maps/trips/csd.jpg" target="_blank" rel="lightbox[1680]">pol nord</a>.</p>
<p>Vam veure la neu que encara no havíem vist en Suècia (mira que trobar-nos amb l&#8217;any més càlid des de fa molt de temps ací, per un any que venim!) i vam passejar amb trineu guiat per <em>huskies</em> (una pasta que ens va costar, per cert). El que no vam poder veure van ser les aurores boreals. En fi, hi haurà que tornar per allà dalt per veure-les.</p>
<p>I les últimes setmanes han sigut per a acabar un <a href="http://xp-dev.com/svn/daiia/project/" target="_blank">projecte</a> de la &#8220;meravellosa&#8221; assignatura que estic fent ara: <em><a href="http://www.ict.kth.se/courses/ID2209/" target="_blank">Distributed Artificial Intelligence and Intelligent Agents</a></em>. Un nom molt <em>bonico</em> i res més: decepció absoluta que m&#8217;he endut amb eixa assignatura.</p>
<p>Tot això, mesclat amb una bona dosi de <em>frikisme</em> per la meva part programant una nova forma de fer la correcció automàtica en l&#8217;oracle utilitzant <a href="http://en.wikipedia.org/wiki/Hidden_Markov_model" target="_blank">HMMs</a>. Però això ja tindrà el seu post més endavant. Ara toca una setmana d&#8217;estudi per a l&#8217;esmentada assignatura i preparar-se per a la tornada a casa, el dia 22 de desembre. Promet que en tornar a casa us escriuré més detalladament les últimes novetats.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elvoldelhomeocell.net/archives/1680/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Correcció automàtica en l&#8217;Oracle: Trie</title>
		<link>http://www.elvoldelhomeocell.net/archives/1553</link>
		<comments>http://www.elvoldelhomeocell.net/archives/1553#comments</comments>
		<pubDate>Sat, 05 Nov 2011 16:20:41 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Informàtica]]></category>
		<category><![CDATA[Jo]]></category>
		<category><![CDATA[Programació]]></category>
		<category><![CDATA[Projectes]]></category>
		<category><![CDATA[algorismes]]></category>
		<category><![CDATA[cerca aproximada]]></category>
		<category><![CDATA[complexitat computacional]]></category>
		<category><![CDATA[correcció automàtica]]></category>
		<category><![CDATA[estructures de dades]]></category>
		<category><![CDATA[friki]]></category>
		<category><![CDATA[oracle de woody allen]]></category>
		<category><![CDATA[trie]]></category>

		<guid isPermaLink="false">http://www.elvoldelhomeocell.net/?p=1553</guid>
		<description><![CDATA[Continuem amb la segona alternativa que vaig fer servir per a permetre la correcció automàtica, o si voleu cerca aproximada. Ja us vaig comentar en l&#8217;anterior entrada els problemes que presenta la cerca dicotòmica amb cadenes ordenades per ordre lexicogràfic &#8230; <a href="http://www.elvoldelhomeocell.net/archives/1553">Continua llegint <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Continuem amb la <a href="http://www.elvoldelhomeocell.net/archives/1515" target="_blank">segona</a> alternativa que vaig fer servir per a permetre la <a href="http://en.wikipedia.org/wiki/Spell_checker" target="_blank">correcció automàtica</a>, o si voleu <a href="http://en.wikipedia.org/wiki/Approximate_string_matching" target="_blank">cerca aproximada</a>.</p>
<p>Ja us vaig comentar en l&#8217;anterior entrada els problemes que presenta la cerca dicotòmica amb cadenes ordenades per ordre lexicogràfic per a buscar alternatives a una cerca que conté algun error. Semblava doncs que l&#8217;ordre lexicogràfic no era suficient per a establir la relació que jo necessitava entre els noms de les persones, així que la segona idea que vaig tenir és la d&#8217;utilitzar la famosa <a href="http://en.wikipedia.org/wiki/Levenshtein_distance" target="_blank">distància de Levenshtein</a>.</p>
<p>Sols comentar que quan estava escrivint aquest post em vaig adonar que tenia un greu error en el meu algorisme, de fet vaig haver de canviar-lo. Això em va servir per a entendre bé aquest nou algorisme que explique ací i millorar alguns aspectes en la implementació del meu programa. Eixe és el motiu pel qual m&#8217;ha dut quasi una setmana publicar aquesta entrada.</p>
<p>Avisar-vos també que aquest post és molt més llarg i pesat que l&#8217;anterior, això sí, molt més interessant també. Els algorismes que ací descric no són cosa meua i poden haver errors en la descripció de l&#8217;algorisme o la seva complexitat. Evidentment, aquest blog no tracta de ser una font de referència i no deuríeu de confiar excessivament en els detalls que s&#8217;expliquen ja que poden ser imprecisos o inclús erronis. Si us interessa el tema i voleu informació en la que pugueu confiar més, sols heu de cercar els termes en articles de la <a href="http://en.wikipedia.org" target="_blank">Wikipedia</a> o els algorismes en publicacions de <a href="http://scholar.google.com/" target="_blank">Google Scholar</a>.</p>
<p>Fet aquest avís, comencem.</p>
<p><strong id="damerau-levenshtein">Distància de Damerau-Levenshtein</strong></p>
<p>La <a href="http://en.wikipedia.org/wiki/Levenshtein_distance" target="_blank">distància de Levenshtein</a> mesura la distància d&#8217;edició entre dues cadenes de text en termes d&#8217;insercions, esborrats i substitucions. Això és, el nombre mínim d&#8217;aquestes operacions que són necessàries per transformar una cadena <em>A</em> en una altra cadena <em>B</em>. Si volem comptar també les transposicions com a operacions, la mètrica s&#8217;anomena distància de <a href="http://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance" target="_blank">Damerau-Levenshtein</a>. L&#8217;algorisme utilitzat per a computar aquesta mètrica és un clàssic de qualsevol curs de <a href="http://en.wikipedia.org/wiki/Dynamic_programming" target="_blank">programació dinàmica</a>. </p>
<p>Intentaré explicar l&#8217;algorisme de manera breu. Imaginem que volem calcular la distància d&#8217;una cadena <em>X</em> a una cadena <em>Y</em>. Llavors és construeix una matriu <em>D</em> de <em>|X|+1</em> files i <em>|Y|+1</em> columnes. L&#8217;element <img src='http://s.wordpress.com/latex.php?latex=D_%7Bij%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='D_{ij}' title='D_{ij}' class='latex' /> indica quina és la distància de la subcadena <img src='http://s.wordpress.com/latex.php?latex=x_1%20%5Cldots%20x_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='x_1 \ldots x_i' title='x_1 \ldots x_i' class='latex' /> a la subcadena <img src='http://s.wordpress.com/latex.php?latex=y_1%20%5Cldots%20y_j&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='y_1 \ldots y_j' title='y_1 \ldots y_j' class='latex' />. La fila 0 i la columna 0 representen les distàncies de la cadena <img src='http://s.wordpress.com/latex.php?latex=%5Cepsilon&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\epsilon' title='\epsilon' class='latex' /> a <img src='http://s.wordpress.com/latex.php?latex=y_1%20%5Cldots%20y_j&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='y_1 \ldots y_j' title='y_1 \ldots y_j' class='latex' /> i de la cadena <img src='http://s.wordpress.com/latex.php?latex=x_1%20%5Cldots%20x_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='x_1 \ldots x_i' title='x_1 \ldots x_i' class='latex' /> a <img src='http://s.wordpress.com/latex.php?latex=%5Cepsilon&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\epsilon' title='\epsilon' class='latex' /> respectivament (<img src='http://s.wordpress.com/latex.php?latex=%5Cepsilon&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\epsilon' title='\epsilon' class='latex' /> és la cadena buida, aquella que no conté cap símbol).</p>
<p>Doncs bé, la fórmula per a calcular cada element de la taula és la següent.<img src="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/11/formula_d.png" alt="" title="formula_d" width="300" height="120" class="aligncenter size-full wp-image-1605" /></p>
<p><img src="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/11/formula_s.png" alt="" title="formula_s" width="138" height="43" class="aligncenter size-full wp-image-1606" /></p>
<p><img src="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/11/formula_t.png" alt="" title="formula_t" width="213" height="43" class="aligncenter size-full wp-image-1607" /></p>
<p>Ací teniu un exemple de com quedaria matriu per a les cadenes <em>hola</em> i <em>poal</em>.</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%20%20%5Cbegin%7Barray%7D%7B%7Cc%7Cc%7Cc%7Cc%7Cc%7Cc%7C%7D%20%20%5Chline%20D%20%26%20%5Cepsilon%20%26%20p%20%26%20o%20%26%20a%20%26%20l%20%5C%5C%20%20%5Chline%20%5Cepsilon%20%26%200%20%26%201%20%26%202%20%26%203%20%26%204%20%5C%5C%20%20%5Chline%20h%20%26%201%20%26%201%20%26%202%20%26%203%20%26%204%5C%5C%20%20%5Chline%20o%20%26%202%20%26%202%20%26%201%20%26%202%20%26%203%5C%5C%20%20%5Chline%20l%20%26%203%20%26%203%20%26%202%20%26%202%20%26%202%5C%5C%20%20%5Chline%20a%20%26%204%20%26%204%20%26%203%20%26%202%20%26%202%5C%5C%20%20%5Chline%20%20%5Cend%7Barray%7D%20%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='  \begin{array}{|c|c|c|c|c|c|}  \hline D &amp; \epsilon &amp; p &amp; o &amp; a &amp; l \\  \hline \epsilon &amp; 0 &amp; 1 &amp; 2 &amp; 3 &amp; 4 \\  \hline h &amp; 1 &amp; 1 &amp; 2 &amp; 3 &amp; 4\\  \hline o &amp; 2 &amp; 2 &amp; 1 &amp; 2 &amp; 3\\  \hline l &amp; 3 &amp; 3 &amp; 2 &amp; 2 &amp; 2\\  \hline a &amp; 4 &amp; 4 &amp; 3 &amp; 2 &amp; 2\\  \hline  \end{array}  ' title='  \begin{array}{|c|c|c|c|c|c|}  \hline D &amp; \epsilon &amp; p &amp; o &amp; a &amp; l \\  \hline \epsilon &amp; 0 &amp; 1 &amp; 2 &amp; 3 &amp; 4 \\  \hline h &amp; 1 &amp; 1 &amp; 2 &amp; 3 &amp; 4\\  \hline o &amp; 2 &amp; 2 &amp; 1 &amp; 2 &amp; 3\\  \hline l &amp; 3 &amp; 3 &amp; 2 &amp; 2 &amp; 2\\  \hline a &amp; 4 &amp; 4 &amp; 3 &amp; 2 &amp; 2\\  \hline  \end{array}  ' class='latex' /></p>
<p>Si mirem l&#8217;element <img src='http://s.wordpress.com/latex.php?latex=D_%7B4%2C4%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='D_{4,4}' title='D_{4,4}' class='latex' /> de la taula, veiem que la distància de Damerau-Levenshtein entre les dues cadenes és 2 (transformacion: <em>hola</em>-><em>pola</em>-><em>poal</em>). Fixeu-vos que és menor que la distància de Levenshtein (que no admet transposicions) i que seria 3.</p>
<p>La gràcia d&#8217;aquest algorisme és que pot anar construint-se fila a fila i columna a columna, de manera que el cost temporal de l&#8217;algorisme per a dues cadenes de longituds <em>m</em> i <em>n</em> és <img src='http://s.wordpress.com/latex.php?latex=O%28m%20%5Ccdot%20n%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(m \cdot n)' title='O(m \cdot n)' class='latex' />, a l&#8217;igual que el cost espacial.</p>
<p>El problema d&#8217;aquesta mètrica és el cost: no és lineal. No era una alternativa adequada simplement computar per a cada cerca la seva distància de Damerau-Levenshtein amb els noms de les persones i quedar-me amb aquelles amb un mínim error. Suposant que tenim <em>n</em> persones i la longitud dels seus noms és aproximadament <em>l</em>, el cost temporal d&#8217;aquesta cerca seria <img src='http://s.wordpress.com/latex.php?latex=O%28n%20%5Ccdot%20l%5E2%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(n \cdot l^2)' title='O(n \cdot l^2)' class='latex' />, un cost massa alt si el comparem amb el de la cerca dicotòmica (<img src='http://s.wordpress.com/latex.php?latex=O%28l%20%5Ccdot%20%5Clog_2%20n%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(l \cdot \log_2 n)' title='O(l \cdot \log_2 n)' class='latex' />).</p>
<p><strong id="damerau-levenshtein-ukkonen">Millora d&#8217;Ukkonen</strong></p>
<p>El primer que hem de tenir clar és que no necessitem saber la distància exacta entre dues paraules. Imaginem que un usuari s&#8217;equivoca escrivint la paraula que busca i escriu <em>ocel</em>. Què serà més probable, que l&#8217;usuari estigués buscant una paraula que està a una distància 1 (p.ex: <em>ocell</em>) o que estigués buscant una paraula a una distància 5 (p.ex: <em>tomaca</em>)? Realment, sols estem interessats en saber si la distància entre dues cadenes <em>X</em> i <em>Y</em> és menor o igual que un cert llindar <em>k</em>.</p>
<p>Si estem calculant la distància entre dues cadenes i tenim una fila per a la qual, cap element és menor o igual que <em>k</em>, llavors cap element de les següents files serà menor o igual que <em>k</em>.</p>
<p>A més, siga <img src='http://s.wordpress.com/latex.php?latex=C_i%20%3D%20j&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='C_i = j' title='C_i = j' class='latex' />, l&#8217;última columna <em>j</em> per a la fila <em>i</em> tal que <img src='http://s.wordpress.com/latex.php?latex=D_%7Bi%2Cj%7D%20%5Cleq%20k&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='D_{i,j} \leq k' title='D_{i,j} \leq k' class='latex' />, llavors quan construïm la fila <em>i</em> sols haurem de fer-ho fins la columna <img src='http://s.wordpress.com/latex.php?latex=C_%7Bi-1%7D%2B1&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='C_{i-1}+1' title='C_{i-1}+1' class='latex' />, ja que els elements de les columnes posteriors tindran un valor <img src='http://s.wordpress.com/latex.php?latex=D_%7Bi%2Cj%7D%20%3E%20k&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='D_{i,j} &gt; k' title='D_{i,j} &gt; k' class='latex' />.</p>
<p>Ací teniu un exemple de com quedaria la matriu per a les cadenes <em>hola</em> i <em>poal</em>, amb un valor de <em>k</em> igual a 1.</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%20%20%5Cbegin%7Barray%7D%7B%7Cc%7C%7Cc%7Cc%7Cc%7Cc%7Cc%7Cc%7C%7D%20%20%5Chline%20C%20%26%20D%20%26%20%5Cepsilon%20%26%20p%20%26%20o%20%26%20a%20%26%20l%20%5C%5C%20%20%5Chline%201%20%26%20%5Cepsilon%20%26%200%20%26%201%20%26%20%20%26%20%20%26%20%20%5C%5C%20%20%5Chline%201%20%26%20h%20%26%201%20%26%201%20%26%202%20%26%20%20%26%20%5C%5C%20%20%5Chline%202%20%26%20o%20%26%202%20%26%202%20%26%201%20%26%20%20%26%20%5C%5C%20%20%5Chline%200%20%26%20l%20%26%203%20%26%203%20%26%202%20%26%202%20%26%20%5C%5C%20%20%5Chline%200%20%26%20a%20%26%20%20%26%20%20%26%20%20%26%20%20%26%20%5C%5C%20%20%5Chline%20%20%5Cend%7Barray%7D%20%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='  \begin{array}{|c||c|c|c|c|c|c|}  \hline C &amp; D &amp; \epsilon &amp; p &amp; o &amp; a &amp; l \\  \hline 1 &amp; \epsilon &amp; 0 &amp; 1 &amp;  &amp;  &amp;  \\  \hline 1 &amp; h &amp; 1 &amp; 1 &amp; 2 &amp;  &amp; \\  \hline 2 &amp; o &amp; 2 &amp; 2 &amp; 1 &amp;  &amp; \\  \hline 0 &amp; l &amp; 3 &amp; 3 &amp; 2 &amp; 2 &amp; \\  \hline 0 &amp; a &amp;  &amp;  &amp;  &amp;  &amp; \\  \hline  \end{array}  ' title='  \begin{array}{|c||c|c|c|c|c|c|}  \hline C &amp; D &amp; \epsilon &amp; p &amp; o &amp; a &amp; l \\  \hline 1 &amp; \epsilon &amp; 0 &amp; 1 &amp;  &amp;  &amp;  \\  \hline 1 &amp; h &amp; 1 &amp; 1 &amp; 2 &amp;  &amp; \\  \hline 2 &amp; o &amp; 2 &amp; 2 &amp; 1 &amp;  &amp; \\  \hline 0 &amp; l &amp; 3 &amp; 3 &amp; 2 &amp; 2 &amp; \\  \hline 0 &amp; a &amp;  &amp;  &amp;  &amp;  &amp; \\  \hline  \end{array}  ' class='latex' /></p>
<p>Si consultem el valor de l&#8217;element <img src='http://s.wordpress.com/latex.php?latex=D_%7Bi%2Cj%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='D_{i,j}' title='D_{i,j}' class='latex' /> aquest sols és vàlid si <img src='http://s.wordpress.com/latex.php?latex=C_i%20%3E%200&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='C_i &gt; 0' title='C_i &gt; 0' class='latex' />. Si no és així, sabem que <img src='http://s.wordpress.com/latex.php?latex=D_%7Bi%2Cj%7D%20%3E%20k&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='D_{i,j} &gt; k' title='D_{i,j} &gt; k' class='latex' />.</p>
<p>Doncs bé, tenint en compte aquesta millora, el cost temporal de l&#8217;algorisme es redueix a <img src='http://s.wordpress.com/latex.php?latex=O%28k%5E2%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(k^2)' title='O(k^2)' class='latex' />, segons diu la <a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.37.2019&#038;rep=rep1&#038;type=pdf" target="_blank">publicació</a> d&#8217;on vaig treure l&#8217;algorisme.</p>
<p>Així i tot, no resulta interessant aplicar aquest algorisme sobre tots els noms ja que el cost estaria en <img src='http://s.wordpress.com/latex.php?latex=O%28n%20%5Ctimes%20k%5E2%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(n \times k^2)' title='O(n \times k^2)' class='latex' />. Per a <em>k</em> xicotetes és molt menor que <img src='http://s.wordpress.com/latex.php?latex=O%28n%20%5Ctimes%20l%5E2%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(n \times l^2)' title='O(n \times l^2)' class='latex' /> de la idea original, però que encara es pot millorar.</p>
<p>Necessitava tenir els noms de les persones representats d&#8217;alguna manera per a estalviar-me treball reduir aquest cost. I ací és on entren en joc els <em><a href="http://en.wikipedia.org/wiki/Trie" target="_blank">tries</a></em>.</p>
<p><strong id="trie">Trie</strong></p>
<p>Un <em>trie</em> no és més que un arbre de prefixes. El node arrel representa el prefixe de la cadena buida (o <img src='http://s.wordpress.com/latex.php?latex=%5Cepsilon&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\epsilon' title='\epsilon' class='latex' />). Cada aresta de l&#8217;arbre s&#8217;etiqueta amb un símbol de l&#8217;alfabet <img src='http://s.wordpress.com/latex.php?latex=%5CSigma&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\Sigma' title='\Sigma' class='latex' />, de manera que el node representa el prefix format per la concatenació de tots els símbols en les arestes des de l&#8217;arrel fins a l&#8217;esmentat node.</p>
<p>Vegem-ho més clar en un exemple. Suposem que tenim els noms de <a href="http://en.wikipedia.org/wiki/Alan_Turing" target="_blank">Alan</a>, <a href="http://en.wikipedia.org/wiki/Andrew_S._Tanenbaum" target="_blank">Andrew</a>, <a href="http://en.wikipedia.org/wiki/Leslie_Lamport" target="_blank">Leslie</a>, <a href="http://en.wikipedia.org/wiki/Johan_H%C3%A5stad" target="_blank">Johan</a> i <a href="http://en.wikipedia.org/wiki/John_Hopcroft" target="_blank">John</a>. El trie que representaria tots aquests noms és el següent.<br />
<img src="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/11/trie1.png" alt="" title="trie1" width="350" height="633" class="aligncenter size-full wp-image-1564" /></p>
<p>Com vegeu, les fulles de l&#8217;arbre corresponen al nom complet d&#8217;alguna de les persones: <em>allan</em>, <em>john</em>, <em>johan</em>, <em>andrew</em> i <em>leslie</em> (recorreguent l&#8217;arbre en amplada).</p>
<p>Un dels avantatges d&#8217;utilitzar un arbre de prefixes és que el cost de buscar una persona no depèn del nombre de persones. Amb una cadena de longitud <em>l</em>, el cost de la cerca és <img src='http://s.wordpress.com/latex.php?latex=O%28l%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(l)' title='O(l)' class='latex' />. Simplement hem de descendir de nivell en nivell en l&#8217;arbre per a cada lletra del nom. </p>
<p><strong id="radixtree">Compressió de camins</strong></p>
<p>El problema dels tries, com ja podreu deduir de la imatge anterior és l&#8217;espai que ocupen en memòria. Suposant de nou que totes les cadenes tenen la mateixa longitud <em>l</em>, en el pitjor dels casos, cap de les <em>n</em> cadenes codificades en l&#8217;arbre tindrà un prefixe comú i en aquest cas el nombre de nodes és <img src='http://s.wordpress.com/latex.php?latex=O%28n%20%5Ccdot%20l%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(n \cdot l)' title='O(n \cdot l)' class='latex' /> (encara que això sols passar quan <img src='http://s.wordpress.com/latex.php?latex=n%20%5Cleq%20%5Cvert%20%5CSigma%20%5Cvert&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='n \leq \vert \Sigma \vert' title='n \leq \vert \Sigma \vert' class='latex' />). </p>
<p>A primera vista sembla que no és gran cosa, ja que té el mateix cost temporal que mantenir els noms en un vector. El problema és que necessitem emmagatzemar per a cada node quins són els seus descendents.</p>
<p>Si volem mantenir el cost de cerca <img src='http://s.wordpress.com/latex.php?latex=O%28l%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(l)' title='O(l)' class='latex' />, necessitem determinar en cost <img src='http://s.wordpress.com/latex.php?latex=O%281%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(1)' title='O(1)' class='latex' /> per quina branca em de descendir quan busquem una cadena. La resposta en aquest cas és evident: Mantenir un vector de punters amb tants elements com símbols té l&#8217;alfabet amb el que treballem. Si hi ha algun descendent en el node per al símbol <em>i</em>, el punter <img src='http://s.wordpress.com/latex.php?latex=p_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_i' title='p_i' class='latex' /> apuntarà a aquest descendent. Mentre que si <img src='http://s.wordpress.com/latex.php?latex=p_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_i' title='p_i' class='latex' /> és nul, sabem que no hi ha cap descendent del node actual per al símbol <em>i</em>. D&#8217;aquesta manera, el cost espacial de mantenir l&#8217;arbre de prefixos és <img src='http://s.wordpress.com/latex.php?latex=O%28%20l%20%5Ccdot%20n%20%5Ccdot%20%5Cvert%20%5CSigma%20%5Cvert%20%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O( l \cdot n \cdot \vert \Sigma \vert )' title='O( l \cdot n \cdot \vert \Sigma \vert )' class='latex' />.</p>
<p>El cost ja no és tan atractiu com semblava. Suposem que el nostre alfabet té 26 caràcters (de la <em>a</em> a la <em>z</em>), que tenim 3 milions de persones i la longitud mitjana dels noms és de 30 caràcters. Suposant que els punters són de 4 bytes, com serien en un processador de 32 bits, mantenir aquesta estructura podria necessitar al voltant de 9GB! </p>
<p>Evidentment, en la realitat el nombre de nodes és molt menor ja que els noms sí que tenen prefixos en comú així i tot en la realitat no només tenim 26 caràcters en l&#8217;alfabet: els noms de les persones de <a href="http://www.imdb.com" target="_blank">IMDB</a> inclouen també números, espais, símbols d&#8217;exclamació, caràcters accentuats i caràcters d&#8217;altres alfabets que no són el llatí (ciríl·lic o grec, per exemple).</p>
<p>Com solucionem aquest problema? En primer lloc, tractant de reduir el nombre de nodes i això pot fer-se fàcilment utilitzant compressió de camins en l&#8217;arbre. Què és la compressió de camins? Fixeu-se en el primer arbre que us he presentat. Veureu que molts dels nodes sols tenen un descendent. No seria possible unir en un únic node tots els nodes que tenen un únic descendent? Això és la compressió de camins i aquest <em>trie</em> s&#8217;anomena <em><a href="http://en.wikipedia.org/wiki/Radix_tree" target="_blank">Radix Tree</a></em>. Veieu com quedaria l&#8217;arbre anterior amb els camins comprimits.<br />
<img src="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/10/trie2.png" alt="" title="trie2" width="350" height="304" class="aligncenter size-full wp-image-1567" /></p>
<p><strong id="reduint-espai-nodes">Reduint l&#8217;espai dels nodes</strong></p>
<p>Una altra millora que pot fer-se per a reduir l&#8217;espai és intentar reduir el nombre de punters que s&#8217;emmagatzemen en cada node. Havíem dit que si volem mantenir el cost de cerca en <img src='http://s.wordpress.com/latex.php?latex=O%28l%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(l)' title='O(l)' class='latex' /> necessitem un vector de <img src='http://s.wordpress.com/latex.php?latex=%5Cvert%20%5CSigma%20%5Cvert&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\vert \Sigma \vert' title='\vert \Sigma \vert' class='latex' /> punters. Però no podem reduir aquest nombre? La resposta és sí, però a costa d&#8217;incrementar el cost de cerca.</p>
<p>Una possible millora és emmagatzemar els punters en un arbre de cerca (en el meu cas he utilitzat el map de la STL de C++). Així, en cada node sols s&#8217;emmagatzema un punter per a cada descendent i no per a cada símbol de l&#8217;alfabet (per tant, no tenim punters nuls que ocupen memòria). Si en un node no hi ha cap punter per al símbol que busquem, llavors no hi ha descendent per a aquest símbol. D&#8217;aquesta manera el nombre de punters en cada node es redueix considerablement, especialment a mesura que es descendeix en l&#8217;arbre, que és també quan més nodes hi ha. Penseu que és probable que tinguem noms començant en totes les lletres (el node arrel tindrà tants descendents com símbols té l&#8217;alfabet), en canvi és poc probable que tinguem molts noms amb el mateix prefix i amb l&#8217;última lletra diferent (els nodes de nivells inferiors tindran pocs descendents).</p>
<p>El problema és que ara el cost de cercar una cadena en el trie és <img src='http://s.wordpress.com/latex.php?latex=O%28l%20%5Ccdot%20%5Clog_2%20p%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(l \cdot \log_2 p)' title='O(l \cdot \log_2 p)' class='latex' />, on <em>p</em> és el nombre de punters en els nodes (<img src='http://s.wordpress.com/latex.php?latex=p%20%5Cleq%20%5Cvert%20%5CSigma%20%5Cvert&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p \leq \vert \Sigma \vert' title='p \leq \vert \Sigma \vert' class='latex' />, normalment prou menor). </p>
<p>Amb totes aquestes millores, el meu programa ocupa ara mateixa 3686MB en memòria, que és bastant menys dels 9GB que comentàvem al començament. Hi ha que tenir en compte a més, que aquests 3686MB no són només del <em>trie</em> sinó també de mantenir els títols de les pel·lícules, el graf que relaciona pel·lícules i actors i tota la informació corresponent a cada persona i pel·lícula. </p>
<p>Comentaré també que em vaig endur una desagradable sorpresa al passar el programa d&#8217;una màquina de 32 bits a una de 64 bits: els punters van passar d&#8217;ocupar 4 bytes a ocupar-ne 8 i clar, emmagatzemar el mateix arbre necessitava el doble de memòria!</p>
<p><strong id="approximate-matching">Cerca aproximada</strong></p>
<p>Hem parlat molt de com emmagatzemar eficientment el <em>trie</em>, però encara no hem solucionat el problema que havíem plantejat: fer una cerca aproximada donada una cadena <em>X</em>. Ací és on unim l&#8217;algorisme de Damerau-Levenshtein explicat <a href="http://www.elvoldelhomeocell.net/?p=1553#damerau-levenshtein-ukkonen">abans</a> i els <em><a href="http://www.elvoldelhomeocell.net/?p=1553#trie">tries</a></em>.</p>
<p>Hi ha dos coses importants a tenir en compte a l&#8217;hora de calcular la distància de Damerau-Levenshtein sobre distintes cadenes:</p>
<ol>
<li>Al calcular la distància entre la cadena <em>X</em> i la cadena <em>YZ</em>, les <em>|Y|+1</em> primeres files de la matriu de Damerau-Levenshtein seran iguals a les del càlcul de la distància entre la cadena <em>X</em> i la cadena <em>Y</em>.</li>
<li>Si per al càlcul de la distància entre una cadena <em>X</em> i una cadena <em>Y</em>, totes les columnes de la fila <em>|Y|</em> tenen un valor major que <em>k</em>, cap cadena amb el prefix <em>Y</em> estarà a una distància menor que <em>k</em> de <em>X</em>.</li>
</ol>
<p>El <em>trie</em> permet estalviar temps ja què la matriu de Damerau-Levenshtein va calculant-se iterativament quan descendim en l&#8217;arbre, pel que havíem comentat en la propietat (1). A més, tenint en compte la propietat (2), si per a un node la distància a la cadena buscada és major que un cert llindar <em>k</em> llavors sabem que cap dels descendents d&#8217;aquest node tindrà un llindar menor, de manera que no hem d&#8217;explorar els descendents. </p>
<p><img src="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/11/approximate_lookup_algorithm.png" alt="" title="approximate_lookup_algorithm" width="454" height="274" class="aligncenter size-full wp-image-1655" /></p>
<p>Algunes consideracions sobre les operacions que apareixen en el pseudocodi. L&#8217;operació <img src='http://s.wordpress.com/latex.php?latex=update%28D%2C%20C%2C%20x%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='update(D, C, x)' title='update(D, C, x)' class='latex' /> el que fa és actualitzar la matriu <em>D</em> afegint <em>|x|</em> files i computant el valor dels nous elements i el vector <em>C</em> com he explicat en la millora de Ukkonen.</p>
<p>L&#8217;operació <img src='http://s.wordpress.com/latex.php?latex=dist%28D%27%2C%20C%27%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='dist(D&#039;, C&#039;)' title='dist(D&#039;, C&#039;)' class='latex' /> el que fa es tornar el valor de l&#8217;element <img src='http://s.wordpress.com/latex.php?latex=D%27_%7B%7Cv%7C%20%2C%20%7Cw%7C%20%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='D&#039;_{|v| , |w| }' title='D&#039;_{|v| , |w| }' class='latex' /> tenint en compte que potser aquest element no ha arribat a calcular-se en l&#8217;operació <em>update</em>. Aquest valor és la distància que hi ha entre les cadenes <em>v</em> i <em>w</em> si aquesta distància és menor o igual que <em>k</em>, o <em>k+1</em> en cas contrari.</p>
<p>La gràcia d&#8217;aquest algorisme és que té una complexitat temporal de <img src='http://s.wordpress.com/latex.php?latex=O%28k%20%5Ctimes%20%7B%5Cvert%20%5CSigma%20%5Cvert%7D%5Ek%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(k \times {\vert \Sigma \vert}^k)' title='O(k \times {\vert \Sigma \vert}^k)' class='latex' />, segons l&#8217;article que us citava <a href="http://www.elvoldelhomeocell.net/?p=1553#damerau-levenshtein-ukkonen">abans</a>. Això suposant que l&#8217;arbre de prefixos és complet i que cada node emmagatzema un vector de punters als possibles descendents (és a dir, sense tenir en compte les millores per a <a href="http://www.elvoldelhomeocell.net/?p=1553#radixtree">reduir</a> <a href="http://www.elvoldelhomeocell.net/?p=1553#reduint-espai-nodes">espai</a>). </p>
<p>Fixeu-vos que l&#8217;algorisme no depèn del nombre de cadenes en el <em>trie</em>! Això significa que podem trobar els noms que més s&#8217;aproximen a una cerca feta per l&#8217;usuari sense importar quants noms tenim emmagatzemats. Una considerable millora front al cost <img src='http://s.wordpress.com/latex.php?latex=O%28n%20%5Ctimes%20k%5E2%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(n \times k^2)' title='O(n \times k^2)' class='latex' />, això sí, sempre que <em>k</em> siga menuda, perquè el cost creix de manera exponencial amb <em>k</em>!</p>
<p>El gràfic que es mostra ací baix és el temps mitjà de resposta per part de l&#8217;oracle quan es busca el nom d&#8217;un actor que no existeix en la base de dades. El valor de <em>k</em> que utilitze és <img src='http://s.wordpress.com/latex.php?latex=%5Cmin%283%2C%20%5Cleft%5Clfloor%20%5Cfrac%7B%7Cw%7C%7D%7B4%7D%20%5Cright%5Crfloor%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\min(3, \left\lfloor \frac{|w|}{4} \right\rfloor)' title='\min(3, \left\lfloor \frac{|w|}{4} \right\rfloor)' class='latex' />. Si usés un valor fixe per a <em>k</em> hi hauria molts suggeriments per a noms curts que realment no tenen massa sentit. Anem al cas extrem: imaginem que un usuari busca el nom <em>a</em>, té sentit suggerir-li els noms <em>b</em>, <em>c</em>, <em>d</em>, etc? La distància a tots ells és 1, però és que la longitud de la cadena era 1! Això significaria que l&#8217;usuari ha errat en el 100% de la cadena! Jo permet a l&#8217;usuari que s&#8217;equivoqui fins a un 25% de la longitud de la cadena. Però si la cadena cercada fos molt llarga el valor <em>k</em> seria molt gran, per això pose un límit al número d&#8217;errors a 3.</p>
<p><a href="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/11/lookup_times.png" rel="lightbox[1553]"><img src="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/11/lookup_times.png" alt="" title="lookup_times" width="400" height="250" class="aligncenter size-full wp-image-1660" /></a></p>
<p>Dir que l&#8217;<a href="http://en.wikipedia.org/wiki/Confidence_interval" target="_blank">interval de confiança</a> que es mostra és per a un valor crític del 95%. Crec que el gràfic no mereix més explicacions. El temps de resposta mitjà és de 0.208 segons amb totes les millores comentades. També apareix el temps de resposta utilitzant el càlcul de la distància de Damerau-Levenshtein sense la millora de Ukkonen (0.301 segons).</p>
<p><strong>Encara millor?</strong></p>
<p>Des del primer moment vaig tenir com a referència a Google i el seu &#8220;<em><a href="http://www.google.com/support/websearch/bin/answer.py?answer=1723" target="_blank">Did you mean&#8230;?</a></em>&#8220;. I tenia ben clar que els de Google no podien utilitzar un <em>trie</em> gegantí perquè el vocabulari amb el que treballen és enorme: imagineu totes les paraules diferents que poden haver en la WWW i el que suposaria construir un <em>trie</em> com el descrit! </p>
<p>Google utilitza un <a href="http://static.googleusercontent.com/external_content/untrusted_dlcp/research.google.com/en/us/pubs/archive/36180.pdf" target="_blank">enfocament</a> basat en <a href="http://en.wikipedia.org/wiki/Machine_learning" target="_blank">aprenentatge automàtic</a> i <a href="http://en.wikipedia.org/wiki/Natural_language_processing" target="_blank">processament del llenguatge natural</a>. I aquesta va ser la ruta que em vaig proposar seguir i que us explicaré en el pròxim post.</p>
<p>Mentrestant els <em>tries</em> han funcionat prou bé: són ràpids i sobretot obtenen els resultats que l&#8217;usuari espera. I poden ser una alternativa senzilla en situacions amb un vocabulari i un alfabet més reduït. Per exemple, per a construir un corrector automàtic en un editor de textos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elvoldelhomeocell.net/archives/1553/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Correcció automàtica en l&#8217;Oracle: cerca dicotòmica</title>
		<link>http://www.elvoldelhomeocell.net/archives/1515</link>
		<comments>http://www.elvoldelhomeocell.net/archives/1515#comments</comments>
		<pubDate>Mon, 31 Oct 2011 00:59:53 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Informàtica]]></category>
		<category><![CDATA[Jo]]></category>
		<category><![CDATA[Programació]]></category>
		<category><![CDATA[Projectes]]></category>
		<category><![CDATA[algorismes]]></category>
		<category><![CDATA[cerca aproximada]]></category>
		<category><![CDATA[cerca binària]]></category>
		<category><![CDATA[cerca dicotòmica]]></category>
		<category><![CDATA[complexitat computacional]]></category>
		<category><![CDATA[correcció automàtica]]></category>
		<category><![CDATA[friki]]></category>
		<category><![CDATA[oracle de woody allen]]></category>

		<guid isPermaLink="false">http://www.elvoldelhomeocell.net/?p=1515</guid>
		<description><![CDATA[La màxima &#8220;qui no te feina, Déu li&#8217;n busca&#8221; és ben certa, però a sovint alguns anem més enllà i ens en busquem de nova quan encara no hem acabat la que tenim entre mans. I si no tenia prou &#8230; <a href="http://www.elvoldelhomeocell.net/archives/1515">Continua llegint <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>La màxima &#8220;qui no te feina, Déu li&#8217;n busca&#8221; és ben certa, però a sovint alguns anem més enllà i ens en busquem de nova quan encara no hem acabat la que tenim entre mans. I si no tenia prou amb estar d&#8217;Erasmus, els <a href="http://ai-class.com" target="_blank">cursets</a> a <a href="http://ml-class.org" target="_blank">distància</a> de Stanford i la competició de <a href="http://aichallenge.org/" target="_blank">ai-challange.com</a>, farà un parell de setmanes que em ronda pel cap una nova millora per al meu Oracle de Woody Allen. Però bo, no vaig a queixar-me perquè no es pot dir que la feina vinga forçada.</p>
<p>Recordeu l&#8217;<a href="http://joapuipe.dyndns.org/allen/" target="_blank">Oracle de Woody Allen</a>? Ja us he parlat d&#8217;aquest xicotet projecte en <a href="http://www.elvoldelhomeocell.net/archives/990" target="_blank">altres</a> <a href="http://www.elvoldelhomeocell.net/archives/997" target="_blank">posts</a>, però us refrescaré la memòria. Es tracta d&#8217;una senzilla pàgina web que et permet trobar quina connexió uneix a dos persones del món del cinema (actors, directors, guionistes i productors). La idea és que si dos persones han treballat juntes en una pel·lícula, hi ha una distància de separació de 1. De la mateixa manera, Si la persona <em>A</em> ha treballat amb la persona <em>B</em>, i aquesta amb la pesona <em>C</em>, les persones <em>A</em> i <em>C</em> estan a una distància de 2. I així successivament.</p>
<p>No em centraré amb els detalls de com es calcula aquesta distància i la connexió (camí, en terminologia de grafs) perquè no és del que va aquest article, simplement dir que s&#8217;utilitza l&#8217;algorisme de <a href="http://en.wikipedia.org/wiki/Breadth-first_search" target="_blank">cerca per amplada</a>.</p>
<p>Des de les primeres versions, volia que el meu programa fora capaç de &#8220;tolerar&#8221; errades humanes. Per exemple, si un usuari escriu &#8220;Wody Allen&#8221; en lloc de &#8220;Woody Allen&#8221;, el meu programa fora capaç de suggerir-li una <a href="http://en.wikipedia.org/wiki/Spell_checker" target="_blank">correcció automàtica</a>. En els següents tres articles comentaré dues alternatives que ha utilitzat el programa per a solucionar el problema i finalment una tercera que encara no he implementat, però que us plantejaré ja que encara queden alguns detalls per polir i amb un poc de sort algú es decideix a aportar alguna idea.</p>
<p>Avise que el contingut de les pròximes entrades és molt tècnic. Per als dos primers articles necessitareu coneixements bàsics d&#8217;algorísmica i complexitat computacional, res que un alumne de primer o segon d&#8217;Enginyeria Informàtica no puga entendre. Per al tercer, a més, necessitareu coneixements bàsics d&#8217;aprenentatge automàtic, que inclou estadística bàsica (bàsicament, teorema de Bayes). </p>
<p><strong>Cerca dicotòmica</strong></p>
<p>La primera tècnica que vaig utilitzar per a proveir de correccions a l&#8217;usuari era l&#8217;algorisme de <a href="http://en.wikipedia.org/wiki/Binary_search" target="_blank">cerca dicotòmica</a> o binària.</p>
<p>La idea és mantenir els noms de les persones en <a href="http://en.wikipedia.org/wiki/Lexicographical_order" target="_blank">ordre lexicogràfic</a>. No vaig a explicar l&#8217;algorisme de la cerca dicotòmica, perquè entenc que si heu arribat fins ací el coneixeu.</p>
<p>El que fa l&#8217;algorisme és suggerir com a correccions els noms més pròxims (en ordre lexicogràfic) al nom introduït per l&#8217;usuari. Per a veure com funciona l&#8217;algorisme, suposarem que els noms de les persones són nombres enters. Imaginem que tenim el següent conjunt de nombres en un vector ordenat (<img src='http://s.wordpress.com/latex.php?latex=i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='i' title='i' class='latex' /> indica l&#8217;índex de l&#8217;element i <img src='http://s.wordpress.com/latex.php?latex=p&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p' title='p' class='latex' /> el <em>nom</em> de la persona):</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%20%20%5Cbegin%7Barray%7D%7B%7Cc%7Cc%7Cc%7Cc%7Cc%7Cc%7Cc%7C%7D%20%20%5Chline%20%20i%20%26%200%20%26%201%20%26%202%20%26%203%20%26%204%20%26%205%20%5C%5C%20%20%5Chline%20%20p%20%26%201%20%26%202%20%26%203%20%26%205%20%26%207%20%26%209%20%5C%5C%20%20%5Chline%20%20%5Cend%7Barray%7D%20%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='  \begin{array}{|c|c|c|c|c|c|c|}  \hline  i &amp; 0 &amp; 1 &amp; 2 &amp; 3 &amp; 4 &amp; 5 \\  \hline  p &amp; 1 &amp; 2 &amp; 3 &amp; 5 &amp; 7 &amp; 9 \\  \hline  \end{array}  ' title='  \begin{array}{|c|c|c|c|c|c|c|}  \hline  i &amp; 0 &amp; 1 &amp; 2 &amp; 3 &amp; 4 &amp; 5 \\  \hline  p &amp; 1 &amp; 2 &amp; 3 &amp; 5 &amp; 7 &amp; 9 \\  \hline  \end{array}  ' class='latex' /></p>
<p>Suposem que busquem la persona amb <em>nom</em> 6, llavors l&#8217;algorisme s&#8217;executaria de la següent forma:</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%20%20%5Cbegin%7Barray%7D%7B%7Cc%7Cc%7Cc%7Cc%7Cc%7C%7D%20%20%5Chline%20%5Ctext%7BIter.%7D%20%26%20l%20%26%20r%20%26%20c%20%26%20p_c%20%5C%5C%20%20%5Chline%201%20%26%200%20%26%205%20%26%202%20%26%203%20%5C%5C%20%20%5Chline%202%20%26%203%20%26%205%20%26%204%20%26%207%20%5C%5C%20%20%5Chline%203%20%26%203%20%26%203%20%26%203%20%26%205%20%5C%5C%20%20%5Chline%20%20%5Cend%7Barray%7D%20%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='  \begin{array}{|c|c|c|c|c|}  \hline \text{Iter.} &amp; l &amp; r &amp; c &amp; p_c \\  \hline 1 &amp; 0 &amp; 5 &amp; 2 &amp; 3 \\  \hline 2 &amp; 3 &amp; 5 &amp; 4 &amp; 7 \\  \hline 3 &amp; 3 &amp; 3 &amp; 3 &amp; 5 \\  \hline  \end{array}  ' title='  \begin{array}{|c|c|c|c|c|}  \hline \text{Iter.} &amp; l &amp; r &amp; c &amp; p_c \\  \hline 1 &amp; 0 &amp; 5 &amp; 2 &amp; 3 \\  \hline 2 &amp; 3 &amp; 5 &amp; 4 &amp; 7 \\  \hline 3 &amp; 3 &amp; 3 &amp; 3 &amp; 5 \\  \hline  \end{array}  ' class='latex' /></p>
<p>Com que l&#8217;últim element considerat (<img src='http://s.wordpress.com/latex.php?latex=p_c%5E%7B%283%29%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_c^{(3)}' title='p_c^{(3)}' class='latex' />) és menor que el cercat, es proposarien com a correccions els elements 5 (posició <img src='http://s.wordpress.com/latex.php?latex=c%5E%7B%283%29%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='c^{(3)}' title='c^{(3)}' class='latex' />) i 7 (posició <img src='http://s.wordpress.com/latex.php?latex=c%5E%7B%283%29%7D%20%2B%201&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='c^{(3)} + 1' title='c^{(3)} + 1' class='latex' />). En el cas de que l&#8217;últim element considerat fora major que el cercat, es proposarien com a correccions els elements en les posicions <img src='http://s.wordpress.com/latex.php?latex=c%5E%7B%283%29%7D%20-%201&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='c^{(3)} - 1' title='c^{(3)} - 1' class='latex' /> i <img src='http://s.wordpress.com/latex.php?latex=c%5E%7B%283%29%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='c^{(3)}' title='c^{(3)}' class='latex' />.</p>
<p>Fixeu-se que en cas de no trobar un element, sempre proposarem un element menor i un major. I a més, sempre seran els dos que més s&#8217;aproximen a l&#8217;element cercat.</p>
<p>El problema és que els noms no són enters i l&#8217;ordre lexicogràfic té un xicotet problema: Dos noms als que sols els hem canviat una lletra poden estar molt separats en ordre lexicogràfic. Ací un exemple que il·lustra el problema:</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%20%20%5Cbegin%7Barray%7D%7B%7Cc%7Cc%7Cc%7Cc%7Cc%7C%7D%20%20%5Chline%20i%20%26%200%20%26%201%20%26%202%20%26%203%20%5C%5C%20%20%5Chline%20p%20%26%20%5Ctext%7Bblai%7D%20%26%20%5Ctext%7Bjaume%7D%20%26%20%5Ctext%7Bjavi%7D%20%26%20%5Ctext%7Btoni%7D%20%5C%5C%20%20%5Chline%20%20%5Cend%7Barray%7D%20%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='  \begin{array}{|c|c|c|c|c|}  \hline i &amp; 0 &amp; 1 &amp; 2 &amp; 3 \\  \hline p &amp; \text{blai} &amp; \text{jaume} &amp; \text{javi} &amp; \text{toni} \\  \hline  \end{array}  ' title='  \begin{array}{|c|c|c|c|c|}  \hline i &amp; 0 &amp; 1 &amp; 2 &amp; 3 \\  \hline p &amp; \text{blai} &amp; \text{jaume} &amp; \text{javi} &amp; \text{toni} \\  \hline  \end{array}  ' class='latex' /></p>
<p>Suposem que en l&#8217;anterior situació, un usuari s&#8217;equivoca escrivint el nom de <em>J<strong>a</strong>ume</em> i escriu <em>J<strong>e</strong>ume</em>:</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%20%20%5Cbegin%7Barray%7D%7B%7Cc%7Cc%7Cc%7Cc%7Cc%7C%7D%20%20%5Chline%20%5Ctext%7BIter.%7D%20%26%20l%20%26%20r%20%26%20c%20%26%20p_c%20%5C%5C%20%20%5Chline%201%20%26%200%20%26%203%20%26%201%20%26%20%5Ctext%7Bjaume%7D%20%5C%5C%20%20%5Chline%202%20%26%202%20%26%203%20%26%202%20%26%20%5Ctext%7Bjavi%7D%20%5C%5C%20%20%5Chline%203%20%26%203%20%26%203%20%26%203%20%26%20%5Ctext%7Btoni%7D%20%5C%5C%20%20%5Chline%20%20%5Cend%7Barray%7D%20%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='  \begin{array}{|c|c|c|c|c|}  \hline \text{Iter.} &amp; l &amp; r &amp; c &amp; p_c \\  \hline 1 &amp; 0 &amp; 3 &amp; 1 &amp; \text{jaume} \\  \hline 2 &amp; 2 &amp; 3 &amp; 2 &amp; \text{javi} \\  \hline 3 &amp; 3 &amp; 3 &amp; 3 &amp; \text{toni} \\  \hline  \end{array}  ' title='  \begin{array}{|c|c|c|c|c|}  \hline \text{Iter.} &amp; l &amp; r &amp; c &amp; p_c \\  \hline 1 &amp; 0 &amp; 3 &amp; 1 &amp; \text{jaume} \\  \hline 2 &amp; 2 &amp; 3 &amp; 2 &amp; \text{javi} \\  \hline 3 &amp; 3 &amp; 3 &amp; 3 &amp; \text{toni} \\  \hline  \end{array}  ' class='latex' /></p>
<p>Llavors, les correccions proposades serien <em>Javi</em> i <em>Toni</em> i cap dels dos és el que l&#8217;usuari buscava.</p>
<p>Una possible millora és no sols considerar els dos noms al voltant del cercat, sinó considerar <em>k</em> noms més pròxims en ordre lexicogràfic (per exemple, amb <em>k</em> igual a 3, l&#8217;algorisme consideraria <em>Jaume</em>, <em>Javi</em> i <em>Toni</em>). Però aquesta solució no funciona massa bé quan el nombre d&#8217;elements en el vector és de més de dos milions i l&#8217;usuari s&#8217;equivoca en una de les primeres lletres del nom.</p>
<p>No obstant això, l&#8217;algorisme és molt eficient en quant a temps i memòria i sobre tot, és molt senzill. Suposant que tots els noms tenen aproximadament la mateixa longitud <em>l</em>, podem expressar la complexitat espacial i temporal (de cerca) en funció del nombre de persones <em>n</em> i aquesta longitud <em>l</em> (la suposició de la longitud <em>l</em> és sols per a simplificar les expressions de la complexitat).</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%20%20S%28n%2C%20l%29%20%5Cin%20O%20%5Cleft%28%20l%20%5Ccdot%20n%20%5Cright%29%20%5C%5C%20%20T%28n%2C%20l%29%20%5Cin%20O%20%5Cleft%28%20l%20%5Ccdot%20%5Clog_2%20n%20%5Cright%29%20%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='  S(n, l) \in O \left( l \cdot n \right) \\  T(n, l) \in O \left( l \cdot \log_2 n \right)  ' title='  S(n, l) \in O \left( l \cdot n \right) \\  T(n, l) \in O \left( l \cdot \log_2 n \right)  ' class='latex' /></p>
<p>La primera expressió es deriva del fet que tenim <em>n</em> noms i cada nom té una longitud de <em>l</em> caràcters. La segona expressió es deriva del fet que la cerca dicotòmica fa <img src='http://s.wordpress.com/latex.php?latex=O%28%5Clog_2%20n%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(\log_2 n)' title='O(\log_2 n)' class='latex' /> comparacions de cadenes, i per comparar dues cadenes de longitud <em>l</em> necessitem fins a <em>l</em> comparacions de caràcters.</p>
<p>Aquesta senzilla idea fou reemplaçada per una que donava millors resultats cara a l&#8217;usuari, però que té un fort inconvenient: l&#8217;ús de memòria. L&#8217;alternativa que presentaré en la pròxima entrada, és la que està implementada ara mateixa en l&#8217;Oracle.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elvoldelhomeocell.net/archives/1515/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>La cacatua</title>
		<link>http://www.elvoldelhomeocell.net/archives/1499</link>
		<comments>http://www.elvoldelhomeocell.net/archives/1499#comments</comments>
		<pubDate>Thu, 29 Sep 2011 18:18:35 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Curiositats]]></category>
		<category><![CDATA[Jo]]></category>
		<category><![CDATA[Vides desconegudes]]></category>
		<category><![CDATA[cacatua]]></category>
		<category><![CDATA[contes]]></category>
		<category><![CDATA[coses meves]]></category>
		<category><![CDATA[coses que passen]]></category>
		<category><![CDATA[estocolm]]></category>
		<category><![CDATA[suècia]]></category>

		<guid isPermaLink="false">http://www.elvoldelhomeocell.net/?p=1499</guid>
		<description><![CDATA[Havia pujat junt a mi al bus urbà en Fridhemsplan. Jo l&#8217;havia vista de lluny mentre esperàvem l&#8217;autobús i quan vaig ser dalt no vaig dubtar en asseure&#8217;m al seu costat per a poder veure-la bé. La dona soltera, d&#8217;uns &#8230; <a href="http://www.elvoldelhomeocell.net/archives/1499">Continua llegint <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Havia pujat junt a mi al bus urbà en Fridhemsplan. Jo l&#8217;havia vista de lluny mentre esperàvem l&#8217;autobús i quan vaig ser dalt no vaig dubtar en asseure&#8217;m al seu costat per a poder veure-la bé.</p>
<p>La dona soltera, d&#8217;uns seixanta anys, cansada dels infortunis que havia sofert en matèria amorosa, s&#8217;havia decantat per suplir les seves necessitats amb una bona dosi diària de gelat de fresa i la companyia d&#8217;animals exòtics. I aquell dia no era diferent: menjava un cucurutxo amb la mà esquerra i sobre la seva mà dreta l&#8217;acompanyava aquell animalot blanc que va captar la meva atenció: una cacatua.</p>
<p>Era de l&#8217;espècie <em>Cacatua galerita</em>. Tota blanca a excepció de la cresta groga i el bec i les potes de gris obscur. S&#8217;agafava amb l&#8217;ajuda de les urpes de la seva cuidadora amb cura per a no fer-li mal, però suficientment fort per a no caure davant dels imprevisibles i bruscs moviments de l&#8217;autobús ple de gent.</p>
<p>Des del seu particular observatori, creuant el Västerbroplan, parava atenció a tot el que esdevenia pel seu voltant: el jove amb ulleres de pasta que jugava amb el mòbil al davant, la parella que es besava afectuosament junt a la porta d&#8217;eixida o la dotzena de persones que anaven de peu i miraven al sostre amb cara d&#8217;impaciència, desitjant arribar d&#8217;una vegada al seu destí i cansats d&#8217;aguantar, ves tu a saber quina impertinència del seu veí. La gent sempre es mostra especialment irritable quan torna a casa acabada la jornada laboral.</p>
<p>Ella semblava ser un d&#8217;aquells observadors que està ben atent però es mostra indiferent a tot el que veu. Com si tot al seu voltant, no tingués la més mínima importància i simplement fos divertit observar-ho com a pur entreteniment. No s&#8217;immutava davant de cap estímul extern i ni tan sols va tastar el gelat de fresa que la seva ama li va donar a provar.</p>
<p>Però sobretot, i amb aquella mirada de superioritat, aquell pardal em mirava a mi mentre escoltava <em>&#8220;How it Ends&#8221;</em>, de DeVotchKa. Bé, tenia el bec apuntant-me però potser jo era qui menys li importava. Les cacatues tenen els ulls als laterals del cap, així que resulta complicat imaginar que és el que una d&#8217;aquestes aus està veient quant té el cap dirigit a tu. Fos com fos, jo si que la mirava a ella i pensava amb l&#8217;estampa més graciosa que protagonitzàvem tots els d&#8217;aquell autobús: persones i cacatua.</p>
<p>L&#8217;animal i la dona van baixar a Högalidsgatan i allí els vaig perdre de vista. Jo vaig seguir fins a Hornstull, la següent parada, i en quant vaig baixar del bus per a entrar al <em>tunnelbana</em> ja tenia clar que aquella història havia de quedar immortalitzada.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elvoldelhomeocell.net/archives/1499/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>A mi em funciona</title>
		<link>http://www.elvoldelhomeocell.net/archives/1495</link>
		<comments>http://www.elvoldelhomeocell.net/archives/1495#comments</comments>
		<pubDate>Tue, 27 Sep 2011 13:38:53 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Cinema i televisió]]></category>
		<category><![CDATA[Jo]]></category>
		<category><![CDATA[Reflexions]]></category>
		<category><![CDATA[escepticisme]]></category>
		<category><![CDATA[Escépticos]]></category>
		<category><![CDATA[etb]]></category>
		<category><![CDATA[Medicina]]></category>
		<category><![CDATA[medicina alternativa]]></category>

		<guid isPermaLink="false">http://www.elvoldelhomeocell.net/?p=1495</guid>
		<description><![CDATA[La televisió autonòmica basca emet un interessant programa que es diu &#8220;Escépticos&#8220;, idea original de José A. Pérez, conegut pel seu blog &#8220;Mi mesa cojea&#8220;. El programa està conduit pel periodista científic Luís Alfonso Gámez, autor del blog &#8220;Magonia&#8220;. L&#8217;objectiu &#8230; <a href="http://www.elvoldelhomeocell.net/archives/1495">Continua llegint <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>La televisió autonòmica basca emet un interessant programa que es diu &#8220;<em>Escépticos</em>&#8220;, idea original de José A. Pérez, conegut pel seu blog &#8220;<a href="http://www.mimesacojea.com" target="_blank"><em>Mi mesa cojea</em></a>&#8220;. El programa està conduit pel periodista científic Luís Alfonso Gámez, autor del blog &#8220;<a href="http://blogs.elcorreo.com/magonia/" target="_blank"><em>Magonia</em></a>&#8220;. L&#8217;objectiu del programa, diu, és &#8220;apropar el pensament crític i l&#8217;escepticisme científic al gran públic a través de l&#8217;entreteniment i l&#8217;humor&#8221;. Casi res!</p>
<p>Van emetre un pilot que tractava sobre l&#8217;<a href="http://www.eitb.tv/es/#/video/1162490282001" target="_blank">allunatge</a> i si aquests es va dur realment a la pràctica el 1969 i tots els misteris i conspiracions que giren al voltant d&#8217;aquest.</p>
<p>Aquell primer episodi el vaig trobar molt interessant, entretingut i didàctic però m&#8217;ha agradat més encara aquest últim: &#8220;<a href="http://www.eitb.tv/es/#/video/1182164283001" target="_blank"><em>¿A ti te funciona</em>?</a>&#8220;, es titula.</p>
<p>En aquest episodi aprofiten la tan usada frase &#8220;A mi em funciona&#8221; per a parlar sobre les anomenades &#8220;medicines alternatives&#8221; i entrevisten tant a defensors com a detractors per a que exposen els seus arguments. En el programa no tracten l&#8217;Homeopatia, que tindrà el seu propi episodi.</p>
<p>La veritat és que se&#8217;ls veu un poc el <em>plumero</em> als realitzadors del programa, perquè clar està, estan de part dels detractors. Però és que tampoc poc entendre&#8217;s que una persona amb una mínima noció del mètode científic i sobre medicina no puga ser detractora d&#8217;aquestes bajanades.</p>
<p>No té preu, per exemple, veure a una d&#8217;estes <em>bruixes</em> parlant d&#8217;un &#8220;flotari&#8221; on &#8220;no hi ha gravetat perquè estàs gitat i flotant en l&#8217;aigua&#8221;, de que &#8220;el càncer està produït pels desequilibris de l&#8217;energia de la persona&#8221; i que el naixement o enamorament és el &#8220;Misteri de la Vida&#8221;. <em>Priceless</em>.</p>
<p>Us recomane que invertiu 37 minuts veient aquest vídeo perquè, com diu un dels entrevistats, totes aquestes bajanades són perilloses per dues raons:</p>
<ol>
<li>Poden arribar a endarrerir o anular el diagnòstic d&#8217;una malaltia important, amb totes les conseqüències que això té per al malalt.</li>
<li>En el fons el que aquestes &#8220;teràpies&#8221; alimenten és la desraó i això, per a la societat en conjunt, és més perillós que el primer punt.</li>
</ol>
<p>M&#8217;haguera agradat que tractaren més amb els arguments dels defensors d&#8217;aquestes medicines, que no són arguments que defenen les seves tècniques, sinó que es basen en dir que la medicina tradicional és roina perquè està controlada per les farmacèutiques que volen fer negoci. Una altra mostra de que aquestes persones no tenen la mínima idea o interès de construir un raonament lògic.</p>
<p>En definitiva, un programa al que haurem de seguir-li la pista.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elvoldelhomeocell.net/archives/1495/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

