Nor de etichete
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.
- trilema_litera_a (3`769 cuvinte, 66`405 ocurente).
- trilema_litera_b (1`796 cuvinte, 17`583 ocurente).
- trilema_litera_c (5`086 cuvinte, 73`381 ocurente).
- trilema_litera_d (2`740 cuvinte, 43`206 ocurente).
- trilema_litera_e (1`617 cuvinte, 21`923 ocurente).
- trilema_litera_f (1`895 cuvinte, 29`033 ocurente).
- trilema_litera_g (1`204 cuvinte, 14`070 ocurente).
- trilema_litera_h (534 cuvinte, 3`473 ocurente).
- trilema_litera_i (3`811 cuvinte, 54`383 ocurente).
- trilema_litera_j (340 cuvinte, 3`764 ocurente).
- trilema_litera_k (122 cuvinte, 708 ocurente).
- trilema_litera_l (1`201 cuvinte, 17`969 ocurente).
- trilema_litera_m (2`634 cuvinte, 35`348 ocurente).
- trilema_litera_n (1`756 cuvinte, 23`848 ocurente).
- trilema_litera_o (1091 cuvinte, 19`730 ocurente).
- trilema_litera_p (4`571 cuvinte, 79`554 ocurente).
- trilema_litera_q (28 cuvinte, 136 ocurente).
- trilema_litera_r (2`362 cuvinte, 30`915 ocurente).
- trilema_litera_s (4`371 cuvinte, 59`036 ocurente).
- trilema_litera_t (2`178 cuvinte, 31`852 ocurente).
- trilema_litera_u (636 cuvinte, 9`407 ocurente).
- trilema_litera_v (1`169 cuvinte, 18`528 ocurente).
- trilema_litera_w (197 cuvinte, 1`489 ocurente).
- trilema_litera_x (12 cuvinte, 59 ocurente).
- trilema_litera_y (26 cuvinte, 198 ocurente).
- trilema_litera_z (286 cuvinte, 2`927 ocurente).
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.
———- "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. [↩]
Friday, 20 January 2012
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.
Friday, 20 January 2012
Da' n-am inteles de ce ? Io-s foarte multumit de lamp, pe bune acuma.
Friday, 20 January 2012
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.
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.
Friday, 20 January 2012
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.
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 ?
Friday, 20 January 2012
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.
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
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.
Friday, 20 January 2012
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ă.
Friday, 20 January 2012
A, pai am gindit ca tu zici sa faci ssh ca root.
Friday, 20 January 2012
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?
Friday, 20 January 2012
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.
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.
Friday, 20 January 2012
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.
Friday, 20 January 2012
Pai retorica nu era, ci mai degraba absurda. Care-i pasul urmator, ai inventat fermoarul da' ai omis sa publici ?
Friday, 20 January 2012
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.
Friday, 20 January 2012
*oricum n-ai nevoie de o conexiune daca ai deja descarcate hartile in telefon sau aparat.
Friday, 20 January 2012
Nu l-am inventat eu. L-au inventat alţii. Tocmai că eu n-am pretenţia asta.
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 :
Hai, spor.
@Lotus Foarte bine, nici n-ai avea de ce s-o ai. Spre deosebire de, spre exemplu, mine.