Nor de etichete

Friday, 20 January, Year 4 d.Tr. | Author: Mircea Popescu

Ieri s-a intimplat catastrofa. Inevitabilul s-a produs. La ce sa te si astepti pina la urma - oricit de catastrofic sa fie, odata ce-i inevitabil... asta este, se intimpla.

Despre ce vorbesc ? Pai uite, la inceputurile blogului cind doream sa-mi gasesc un articol mergeam direct dupa titlu, ca-i stiam titlul, momentul exact al scrierii, ce haine purtam, ce haine nu purtau fetele, cum era vremea afara, daca era ceva in cuptor, chestii. Cu trecerea lunilor care s-au transformat in ani chestia asta a devenit imposibila, da' nu-i problema ca Google indexeaza 100% Trilemai asa ca se poate gasi absolut orice cu minim efort, si da rezultate mult mai bune decit cine stie ce rahaturi de script.

Cu aglomerarea anilor problemele s-au agravat. In general imi gaseam ce aveam lipsa in secunde sau un minut doua, da' uneori cite-un articol mai afurisit nu voia dom'le sa iasa la suprafata nicicum - nu reuseam sa-mi amintesc nimic actionabil. In cursul anului trecut am petrecut de doua sau de trei ori o ora incheiata cautind, da-n cele din urma am gasit. Victorie.

Ieri am petrecut mai bine de-o ora, aproape doua, cautind, pina cind m-am lasat pagubas. Nici acum nu stiu care dracu'-i articolul de-l cautam eu. Trist.

Asa ca ce mi-am zis in capul meu de fier ? Bai frate, poate haterii astia nepriceputeni de comentatori precit si restul lumii (care-i ceva mai mica decit prima categorie, sper ca-i clar) or fi avind dreptate ?! Poate totusi... ar fi o idee sa fac ceva gen search, nor de etichete, alea ?

Vedeti ca sunt capabil ? VEDETI ???

Noa, si ca prim pas in orice incercare posibila de clasificare automata a textelor m-am apucat sa scriu cod care sa-mi extraga indecsii de cuvinte, pe criteriul ca vedem noi pe urma ce facem cu ei. Hai sa parcurgem impreuna codul.

    $nconnection = mysql_connect("localhost:3306", $db_user, $db_pass );
    mysql_select_db($db_name, $nconnection);

Adica, ne conectam la baza de date,

    $query = 'SELECT post_content, ID, post_name, YEAR(post_date), post_title FROM posts
    WHERE post_status = "publish" AND post_title NOT LIKE "Rezultat%" AND post_title NOT LIKE "Wikilea%"' ;
    $record=mysql_query($query);

Din care alegem continutul, ID-ul, numele, anul si titlul fiecarui articol care-i publicat si-al carui titlul nu incepe nici cu "Rezultat" nici cu "Wikilea", ca sa reusim astfel sa ne incadram in 32 Mb de memorie pentru ca din ceva motiv daca modific php.conf pe server asta nu-mi mareste limita de memorie la scripturi si mi-i lene sa ma bag in mataria configuratiilor pentru atita lucru.

    while ($row = mysql_fetch_array($record, MYSQL_NUM)) {

    $words = explode(" ", strtolower(preg_replace('/[^a-zA-Z ]/', '', strip_tags(str_replace("-"," ",$row[0])))));

    $check = "";
    foreach ($words as $w) if ((strlen(trim($w)) > 4) && (!(isset($check[trim($w)])))) {
    $words_glob[trim($w)] .= $row[1].", ";
    $check[trim($w)]++;
    }

Aici e mai complicat. Deci, intr-o variabila punem o lista a tuturor entitatilor despartite prin spatii din ce-a ramas dupa ce-am ales doar literele si spatiile din ce-a ramas dupa ce-am scos tagurile html din ce-a ramas dupa ce-am inlocuit trasura de unire cu un spatiu (ca sa nu ne iasa ce-a un fel de cea si acesta-i un acestai) in continutul articolelor. Cred ca se intelege.

Dupa care initializam o lista, si apoi pentru fiecare cuvint daca-i format din mai mult de patru litere si nu exista-n lista respectiva atunci il adaugam la ea (ca sa nu-l numaram de doua ori) si-n plus il mai adaugam si dupa cheie intr-o lista care tine ID-urile articolelor.

Pe scurt obtinem la pasul asta o uriasa lista dupa cuvinte-n care se regasesc toate id-urile articolelor de pe Trilema.

    $urls[$row[1]] = "http://trilema.com/".$row[3]."/".$row[2];
    $titles[$row[1]] = $row[4];
    }

