The Daily Show

Fa un mes i un dia que no escrivia res pel blog, i no és perquè no hi hagen coses que contar!

En primer lloc, ja tinc el vol d’anada i tornada a San Francisco. Marxaré el pròxim 1 de Juliol i arribaré de nou a València el 17 d’Octubre, per a posar-me amb el Projecte Final de Carrera. (Vacances, per a què?)

Moltes altres coses estan passant que mereixen una entrada (reformes educatives, de sanitat, el nostre benvolgut cap d’Estat, etc). Malauradament, estic molt ocupat amb les classes ací a Suècia (i això que sols tinc tres assignatures!) i no tinc temps per parlar-vos d’això.

Us parlaré però d’un altra cosa que requereix menys reflexió. El programa nord-americà d’humor The Daily Show, presentat per Jon Stewart.

Logotip de The Daily Show

El programa, que s’emet diàriament i té una duració d’uns 30 minuts, és un late-night de sàtira política que s’emet en la televisió Comedy Central, encara que tots els programes es poden veure des de la seva pàgina web. Es divideix normalment en quatre parts: un opening on Jon Stewart fa un xicotet monòleg i presenta el tema o els temes dels que parlarà durant el programa, una segona part on tracten el tema central del programa i treuen declaracions dels implicats en altres televisions i fan conya d’elles, la tercera part és una entrevista a un convidat i finalment la secció de tancament on Jon Stewart s’acomiada i apareix un altre vídeo referent al tema del programa.

Evidentment, la majoria de temes que tracten són de política local dels Estats Units, però vulguem o no, la política local dels Estats Units és una cosa que afecta tot al món i més encara als països “occidentals”, així que els temes i els personatges dels que parlen no són uns complets desconeguts. Jo, però, em vaig posar a seguir programa (bé, quan tinc temps de seguir-lo) principalment per veure la televisió en anglès sense subtítols i anar parant l’orella de cara a l’estiu. I també per a tenir un poc de base dels temes d’actualitat política als Estats Units. Aquest any són eleccions presidencials allà i és bo estar atent al que passa allà on vius.

Jon Stewart

Com la majoria de programes d’humor, té una tendència més progressita que conservadora, però la veritat és que Jon Stewart pega prou canya tant a un bàndol com a l’altre (Demòcrates i Republicans), potser siga perquè ell es defineix més com a socialista que demòcrata, i això és quasi com dir que menges bacó a l’Iran. I sobretot fa burla d’eixe sentir nord-americà de “nosaltres som els bons i tot ho fem bé i pel bé del món”, encara que a vegades també se li escapa una vena patriòtica. Si voleu llegir un millor anàlisi del programa i del seu presentador, llegiu aquesta entrada.

Us deixe amb dos enllaços [1|2] a les dues parts d’un viatge a Estocolm que va fer un dels col·laboradors del programa per comparar la vida als Estats Units amb la vida a Suècia. El programa és de 2009, quan els conservadors acusaven a Obama de “voler convertir els Estats Units en un país socialista com Suècia”.

Publicat dins de Cinema i televisió, Humor, Política | Etiquetat com a , , , , | Envia un comentari

In the Plex

Unes setmanes abans de que Google em presentés l’oferta, vaig començar a llegir In the Plex, un llibre escrit per Steven Levy que duu com a subtítol ”How Google Thinks, Works, and Shapes Our Lives“.

Steven Levy és un reputat periodista nord-americà de la revista Wired i que ha col·laborat en múltiples revistes i periòdics com The New York Times, The New Yorker, Macworld o Rolling Stone i que centre els seus articles i llibres majoritàriament en tecnologia, informàtica, seguretat i privadesa. Doncs bé, aquest és el seu últim llibre, publicat al Juny de 2011.

"In the Plex: How Google Thinks, Works, and Shapes Our Lives", per Steven Levy.

