Fluxul de date

Versiunea din 24 ianuarie 2018 17:07, autor: Cătălin.Frâncu (discuție | contribuții) (Înlocuire de text - 'lexemId' în 'lexemeId')
(dif) ← Versiunea anterioară | Versiunea curentă (dif) | Versiunea următoare → (dif)

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:

  1. 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.
  2. Dacă S nu este o expresie regulată, returnăm lexemele pentru care lexems.lexem_neaccentuat = S (căutare exactă).
  3. Dacă pasul 2 nu produce rezultate, returnăm lexemele conform select distinct wl_lexem from wordlist where wl_form = S (căutare flexionară).
  4. 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 lexemeId=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 posibilităț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 modalităț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.