Aici compunem url-urile articolelor be baza numelui lor si anului aparitiei intr-o lista ordonata dupa ID-uri, si apoi compunem titlurile intr-o lista idem. Chestiile astea ne vor servi mai tirziu, la formatare. Si cu asta am incheiat parcurgerea continutului articolului curent, putem trece la urmatorul.

    ksort ($words_glob);

Sortam lista cuvintelor dupa cuvintele respective, de la A la Z.

    foreach ($words_glob as $wdg => $val) if ((count(explode(", ",$val)) > 2)&&($wdg[0]==trim($_GET["lit"]))) {
    echo $wdg, " => ";
    foreach (explode(", ",$val) as $v) { echo "<a href=",$urls[$v],">",$titles[$v], "</a> "; $ocnt++; }
    echo "<br /><br />\n";
    $wcnt++;
    }

Pentru fiecare cuvint din lista luam in considerare daca apare in mai mult de doua articole si daca incepe cu litera pe care-am specificat-o in url prin ?lit=x. Daca da atunci il tiparim cu niste formatari asa fel cit sa iasa frumos cu link-uri la articolele unde apare.

    echo "<strong>Totaluri : ", $wcnt, " cuvinte, ", $ocnt, " ocurente.</strong>";

Mai tiparim o linie cu numarul de cuvinte si numarul de articole in care apar ele fiecare, si gata.

Ce ne rezulta de-aici ? O. Vai. Vai, vai.