El llibre tracta sobre el naixement i creixement de Google i el que el diferència de la resta de llibres que hi ha del mateix estil és que conté numeroses entrevistes amb els principals treballadors i directius de Google, ja que Steven Levy sempre ha mantingut una bona relació amb l’empresa i els seus fundadors.

A diferència de la biografia de Steve Jobs, de la qual ja us vaig parlar, aquest llibre no es centra en la vida dels fundadors de Google, sinó en l’empresa mateixa. Això sí, degut a totes les entrevistes que va fer el autor i que es publiquen en el llibre, són molts els que el consideren com el llibre oficial de Google.

El llibre està ple de anècdotes curioses sobre els origens de Google i els seus treballadors: Google prové del terme googol (10^{100}), el quartel general de Google, anomenat Googleplex, prové del terme googolplex (10^{googol} = 10^{10^{100}}), el valor inicial de l’oferta pública de Google fou de 2718281828 dòlars (que correspon als primers dígits del número d’Euler), com l’esposa de Matt Cutts, el responsable de Qualitat del motor de cerca, va passar a ser coneguda com la “porn cookie lady”, ja que li suggerí al seu marit que premiés amb una galeta cada vegada que algun treballador trobés una pàgina pornogràfica que escapava dels filtres familiars de Google, o com Wayne Rosing, el cap d’enginyeria, el dia que Google va sortir a borsa va advertir-los amb un bat de beisbol a la mà, que destrossaria qualsevol Porsche o BMW nou que trobés al pàrquing de la companyia.

Anècdotes a banda, per a mi la part més interessant és la que narra l’aventura que va suposar obrir el cercador especialitzat en Xina i tots els problemes que això li dugué a l’empresa (el govern xinès va arribar a atacar els servidors de correu de Google per interceptar correus de dissidents, cosa que provocà que Google deixés d’obeir les ordres del govern xinés de filtrar els resultats del motor de cerca). També molt interessant el capítol sobre GMail i de tota la polèmica que va sorgir quan la gent se n’adonà de que eixos anuncis tan encertats, sols podien significar una cosa: Google analitzava el contingut dels correus per posar la publicitat que més s’ajustava a les teves necessitats! I com no, el capítol que descriu el sistema de publicitat en Google (per mitjà de subhastes entre els anunciants), que ha fet de la companyia una de les més profitoses del sector tecnològic.

En definitiva, un llibre molt interessant si eres un poc friki i et pica la curiositat sobre alguns detalls de la companyia. Haig de dir, que la biografia de Steve Jobs em va enganxar més, però és cert que aquella la vaig llegir en castellà i aquesta l’he llegida en anglès, que sempre costa un poc més.

Publicat dins de Google, Informàtica, Lectura | Etiquetat com a , , , , , | 3s comentaris

Update

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’he dit: “Xe, Joan, actualitza!”.

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’escriure la nota perquè m’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’una família de professors que el fill d’una família de camells.

El títol de l’entrada és “Update”, però poca cosa tinc que contar. Vaig estar cinc dies a París fa dos setmanes, visitant a Anna, 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 (Californication, The Walking Dead, Modern Family i The Big Bang Theory).

El més destacable és que ja he rebut tots els papers que necessitava per a demanar el visat J-1 a l’ambaixada dels Estats Units a Madrid. La putada és que m’hauré de traslladar fins allà per fer l’entrevista amb els d’immigració i que em donen el visat. I damunt, per demanar la cita haig de cridar per telèfon i des de fora d’Espanya et cobren el mòdic preu de 10 euros per la cridada! En fi, quan estiga frikejant en Mountain View, haurà valgut la pena.

Poca cosa més, ara vaig a seguir pegant-li canya al Paxos. En dues setmanes estic d’exàmens. Ja us contaré més quan passen.

Publicat dins de Estudis, Jo | Etiquetat com a , , , , , | 2s comentaris

Steve Jobs

