Fluxul de date
Introducere
Cred că este utilă o documentare a fluxului de date al dexonline. Această documentaţie poate fi folosită pentru eventualii noi dezvoltatori, precum şi pentru clarificarea unor aspecte ale părţilor care compun dexonline.ro
În mare, partea vizibilă a dexonline conţine punctele extreme ale fluxului de date: intrarea - căsuţa de căutare cu eventualele opţiuni şi ieşirea - rezultatele căutărilor - ce se întîmplă între aceste puncte fiind transparent din punctul de vedere al utilizatorului.
Componente
Intrarea
Această componentă a fluxului de date este alcătuită din:
- şirul de caractere din căsuţa de căutare;
- setul de caractere folosit de utilizator;
Importanţa setului de caractere este relevată mai ales pentru capacitatea dexonline de răspunde la o cît mai mare plajă de solicitări (de exemplu seturile de caractere ISO-8859-16 sau MacRomanian? unde se foloseşte pentru ş şi ţ în loc de sedilă virgula, în conformitate cu standardele în vigoare ale Academiei).
Şirul de caractere este relevant şi prin prisma caracterelor pe care le conţine. Astfel se pot considera următoarele tipuri de şiruri de caractere:
- alfabetice (fără diacritice, cu una dintre cele două ortografii)
- alfabetice (cu diacritice, cu una dintre cele două ortografii)
- cu wildcard-uri
Pe lîngă conţinutul propriu al şirului de căutare, se pot face consideraţii despre conţinutul căutării:
- căutare exactă
- căutare aproximativă
- căutarea termenilor ştiinţifici
- căutarea expresiilor
- căutarea definiţiilor după conţinut
Deoarece consider că promovarea diacriticelor este o prioritate, cred că ar trebui optimizată căutarea pentru diacritice, căutările fără diacritice putînd să fie suboptimale.
Căutarea propriu zisă
Cum se face căutarea în acest moment
De completat (CătălinFrâncu)
"Momentul" e cam greu de definit, întrucât lucrez la introducerea (şi folosirea) formelor flexionare, deci lucrurile sunt în curs de schimbare. Iată cum îmi imaginez eu căutarea:
- Pentru toţi paşii enumeraţi mai jos, folosim collate-ul utf8_romanian_ci dacă şirul de intrare conţine diacritice româneşti sau utf8_general_ci altfel. Acest lucru urmează să fie personalizat, întrucât pentru unii utilizatori este supărător. Cu algoritmul curent, este imposibil de obţinut definiţia pentru "mal" fără a o obţine şi pe cea pentru "mâl", de exemplu.
- Voi adăuga la tabela lexems câmpul lexems.neaccentuat, care este identic cu lexems.forma, dar fără accent (elimin apostrofurile). Nu ştiu dacă pe viitor vom păstra informaţiile despre accent, dar presupun că da, pentru că LOC le foloseşte.
- Intenţia paşilor de mai jos este să producă o listă de lexeme. Căutarea este completată prin încărcarea definiţiilor corespunzătoare acelor lexeme şi ordonarea lor alfabetică.
Paşii urmaţi sunt:
- Dacă şirul de intrare S conţine unul din caracterele * ? [ ], atunci considerăm S ca fiind o expresie regulată şi returnăm lexemele pentru care lexems.lexem_neaccentuat like/rlike S. Folosim like pentru expresii simple (care conţin numai * şi ?) şi rlike pentru celelalte, pentru viteză. Subliniez că aplicăm expresia regulată formelor de bază, nu şi celor flexionare, întrucât nu cred că are rost.
- Dacă S nu este o expresie regulată, returnăm lexemele pentru care lexems.lexem_neaccentuat = S (căutare exactă).
- Dacă pasul 2 nu produce rezultate, returnăm lexemele conform select distinct wl_lexem from wordlist where wl_form = S (căutare flexionară).
- Dacă pasul 3 nu produce rezultate, returnăm lexemele pentru care dist2(lexems.lexem_neaccentuat, S). dist2 este o funcţie rapidă, dar cam neconcludentă, care returnează TRUE dacă cele două şiruri diferă prin cel mult un caracter (inserat, şters sau modificat). Din nou, căutarea aproximativă se face în tabela lexems, nu în wordlist.
Afişarea: Dacă paşii 2 sau 3 produc rezultate, afişăm definiţiile corespunzătoare lexemelor, precum şi un link pe care utilizatorul poate da click pentru a vedea flexiunile. Pentru căutările cu expresii regulate şi pentru cele aproximative, afişăm doar lista de lexeme, din multiple motive:
- Viteză
- Inutilitate (cred că e mult mai util să afişăm, compact, toate lexemele rezultate, decât o mare de definiţii);
- Scăpăm de nevoia paginării. Căutările normale produc maxim 15-20 de definiţii (de obicei 4-5).
- Pentru căutările aproximative, lipsa definiţiilor este un indiciu că nu există definiţii pentru cuvântul căutat, ci pentru altele similare. Am primit plângeri de la utilizatori care spuneau că nu este evident când caută un cuvânt care nu există.
- Scăpăm de pagina wordlist.php, care se ocupa tocmai de afişarea lexemelor fără definiţii.
În prezent, mai există şi cazul special când şirul de intrare conţine numai cifre. În acest caz, interpretăm numărul drept ID-ul unei definiţii şi afişăm definiţia cu ID-ul dat, dacă există. În viitorul apropiat, acest mecanism trebuie înlocuit prin parametri GET separaţi, de exemplu definitionId=X pentru definiţii sau lexemId=Y pentru a afişa numai definiţiile corespunzătoare lexemului cu ID = Y. Parametrul cuv=Z va fi folosit exclusiv pentru căutări de tip text.
Care sînt toate posibilitaăţile de căutare
După tipul de caractere introduse:
- cu diacritice
- fără diacritice
După ortografie:
- cu â, sunt, suntem
- cu i, sînt, sîntem
- ortografii vechi (există posibilitatea ca cineva să dorească să ştie ce înseamnă "vênt" sau "tênĕr")
După conţinut:
- căutare cu expresii regulate
- căutarea după variante morfologice (flexionate) ale intrărilor
- căutare după proprietăţi ale intrărilor:
- după partea de vorbire
- defective
- abrevieri
- etc
- căutarea după conţinutul definiţiei (full-text search)
- căutarea termenilor ştiinţifici (în unele definiţii apar în cadrul definiţiei, însă nu în toate; în cazul în care avem disponibile nomenclatoare din diverse domenii, le putem folosi)
După exactitate:
- căutare exactă
- căutarea unui cuvînt care lipseşte momentan din dicţionar (posibilă în cazul în care avem resurse de texte în limba română)
- căutare cu erori (diverşi algoritmi posibili)
Soluţii posibile
În acest moment nu există nici un fel de metodă prin care se poate forţa un anume tip de căutare, tipul de căutare folosit determinîndu-se pe baza unor algoritmi. Din păcate, acest lucru nu este suficient, în special în cazul în care vor fi extinse modaltăţile de căutare.
Cea mai simplă metodă pare a fi folosirea a două pagini de căutare: una ca în acest moment, alta fiind o pagină de căutare avansată în care se pot alege diferite combinaţii dintre căutările enumerate în secţiunea precedentă.
Altă variantă (nu neapărat complementară) ar fi ca în pagina de preferinţe să se poată seta tipul de căutare favorit, sau o ordonare a tipurilor posibile, însă probabil această soluţie nu va elimina necesitatea introducerii paginii de căutare avansată.
Afişarea rezultatelor
Deşi pare o problemă trivială, este importantă stabilirea ordinii în care se vor afişa rezultatele, din mai multe puncte de vedere, în special datorită faptului că implică o organizare mai clară a rezultatelor.
Există mai multe cazuri posibile (chiar şi enumerarea acestora necesitînd o clasificare atentă):
- la ieşire este un singur cuvînt
- la ieşire avem o listă de cuvinte
- la ieşire nu există nici un cuvînt (eventual putem genera nişte sugestii)
De asemenea există şi o problemă de lay out, în afară de afişarea de tip coadă, putîndu-se face diverse ordonări (lexicografică, după relevanţă etc.) sau grupări (după sursă, după relevanţă etc.)
Aici există două variante: existenţa unor parametri în setările personale sau existenţa pe pagină (şi pasate prin intermediul cookie-urilor) a funcţiilor care permit aplicarea diverselor sortări/grupări.
![(please configure the [header_logo] section in trac.ini)](http://wiki.dexonline.ro/raw-attachment/wiki/WikiStart/logo-wiki.png)