Si-acum ce facem ? Unde pun 45`432 de cuvinte-ntr-un nor de etichete si cum si cui si la ce ar servi el ? 60 de Mb de crosreferinte, ce facem cu ele ? Cui dracu' i-ar putea servi si la ce ?

Per final, singurul rezultat al acestei dimineti este ca acum avem dovezi ceva mai bune ca nu, n-aveau nici un fel de dreptate comentatorii respectivi, si nu, nu exista solutie mai buna decit Google pentru problema asta. Plus eventual observatia subsidiara ca uite dom'le, stiati ca in limba romana litera C urmata de P si la mica distanta S sunt cele mai importante initiale ? Banuiesc ca nu stiati, dat fiind ca nu am cunostiinta sa se mai fi facut studiile astea altundeva, si dat fiind ca aici au fost publicate intiia oara da, oricine le foloseste ulterior are obligatia sa citeze aceasta sursa. Chiar daca se considera pe sine un special, un deosebit si e de parere ca "oricum se putea gindi si el atita lucru".

Ca-n strainatate, ce sa mai.

UPDATE : Cititorii nostri mai bine informati decit noi ne atrag atentia ca exista cel putin un studiu (Adriana Vlad, Adrian Mitrea, Mihai Mitrea), efectuat pe ~43 de milioane de caractere - in principal traduceri din Stoljenitin si scrieri de Radu Anton Roman.

———
  1. "URLs submitted 5,025 URLs in web index 5,018" deci tehnic vorbind 99,86%, da-n fine, cine stie ce-or fi alea 7 ca mi-i lene sa caut. []
Category: Meta psihoza
Comments feed : RSS 2.0. Leave your own comment below, or send a trackback.

22 Responses

  1. [...] ca sa reusim astfel sa ne incadram in 32 Mb de memorie pentru ca din ceva motiv daca modific php.conf pe server asta nu-mi mareste limita de memorie la scripturi si mi-i lene sa ma bag in mataria configuratiilor pentru atita lucru.

    Meh, dă-l în mă-sa de PHP, folosește mai bine altceva pentru prelucrarea bazelor de date. Se pare că APL știe să lucreze cu MySQL, asta presupunând că nu vrei să scoți tot conținut web. Eu aș folosi tot Haskell, da' acum fiecare după preferințe.

  2. Mircea Popescu`s avatar
    2
    Mircea Popescu 
    Friday, 20 January 2012

    Da' n-am inteles de ce ? Io-s foarte multumit de lamp, pe bune acuma.

  3. A, nu zic, lampu-i bun pentru servire de conținut pe web, dar baza de date o poți prelucra la fel de bine și separat, fără să te lovești limitările aferente. Iei un limbaj cu o bibliotecă pentru MySQL și te conectezi la fel de bine și îți faci treaba cu cât spațiu vrei tu, separat de PHP.

    De fapt nu-s sigur, dar s-ar putea să meargă să rulezi inclusiv script-ul PHP direct din shell și să nu ai limitările alea, adică limitele de memorie să fie doar pentru ce vine prin mod_php de la Apache. Dar n-am cercetat pe temă, pur și simplu am preferat să lucrez cu altceva pentru a prelucra cantități mari de date pe loc.

  4. Mircea Popescu`s avatar
    4
    Mircea Popescu 
    Friday, 20 January 2012

    Pai evident ca ar merge, da' chiar nu vad utilitatea. Cu ce te-ar ajuta sa ai si cuvintele din wikileaks adaugate la socoteala ? Mie-mi pare c-ar dauna mai degraba.

  5. Probabil, dar în cazul general tu poate vrei să folosești 100MB de memorie pentru a prelucra date, sau 1GB. Sau poate vrei să folosești un algoritm care merge foarte prost ca spațiu, dar se mișcă brici în ceea ce privește timpul de rulare. Limitarea de la PHP/Apache a fost pusă din motive de securitate, deci nu îi văd rostul în condițiile în care tu știi că rulezi cod sigur. Iar dacă apelezi php direct din shell știi sigur că nu ajungi să faci buffer overflow în Apache când prelucrezi date mari, că ăsta ar cam fi riscul principal.

  6. Mircea Popescu`s avatar
    6
    Mircea Popescu 
    Friday, 20 January 2012

    Mei da... hm. Deci, eu am scris codul asta in mai putin timp decit mi-a luat sa-l traduc in limbaj natural pentru cititorii de limbaj natural. Si ca sa te enervez si mai mult : desi am calculator ieri de exemplu am facut determinari cu rigla de calcul! Ca mi-o fost mai la indemina, desi in cazul general...

    Si-n subsidiar, daca scriam in lisp ce publicam dinsus ?

  7. E ok, ai folosit rigla de calcul pentru că îți era mai la îndemână, cam ăsta fiind cuvântul cheie. Mie personal mi-ar fi cel puțin la fel ușor să fac ssh pe server și să dau php /path/to/script pentru un script privat oarecare față de a-l rula din browser.

    Și în plus mi-ar fi mai ușor să scriu script-ul în Haskell decât în PHP, da' asta pentru că programez mai des în primul decât în al doilea, chit că primul nu-i așa bine documentat. Drept urmare, eu unul aș înțelege ceva mai ușor un program scris în Lisp decât același program în PHP, pentru că Lisp are sintaxa foarte curată, pe când PHP parcă a împrumutat prea mult de la Perl. Sau poate că-i de la mine, nu știu.

  8. Mircea Popescu`s avatar
    8
    Mircea Popescu 
    Friday, 20 January 2012

    E mai safe sa nu faci ssh. Eu nu tin minte cind am facut ultima oara ssh in root, da posibil sa nu fi fost in 2011. Ca mnoa, daca nu e nevoie ? Ce, rulezi din browser, sau may exact

    for i in {a..z}; do echo "wget http://trilema.com/wdcnt.php?lit=$i -O trilema_litera_$i.html"; done

    Mare chestie, stii.

    Aia cu sintaxa curata... io am invatat sa programez mai serios pe C. Parfois savoir toucher l'ordinateur a mains sales fait toute la difference.

  9. E mai safe sa nu faci ssh.

    Ecslipcă. Te referi că atunci când apelezi codul PHP de fapt rulezi ca utilizator neprivilegiat? Păi și eu fac ssh tot ca utilizator neprivilegiat, de fapt am contul de root dezactivat. E fix aceeași chestie doar că în loc să trec prin Apache, trec prin openssh. Ba de fapt nu-i fix, dacă ținem cont de faptul că sesiunea ssh mai e și securizată.

  10. Mircea Popescu`s avatar
    10
    Mircea Popescu 
    Friday, 20 January 2012

    A, pai am gindit ca tu zici sa faci ssh ca root.

  11. Mei, ce înseamnă că C şi P sunt cele mai importante litere româneşti? Cum defineşti asta, prin faptul că ele prefixează cel mai mare număr de cuvinte pe care le-ai folosit tu pe Trilema?

    Eu când eram mic am citit ceva carte de aventuri sau poliţistă, nu-i mai ştiu numele, dar îmi aduc aminte că la un moment dat era vorba despre spargerea unui cod pentru descifrarea hărţii unei comori. Şi zicea acolo autorul (prin vocea personajului principal) ceva despre frecvenţa literelor, ca de exemplu binecunoscutul fapt că-n engleză vocalele a şi e apar mult mai des decât litera y în cuvinte. Cred că şi-n română e la fel. Este vorba de numărul de apariţii ale unei litere indiferent de poziţia ei în cuvânt.

    La fel, sunt convins că cei care scriu cod pentru criptare / spart parole / etc au o idee mult mai bună decât tine despre această "importanţă" (de fapt frecvenţă) a literelor şi cunosc mult mai multe paternuri.

    By the way, în copilărie comunicam cu un prieten cifrat. Poreclele din generală ni le cifram. Iar cu ceva ani în urmă am făcut un progrămel care adăuga diacritice într-o titrare fără. Funcţiona interactiv dar învăţa tot mai mult, acumulând cuvintele parcurse şi deciziile operatorului într-un dicţionar şi bazându-şi deciziile proprii pe frecvenţa anumitor cuvinte cu diacritice versus fără. Exemplu cuvântul "uşa" apare mult mai des decât "usa" sau "uţa" şi programul învăţa asta, sugerându-mi sau făcând apoi automat înlocuirile. L-am abandonat după ce am găsit altele mai bune şi titrări câte vrei pe net.

    Încă îl mai am. Îmi pui link? Sau le pui link celor care chiar s-au ocupat cu aşa ceva?

  12. La o căutare rapidă pe net:

    "Jetoanele poarta cate o litera si un indice. Acest indice arata cate puncte valoreaza litera respectiva in calculul punctajului care desemneaza in final pe castigator. Sunt 98 de jetoane cu litere si doua jetoane "albe" (jokerii). Cei doi jokeri pot fi folositi in locul oricarei litere, avand insa valoarea zero in calculul punctajului. Semnificatia jokerului din cadrul cuvantului in care s-a depus, se pastreaza in tot restul jocului. Iata si frecventa literelor folosite in acest joc adaptat pentru limba romana:

    A1= 11 buc.; B9= 2; C1= 5; D2= 4; E1= 9; F8= 2.; G9= 2; H10 = 1; I1 = 10; J10= 1; L1= 4; M4= 3; N1= 6; O1= 5; P2= 4; R1= 7; S1= 5; T1= 7; U1= 6; V8= 2; Z10= 1; X10= 1; Joli= 2"

    sursa

    Na, aveam dreptate cu a şi e. Se pare că mai este şi i. Confirmare suplimentară pe wiki.

  13. Mircea Popescu`s avatar
    13
    Mircea Popescu 
    Friday, 20 January 2012

    Pai da, in sensul ala, ca-s initiale. Uite ca ele trei impreuna string o treime din toate ocurentele. Deci daca te leaga cineva si tre' sa ghicesti initiala unui cuvint romanesc (mai lung de patru litere) ca sa scapi incearca in ordine C, P, S.

    Este si-n romana la fel, cu deosebirea ca romanii sunt niste putori infecte, care de exemplu nici azi n-au facut Flesch-Kincaid. E clar ca nu-i totuna daca vorbim de initiala, finala sau in interiorul cuvintului pe motiv de vocale. Si ca sa-ti faci o idee, CTO-ul de la Polimedia, care nu-i vorbitoare nativa de limba romana da' o aude de citiva ani a raspuns corect ca anume C e cea mai frecventa si S a doua (de fapt intre P si S diferentele is minime). Ca sa vezi ce inseamna o minte de criptograf de elita.

    Si chiar e deplasat sa-ti inchipui ca io-s asa, un fel de roman mediu, genu' de om cu care te-ai putea intilni tu pe strada.

    Da si tu un link la programel.

    La a doua : citatul corect e aici. Prostia cu nustiuce jetoane e deosebit de irelevanta.

  14. Da nici nu cred că aveam net pe vremea aia. Era o întrebare retorică vizavi de pretenţia ta de link pentru aşa ceva.

  15. Mircea Popescu`s avatar
    15
    Mircea Popescu 
    Friday, 20 January 2012

    Pai retorica nu era, ci mai degraba absurda. Care-i pasul urmator, ai inventat fermoarul da' ai omis sa publici ?

  16. Pfoai de mine iar noi suntem latini, ce incidenta de e, a, o si i avem. M-au spart aia ce sursa de texte au bagat ei, acolo in appendix. Deci tocmai au demostrat ca traducatorii editurii folosesc literele alea frecvent in traduceri.

    Cel mai frecvent e p. P de la par-egzample, pula, pizda, prost, picior, pumn, putoare, porc, plecat etc.

    Alte idei dinastea de pulitehnica mai aveti? Io aveam o prietena tembela rau, dar fata stia chimie si fizica astea(lol masa e chimista si profesoara universitara) care a trimis nu stiu ce text de cacat, il retin partial de memorie, la un proiect dinasta NASA pentru summer camp la copii. Fata a luat ceva premiu si a intrat in chestia aia de vara cu o mizerie de text, ceva gen ca visa un fel de sistem gps la metrou cu o alarma care sa le aduca aminte celor cu alzaimer care-i ruta spre casa. Chestiile astea existau deja de coispe timp, asemenea smartphoneului sau un simplu aparat gps, wifi e acum chiar si la metrou in romania precum in strainatate si e semnal oricum de obicei, iara pe porcaria de gps poti programa o ruta si poti da chiar sa-ti indice traseul verbal, si chiar te atentioneaza cand o iei pe unde nu trebuie, recalculand ruta. Sensibilisme de genul evrei gazati si negri saraci, cacamas sa ma cac cu alzaimerul ei.

    Pula mea nu stiu cum de nu m-am facut eu geniu pana acuma. O fi milostivul si bunul dumnezeu cu planuri extra pentru mine.

  17. *oricum n-ai nevoie de o conexiune daca ai deja descarcate hartile in telefon sau aparat.

  18. Nu l-am inventat eu. L-au inventat alţii. Tocmai că eu n-am pretenţia asta.

  19. Mircea Popescu`s avatar
    19
    Mircea Popescu 
    Friday, 20 January 2012

    @Freud Mei stii ce ? Hai ca tot esti tu incepator in ale internetilor si relevantei, hai sa-ti dau ceva de facut. Uite, pe puncte :

    1. Mergi frumusel si aduna tu toate textele de Caragiale intr-un singur mare fisier. Le iei cu copy-paste sau cum, da' sa fie toate.
    2. Uploadeaza fisierul pe server, adapteaza programul de-aici asa fel incit sa-ti numere cuvintele (sau mai era unul care numara cuvinte gata facut, tot pe-aici, daca ala iti convine mai mult)
    3. Pune rezultatele in Open Office si fa niste histograme (si aia e explicata pe undeva pe-aici)
    4. Publica toate datele astea frumos intr-un articol, care va fi primul tau articol documentat si relevant

    Hai, spor.

    @Lotus Foarte bine, nici n-ai avea de ce s-o ai. Spre deosebire de, spre exemplu, mine.

  1. [...] cuvintul "uslas*". In articolul citat (1800 de cuvinte) apare de doua ori. Pe Trilema (vreo trei milioane de cuvinte) apare de 0 [...]

  2. [...] un om inteligent si educat ? Sunt sigur ca nu. Pur si simplu, mi-ar place sa pot fi contrazis (cum imi place ori de cite ori sunt contrazis in convingerile astea triste, chiar daca se intimpla rar de tot) dar nutresc ferma convingerea ca [...]

  3. [...] minte ca nu demult am publicat un articol cu norul de etichete de-aici, plingindu-ma ca nu foloseste la nimic pina la urma ? Ei, ca sa vezi chestie : e adevarat [...]

Add your cents! »
    If this is your first comment, it will wait to be approved. This usually takes a few hours. Subsequent comments are not delayed.