Una de les coses que em podré endur de Suècia és el meu vell hàbit a la lectura. Durant els últims cinc anys, des de que vaig entrar a la universitat, pràcticament no llegia res que no fora material purament acadèmic. Enguany ha canviat la cosa: des de que estic a Suècia he llegit els sis primers llibres de la saga del detectiu Wallander de Henning Mankell; L’obscur passatger de Jeff Lindsay, llibre en el que es basa Dexter, la meva sèrie de televisió favorita; i ara la biografia de Steve Jobs, escrita per Walter Issacson.

Quan vaig començar a llegir el llibre tenia por de cansar-me o que altres menesters em feren deixar-lo apartat. 700 i pico pàgines sobre la vida d’una persona poden fer-se molt pesades i les meves experiències amb biografies no ajudaven als ànims. Però, sorpresa! El llibre em va enganxar de seguida per dos principals raons: en primer lloc i molt important, està molt ben escrit; i en segon lloc, sóc un friki i com a bon friki sent curiositat pels personatges que han marcat l’evolució de la informàtica per al gran públic dels últims anys. “Això és com mirar un programa de cotilleo, però per a gent que es creu lista”, em va dir algú.

Steve Jobs, de Walter Isaacson

El llibre cobreix totes les etapes de la vida de Jobs, des del seu naixement fins els seus últims dies, poc abans de morir el passat mes d’Octubre. L’entorn en el que va créixer junt als seus pares adoptius; com va conèixer a Steve Wozniak quan aquest estava construint el primer Apple i com el convencé per fundar Apple Computers; la seva obsessió, malaltissa diria jo, per les dietes vegetarianes i el món de l’espiritualitat (viatge a l’Índia inclòs) que li causà molts problemes en el seu tractament del càncer; com Apple es convertí en tot un fenomen i ell en multi-milionari; com el van tirar de l’empresa que ell havia creat; la fundació i el fracàs de NeXT; la fundació i èxit de Pixar i les seves pel·lícules d’animació; la seva tornada a Apple el 1997 i la resurrecció de l’empresa que estava a punt de fallir fins a convertir-se en una de les més valuoses (ja per sobre de Microsoft) gràcies a la seva nova rama de productes com el iPod, iPhone i iPad; i finalment com hagué de deixar-la per a combatre un càncer ja molt avançat els seus últims dies.

Sobre la personalitat de Jobs, una cosa era clara: era un autèntic capullo i un pèl hipòcrita.

Tenia una gran sensibilitat i a sovint es posava a plorar (fins i tot d’adult) quan les coses no li sortien bé o el consell d’administració es posava en contra seva, però classificava les coses en dos categories: absolutament genials o una puta merda. Sabia com identificar els punts febles de la gent i si alguna persona o alguna cosa que havia dissenyat o pensat algú entrava en la categoria de “puta merda”, li ho feia saber a base de crits i amb eixes mateixes paraules. A més, a vegades et deia que la teva idea era una puta merda i a la setmana següent la presentava com a pròpia i deia que era absolutament genial. Això feia molt difícil treballar amb ell, lògicament.

Es va cabrejar moltíssim quan Windows copià les interfícies gràfiques del Macintosh (quan ell les havia robades del Xerox PARC), quan Dreamworks llançà Antz mentre Pixar estava a punt de llançar A bug’s life o quan Google tregué Android. Sobre aquests últims digué que gastaria fins l’últim cèntim dels 40.000 milions de dòlars que Apple tenia al banc fins a enfonsar-lo. No obstant això, ell va afegir la frase “Nosaltres (Apple) mai hem tingut objecció en robar idees genials”, a la famosa cita atribuïda a Picasso: “El artistes bons copien i els artistes genials roben”.

A més, sempre s’havia vist a ell mateixa com un hippie rebel, al qual no li importaven en els diners. En gran part era així, perquè no vivia rodejat de massa luxes com feien altres directius de la seva categoria, però va convertir la seva empresa en una de les més profitoses gràcies al control absolut sobre els seus productes, al màrqueting i a demandes contra qualsevol empresa o particular que fes alguna cosa semblant al que ells havien fet. Quan tornà a Apple el 1997, no volia cobrar cap salari com a “CEO en funcions” i es va fixar un salari d’un dòlar anual quan va llevar les paraules “en funcions” del seu càrrec. Això sí, va obligar a l’empresa a que li donés milionàries quantitats d’opcions en accions i que li comprés un jet privat.

A pesar de tot això, quasi tots els que treballaren amb ell reconeixen que la seva personalitat els feia esforçar-se al màxim i aconseguir coses que creien impossibles i que sense la seva absoluta passió pels productes que dissenyava a Apple (ell a sovint participava en el disseny) i la seva cerca de la perfecció, Apple (ni Pixar) mai hagués sigut l’empresa que ara és i s’hagués enfonsat ja fa molt de temps.

En fi, un llibre molt recomanable si sents curiositat pels personatges de la informàtica moderna com a producte de consum o, com no, si t’apassionen els productes d’Apple (fanboy!).

Publicat dins de Lectura | Etiquetat com a , , , , , , , | 1 comentari

Kommer tillbaka till Stockholm

Ja ha passat Nadal. Avui he fet un examen a la UPV d’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! Ara bé, no he fet quasi res del que volia fer durant les vacances.

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’Oracle. Zero. Res.

Esperava rebre part dels papelorios de Google i cridar a l’ambaixada dels EUA per preguntar algunes coses, però no els he rebut encara i tampoc he pogut avançar en aquest tema.

El que sí que he fet aquests Nadals ha sigut enganxar-me a una sèrie més (Modern Family) i jugar a un videojoc (Half-Life 2). Feia un parell d’anys que no jugava a cap joc!

En fi, que dilluns comencem les classes del tercer període a la KTH amb Artificial Neural Networks and Other Learning Systems, Search Engines and Information Retrieval i Distributed Systems: Advanced Course. Ja tinc ganes!

Publicat dins de Erasmus, Estudis, Jo | Etiquetat com a , , , , , , , , | Envia un comentari

2011

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’Oracle i la correcció automàtica, però no he pogut acabar encara el que volia contar-vos així que haurem d’esperar un poc més.

En un sol adjectiu, aquest any ha sigut genial. Va acabar prou bé el meu últim any de classes a la UPV com a estudiant d’Enginyeria Informàtica, han anat prou bé també en la primera meitat de la meva estada a Estocolm i espere que vagen almenys igual de bé en la segona meitat, ara que les assignatures tenen pinta d’agradar-me més.

Stockholm from Västerbron

He pogut fer un bon grapat de viatges aprofitant que he tingut un quadrimestre més relaxat (viatge a Tallin, a Londres i diverses escapades per Suècia 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.

I professionalment, que dir: Ha sigut l’any que els de Mountain View m’han convidat a col·laborar amb ells. Estic segur que aquest tema centrarà moltes entrades el pròxim any.

Alguna cosa em fa pensar que el 2012 serà millor encara, espere no enganyar-me i que el vostre us vaja també de meravella.

En fi, si voleu veure un vídeo resum més global, doneu-li un cop d’ull al meravellós, fantàstic, espectacular i emotiu vídeo de Google (sí, m’he posat en mode spammer).

Jaume Crespo Llàcer liked this post
Publicat dins de Jo, Reflexions | Etiquetat com a , , , , , | Envia un comentari

Google: què faré?

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’han fixat com a Software Engineer Intern a Google. Però què vaig a fer allà?

Treballaré amb l’equip OCR (Optical Character Recognition), integrat dins de Google Research, que és l’equip de recerca de la companyia. La missió de Google és:

Organitzar la informació mundial i fer-la útil i accessible universalment.

I això òbviament passa per organitzar la informació escrita en llibres. L’equip d’OCR és un dels que treballa, per exemple, en el Google Books i el seu treball dins d’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’una pàgina d’un llibre, podem fer que quan l’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’aquest procés.

Els escànners domèstics i aplicacions com l’Adobe Reader o el Google Docs tenen funcions de reconeixement de text des de fa molt de temps. No és l’OCR un problema resolt? En el següent vídeo, Remco Teunen explica quin és el treball que ha fet l’equip de OCR i què és el que li queda per fer. Remco és qui em va fer l’entrevista i qui serà el meu host (Google mai utilitza paraules com boss, supervisordirector, etc). La seva part dura 8 minuts, però si us interessa saber en què treballa l’equip de recerca de Google (Reconeixement de Veu, Traducció Automàtica, Machine Hearing i Machine Perception), us recomane que el veieu complet.

Publicat dins de Google, Informàtica, Jo | Etiquetat com a , , , , , | Envia un comentari

Internship: Google

Qui m’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 i deixant la porta oberta per al futur), dir-li que no al Zuckerberg perquè me’n vaig amb Page i Brin!

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’Octubre) estaré treballant en la seu central de Google, a Mountain View!

El passat dilluns 12 vaig fer una entrevista amb un investigador de Google Research, 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’entrevista: tenia experiència relacionada amb el projecte, m’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.

Avui, m’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’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’enviaran per correu).

Com podreu comprendre, estic que me’n puge per les parets!  Per a qualsevol informàtic, treballar a Google és com treballar a la NASA o al CERN per a un físic, per a Ferrari per a un enginyer en mecànica, o que sé jo!

No obstant això, l’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 gent que ha escrit els llibres i publicacions que has estat estudiant, amb la gent que marca les tendències en allò que t’apassiona: no pots negar-te, no vols fer-ho.

Fa mig any us descrivia el més prop que havia estat mai d’aquests genis, ara ja estic més prop. Moltes gràcies a tots els que m’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’institut amb els que he aprés un muntó, professors d’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 Ivan que en el seu moment m’ajudà a preparar el CV i em dona un bon grapat de consells.

Ho haig de reconèixer: sóc una persona amb sort, molta sort.

PS: Amb este subidón d’adrenalina, qui estudia ara?!

Publicat dins de Google, Informàtica, Jo | Etiquetat com a , , | 3s comentaris

Viu

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 que enguany es cel·lebrava de nou en la Complutense de Madrid (vaig poder viure sobre el terreny la victòria del PP, quina “alegria”). Ja que estava allí, vaig aprofitar per passar uns quants dies en Egpaña, que feia temps que no la xafava.

En tornar a Suècia vam fer un viatget, Fernando, Adrià i jo, a Kiruna: una ciutat situada al nord de Suècia, en la regió de Lapònia i ben al nord que està! Literalment, al pol nord.

Vam veure la neu que encara no havíem vist en Suècia (mira que trobar-nos amb l’any més càlid des de fa molt de temps ací, per un any que venim!) i vam passejar amb trineu guiat per huskies (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.

I les últimes setmanes han sigut per a acabar un projecte de la “meravellosa” assignatura que estic fent ara: Distributed Artificial Intelligence and Intelligent Agents. Un nom molt bonico i res més: decepció absoluta que m’he endut amb eixa assignatura.

Tot això, mesclat amb una bona dosi de frikisme per la meva part programant una nova forma de fer la correcció automàtica en l’oracle utilitzant HMMs. Però això ja tindrà el seu post més endavant. Ara toca una setmana d’estudi per a l’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.

Publicat dins de Erasmus, Estudis, Jo, Viatges | Etiquetat com a , , , , , , , , , | Envia un comentari

Correcció automàtica en l’Oracle: Trie

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’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’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’utilitzar la famosa distància de Levenshtein.

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’ha dut quasi una setmana publicar aquesta entrada.

Avisar-vos també que aquest post és molt més llarg i pesat que l’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’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’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 Wikipedia o els algorismes en publicacions de Google Scholar.

Fet aquest avís, comencem.

Distància de Damerau-Levenshtein

La distància de Levenshtein mesura la distància d’edició entre dues cadenes de text en termes d’insercions, esborrats i substitucions. Això és, el nombre mínim d’aquestes operacions que són necessàries per transformar una cadena A en una altra cadena B. Si volem comptar també les transposicions com a operacions, la mètrica s’anomena distància de Damerau-Levenshtein. L’algorisme utilitzat per a computar aquesta mètrica és un clàssic de qualsevol curs de programació dinàmica.

Intentaré explicar l’algorisme de manera breu. Imaginem que volem calcular la distància d’una cadena X a una cadena Y. Llavors és construeix una matriu D de |X|+1 files i |Y|+1 columnes. L’element D_{ij} indica quina és la distància de la subcadena x_1 \ldots x_i a la subcadena y_1 \ldots y_j. La fila 0 i la columna 0 representen les distàncies de la cadena \epsilon a y_1 \ldots y_j i de la cadena x_1 \ldots x_i a \epsilon respectivament (\epsilon és la cadena buida, aquella que no conté cap símbol).

Doncs bé, la fórmula per a calcular cada element de la taula és la següent.

Ací teniu un exemple de com quedaria matriu per a les cadenes hola i poal.

  \begin{array}{|c|c|c|c|c|c|}  \hline D & \epsilon & p & o & a & l \\  \hline \epsilon & 0 & 1 & 2 & 3 & 4 \\  \hline h & 1 & 1 & 2 & 3 & 4\\  \hline o & 2 & 2 & 1 & 2 & 3\\  \hline l & 3 & 3 & 2 & 2 & 2\\  \hline a & 4 & 4 & 3 & 2 & 2\\  \hline  \end{array}

Si mirem l’element D_{4,4} de la taula, veiem que la distància de Damerau-Levenshtein entre les dues cadenes és 2 (transformacion: hola->pola->poal). Fixeu-vos que és menor que la distància de Levenshtein (que no admet transposicions) i que seria 3.

La gràcia d’aquest algorisme és que pot anar construint-se fila a fila i columna a columna, de manera que el cost temporal de l’algorisme per a dues cadenes de longituds m i n és O(m \cdot n), a l’igual que el cost espacial.

El problema d’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 n persones i la longitud dels seus noms és aproximadament l, el cost temporal d’aquesta cerca seria O(n \cdot l^2), un cost massa alt si el comparem amb el de la cerca dicotòmica (O(l \cdot \log_2 n)).

Millora d’Ukkonen

El primer que hem de tenir clar és que no necessitem saber la distància exacta entre dues paraules. Imaginem que un usuari s’equivoca escrivint la paraula que busca i escriu ocel. Què serà més probable, que l’usuari estigués buscant una paraula que està a una distància 1 (p.ex: ocell) o que estigués buscant una paraula a una distància 5 (p.ex: tomaca)? Realment, sols estem interessats en saber si la distància entre dues cadenes X i Y és menor o igual que un cert llindar k.

Si estem calculant la distància entre dues cadenes i tenim una fila per a la qual, cap element és menor o igual que k, llavors cap element de les següents files serà menor o igual que k.

A més, siga C_i = j, l’última columna j per a la fila i tal que D_{i,j} \leq k, llavors quan construïm la fila i sols haurem de fer-ho fins la columna C_{i-1}+1, ja que els elements de les columnes posteriors tindran un valor D_{i,j} > k.

Ací teniu un exemple de com quedaria la matriu per a les cadenes hola i poal, amb un valor de k igual a 1.

  \begin{array}{|c||c|c|c|c|c|c|}  \hline C & D & \epsilon & p & o & a & l \\  \hline 1 & \epsilon & 0 & 1 &  &  &  \\  \hline 1 & h & 1 & 1 & 2 &  & \\  \hline 2 & o & 2 & 2 & 1 &  & \\  \hline 0 & l & 3 & 3 & 2 & 2 & \\  \hline 0 & a &  &  &  &  & \\  \hline  \end{array}

Si consultem el valor de l’element D_{i,j} aquest sols és vàlid si C_i > 0. Si no és així, sabem que D_{i,j} > k.

Doncs bé, tenint en compte aquesta millora, el cost temporal de l’algorisme es redueix a O(k^2), segons diu la publicació d’on vaig treure l’algorisme.

Així i tot, no resulta interessant aplicar aquest algorisme sobre tots els noms ja que el cost estaria en O(n \times k^2). Per a k xicotetes és molt menor que O(n \times l^2) de la idea original, però que encara es pot millorar.

Necessitava tenir els noms de les persones representats d’alguna manera per a estalviar-me treball reduir aquest cost. I ací és on entren en joc els tries.

Trie

Un trie no és més que un arbre de prefixes. El node arrel representa el prefixe de la cadena buida (o \epsilon). Cada aresta de l’arbre s’etiqueta amb un símbol de l’alfabet \Sigma, de manera que el node representa el prefix format per la concatenació de tots els símbols en les arestes des de l’arrel fins a l’esmentat node.

Vegem-ho més clar en un exemple. Suposem que tenim els noms de Alan, Andrew, Leslie, Johan i John. El trie que representaria tots aquests noms és el següent.

Com vegeu, les fulles de l’arbre corresponen al nom complet d’alguna de les persones: allan, john, johan, andrew i leslie (recorreguent l’arbre en amplada).

Un dels avantatges d’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 l, el cost de la cerca és O(l). Simplement hem de descendir de nivell en nivell en l’arbre per a cada lletra del nom.

Compressió de camins

El problema dels tries, com ja podreu deduir de la imatge anterior és l’espai que ocupen en memòria. Suposant de nou que totes les cadenes tenen la mateixa longitud l, en el pitjor dels casos, cap de les n cadenes codificades en l’arbre tindrà un prefixe comú i en aquest cas el nombre de nodes és O(n \cdot l) (encara que això sols passar quan n \leq \vert \Sigma \vert).

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.

Si volem mantenir el cost de cerca O(l), necessitem determinar en cost O(1) 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’alfabet amb el que treballem. Si hi ha algun descendent en el node per al símbol i, el punter p_i apuntarà a aquest descendent. Mentre que si p_i és nul, sabem que no hi ha cap descendent del node actual per al símbol i. D’aquesta manera, el cost espacial de mantenir l’arbre de prefixos és O( l \cdot n \cdot \vert \Sigma \vert ).

El cost ja no és tan atractiu com semblava. Suposem que el nostre alfabet té 26 caràcters (de la a a la z), 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!

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’alfabet: els noms de les persones de IMDB inclouen també números, espais, símbols d’exclamació, caràcters accentuats i caràcters d’altres alfabets que no són el llatí (ciríl·lic o grec, per exemple).

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’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 trie s’anomena Radix Tree. Veieu com quedaria l’arbre anterior amb els camins comprimits.

Reduint l’espai dels nodes

Una altra millora que pot fer-se per a reduir l’espai és intentar reduir el nombre de punters que s’emmagatzemen en cada node. Havíem dit que si volem mantenir el cost de cerca en O(l) necessitem un vector de \vert \Sigma \vert punters. Però no podem reduir aquest nombre? La resposta és sí, però a costa d’incrementar el cost de cerca.

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’emmagatzema un punter per a cada descendent i no per a cada símbol de l’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’aquesta manera el nombre de punters en cada node es redueix considerablement, especialment a mesura que es descendeix en l’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’alfabet), en canvi és poc probable que tinguem molts noms amb el mateix prefix i amb l’última lletra diferent (els nodes de nivells inferiors tindran pocs descendents).

El problema és que ara el cost de cercar una cadena en el trie és O(l \cdot \log_2 p), on p és el nombre de punters en els nodes (p \leq \vert \Sigma \vert, normalment prou menor).

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 trie 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.

Comentaré també que em vaig endur una desagradable sorpresa al passar el programa d’una màquina de 32 bits a una de 64 bits: els punters van passar d’ocupar 4 bytes a ocupar-ne 8 i clar, emmagatzemar el mateix arbre necessitava el doble de memòria!

Cerca aproximada

Hem parlat molt de com emmagatzemar eficientment el trie, però encara no hem solucionat el problema que havíem plantejat: fer una cerca aproximada donada una cadena X. Ací és on unim l’algorisme de Damerau-Levenshtein explicat abans i els tries.

Hi ha dos coses importants a tenir en compte a l’hora de calcular la distància de Damerau-Levenshtein sobre distintes cadenes:

  1. Al calcular la distància entre la cadena X i la cadena YZ, les |Y|+1 primeres files de la matriu de Damerau-Levenshtein seran iguals a les del càlcul de la distància entre la cadena X i la cadena Y.
  2. Si per al càlcul de la distància entre una cadena X i una cadena Y, totes les columnes de la fila |Y| tenen un valor major que k, cap cadena amb el prefix Y estarà a una distància menor que k de X.

El trie permet estalviar temps ja què la matriu de Damerau-Levenshtein va calculant-se iterativament quan descendim en l’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 k llavors sabem que cap dels descendents d’aquest node tindrà un llindar menor, de manera que no hem d’explorar els descendents.

Algunes consideracions sobre les operacions que apareixen en el pseudocodi. L’operació update(D, C, x) el que fa és actualitzar la matriu D afegint |x| files i computant el valor dels nous elements i el vector C com he explicat en la millora de Ukkonen.

L’operació dist(D', C') el que fa es tornar el valor de l’element D'_{|v| , |w| } tenint en compte que potser aquest element no ha arribat a calcular-se en l’operació update. Aquest valor és la distància que hi ha entre les cadenes v i w si aquesta distància és menor o igual que k, o k+1 en cas contrari.

La gràcia d’aquest algorisme és que té una complexitat temporal de O(k \times {\vert \Sigma \vert}^k), segons l’article que us citava abans. Això suposant que l’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 reduir espai).

Fixeu-vos que l’algorisme no depèn del nombre de cadenes en el trie! Això significa que podem trobar els noms que més s’aproximen a una cerca feta per l’usuari sense importar quants noms tenim emmagatzemats. Una considerable millora front al cost O(n \times k^2), això sí, sempre que k siga menuda, perquè el cost creix de manera exponencial amb k!

El gràfic que es mostra ací baix és el temps mitjà de resposta per part de l’oracle quan es busca el nom d’un actor que no existeix en la base de dades. El valor de k que utilitze és \min(3, \left\lfloor \frac{|w|}{4} \right\rfloor). Si usés un valor fixe per a k 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 a, té sentit suggerir-li els noms b, c, d, etc? La distància a tots ells és 1, però és que la longitud de la cadena era 1! Això significaria que l’usuari ha errat en el 100% de la cadena! Jo permet a l’usuari que s’equivoqui fins a un 25% de la longitud de la cadena. Però si la cadena cercada fos molt llarga el valor k seria molt gran, per això pose un límit al número d’errors a 3.

Dir que l’interval de confianç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).

Encara millor?

Des del primer moment vaig tenir com a referència a Google i el seu “Did you mean…?“. I tenia ben clar que els de Google no podien utilitzar un trie 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 trie com el descrit!

Google utilitza un enfocament basat en aprenentatge automàtic i processament del llenguatge natural. I aquesta va ser la ruta que em vaig proposar seguir i que us explicaré en el pròxim post.

Mentrestant els tries han funcionat prou bé: són ràpids i sobretot obtenen els resultats que l’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.

Publicat dins de Informàtica, Jo, Programació, Projectes | Etiquetat com a , , , , , , , | Envia un comentari