wiki:Concepte

Concepte

ACEASTĂ PAGINĂ ESTE ÎNVECHITĂ. Vezi FlexiuniLoc pentru implementarea care a fost adoptată în practică.

Iată o propunere pentru introducerea conceptelor în DEX online.

Starea curentă

Schema bazei de date

În prezent, DEX online foloseşte două tabele pentru a stoca definiţiile şi cuvintele-titlu:

  • Word stochează cuvintele-titlu. Câmpuri:
    • Id -- Identificator unic;
    • Dname -- Valoarea cuvântului (cu diacritice);
    • Name -- Valoarea cuvântului (fără diacritice);
    • Priority -- Indică ordinea cuvintelor-titlu aşa cum au fost introduse de moderator (în cazul în care o definiţie are mai multe cuvinte titlu);
    • DefinitionId -- Indică definiţia căreia îi aparţine acest cuvânt-titlu;
  • Definition stochează definiţiile. Câmpuri:
    • Id -- Identificator unic;
    • InternalRep -- Textul definiţiei în formatul intern al DEX online;
    • HtmlRep -- Textul definiţiei în format HTML, gata de afişat;
    • Lexicon -- Câmp folosit pentru ordonarea corectă a definiţiilor. La afişare, definiţiile sunt ordonate după acest câmp;
    • Status -- 0 = definiţie activă, 1 = definiţie încă nemoderată, 2 = definiţie ştearsă
    • (celelalte câmpuri nu sunt relevante pentru această tranziţie).

Aşadar, relaţia între cele două tabele este de 1:n (o definiţie are unul sau mai multe cuvinte-titlu). Dacă mai multe definiţii folosesc acelaşi cuvânt-titlu, în tabela Word apar mai multe înregistrări cu aceleaşi valori pentru câmpurile Dname şi Name. De exemplu, avem 13 definiţii pentru "copil" (11 active, 2 şterse) şi 13 înregistrări în Word pentru care Dname = "copil".

Dacă o definiţie are n cuvinte titlu, în Word sunt create n înregistrări, iar câmpul Priority ia valori de la 0 la n-1. Primul dintre aceste cuvinte-titlu (cel pentru care Priority = 0) este special: pe baza lui se face ordonarea definiţiilor la afişare. De exemplu, dacă definiţia D1 are cuvintele-titlu C şi A (în această ordine), iar definiţia D2 are cuvântul-titlu B, atunci definiţia D2 va fi întotdeauna afişată înainte de D1, deoarece C este înainte de B (cuvântul-titlu A nu contează, nu intervine niciodată în ordonare).

Exemple

Când utilizatorul caută cuvântul 'copil', efectuăm două query-uri MySQL:

select count(distinct Definition.Id) as c
  from Word join Definition on Word.DefinitionId = Definition.Id
  where Word.Name = 'copil'
    and Definition.Status = 0

pentru a afla numărul de rezultate şi

select distinct Definition.*
  from Word join Definition on Word.DefinitionId = Definition.Id
  where Word.Name = 'copil'
    and Status = 0
  order by Definition.Lexicon, Definition.SourceId
  limit 0, 10

pentru a extrage prima pagină de 10 rezultate. De remarcat că trebuie să folosim clauza distinct, care încetineşte un pic căutarea. Explicaţia este că o definiţie poate avea două cuvinte-titlu, cum ar fi cearceaf şi cearşaf. Dacă cineva caută cear*, nu dorim să returnăm aceeaşi definiţie de două ori. Altă posibilitate este ca o definiţie să aibă două cuvinte-titlu diferite în forma cu diacritice, dar identice în forma fără diacritice (batăr / batâr).

Deficienţe în starea curentă

Principalul neajuns este redundanţa din tabela Word. Avem 300.000 de cuvinte, dar numai 115.000 distincte. Aceasta are multe efecte dăunătoare:

  • Încetineşte toate căutările, dar mai ales pe cele cu expresii regulate. Partea cea mai costisitoare a unei căutări este confruntarea expresiei regulate introduse cu lista noastră de cuvinte.
  • O să ne complice viaţa în procesul de etichetare morfologică a cuvintelor, pentru că fiecare cuvânt trebuie etichetat, inclusiv toate cele redundante.
  • Dacă dorim să adăugăm mai multe cuvinte-titlu pentru o definiţie (de exemplu fata, morgana şi fatamorgana), trebuie să facem modificarea pentru toate definiţiile din toate sursele. Altfel, cele trei căutări vor întoarce seturi diferite de rezultate. Aceasta se vede clar la denumirile latineşti ale plantelor, pe care le-am introdus de curând. Iniţiativa este lăudabilă, dar am aplicat-o numai pentru unele definiţii. Din cauza asta, avem 6 rezultate pentru  măselariţă, dar unul singur pentru  hyoscyamus.

Al doilea neajuns este că în prezent ne este greu să confruntăm definiţiile din surse diferite care se completează reciproc (sau se contrazic). Exemple:

  • Pentru cuvântul  foc, DN este singurul care precizează varianta floc. Dacă am avea conceptul de foc separat în foc ca flacără şi foc ca pânză triunghiulară, am putea indica această variantă într-un singur loc şi n-ar trebui să o adăugăm la fiecare din definiţiile pentru foc ca pânză triunghiulară.
  • Multe dicţionare au două articole separate pentru omonime, numerotate cu 1 şi 2, ceea ce e minunat, dar uneori surse diferite numerotează articolele în mod diferit (vezi  sol în DEX '98 şi  sol în Nodex).
  • Uneori surse diferite folosesc forme diferite ale aceluiaşi termen, ceea ce înseamnă că cele două definiţii nu vor apărea niciodată împreună ca rezultat al unei căutări. Vezi de exemplu gimnastic/gimnastică, fizic/fizică şi toate celelalte perechi celebre. Ar fi mai simplu să le reunim întru-un concept comun.
  • Ceea ce o sursă consideră sens separat, tratat într-un articol separat, altă sursă poate considera doar un sens secundar, tratat în acelaşi articol (vezi de exemplu  cap: DEX '98 înglobează sensul de "conducător" împreună cu sensul de "extremitate", dar Nodex le tratează separat.

Introducerea conceptelor

Schema bazei de date

  • Word stochează cuvintele-titlu. Câmpuri:
    • Id -- Identificator unic;
    • Dname -- Valoarea cuvântului (cu diacritice);
    • Name -- Valoarea cuvântului (fără diacritice);
    • Priority -- Indică ordinea cuvintelor-titlu aşa cum au fost introduse de moderator (în cazul în care un concept are mai multe cuvinte-titlu);
    • ConceptId -- Indică conceptul căruia îi aparţine acest cuvânt-titlu;
  • Concept -- înmănunchează definiţiile care se referă, logic, la acelaşi concept. Câmpuri:
    • Id -- Identificator unic;
    • Description -- Scurtă descriere pentru a diferenţia conceptele omonime;
  • Definition stochează definiţiile. Câmpuri:
    • Id -- Identificator unic;
    • InternalRep -- Textul definiţiei în formatul intern al DEX online;
    • HtmlRep -- Textul definiţiei în format HTML, gata de afişat;
    • Lexicon -- Câmp folosit pentru ordonarea corectă a definiţiilor. La afişare, definiţiile sunt ordonate după acest câmp;
    • Status -- 0 = definiţie activă, 1 = definiţie încă nemoderată, 2 = definiţie ştearsă
    • (celelalte câmpuri nu sunt relevante pentru această tranziţie);
  • ConceptDefinitionMap conectează conceptele şi definiţiile. Câmpuri:
    • ConceptId -- Identificatorul conceptului;
    • DefinitionId -- Identificatorul definiţiei.

Relaţia între concepte şi definiţii este m:n, deoarece un concept poate avea mai multe definiţii (de exemplu, din surse diferite), iar o definiţie poate defini mai multe concepte (de exemplu fizic şi fizică). Cuvintele-titlu sunt asociate cu conceptele, ceea ce elimină redundanţa (chiar dacă un cuvânt are 5 definiţii, cuvintele-titlu sunt definite o singură dată). Pentru simplificarea implementării, relaţia concept-cuvânt rămâne în continuare 1:n. Cu alte cuvinte, pentru concepte omonime vor exista înregistrări duplicat în tabela Word. Acest gen de redundanţă este mult mai rar întâlnit.

Interfaţa utilizatorului

Aici sper să nu avem prea mult de modificat. Evident, se vor schimba query-urile MySQL efectuate pentru a răspunde la o căutare, dar prezentarea poate rămâne la fel. Eventual, putem afişa definiţiile grupate în concepte. De exemplu, pentru "copil" am putea afişa: "două concepte găsite" şi am putea afişa definiţiile pentru "fiu" înaintea celor pentru "lăstar". Dar asta ridică întrebări despre paginare şi ordonare alfabetică.

Interfaţa moderatorului

Asta cred că este partea cea mai grea a tranziţiei. Pagina moderatorului va servi în continuare la editarea definiţiei, a sursei, a stării şi a comentariului. Cuvintele-titlu nu vor mai fi editabile de aici, deoarece cuvintele-titlu sunt dictate de conceptele pe care le explică definiţia (care pot fi 2-3). În schimb, această pagină va permite asocierea definiţiei cu unul sau mai multe concepte. Vezi fig. 1.

Conceptele pot fi vizualizate şi editate dintr-o pagină separată, în care moderatorul va putea să definească cuvintele-titlu pentru acest concept şi să-i adauge o scurtă descriere pentru a diferenţia omonimele. Vezi fig. 2. De remarcat că moderatorul nu va putea adăuga/şterge definiţii pentru acest concept direct de pe această pagină (nu ştiu cum aş putea face o interfaţă simplă pentru asta).

Migrarea de la vechea structură la cea nouă

Partea asta am cam rezolvat-o. Au fost două probleme:

  1. Recalcularea câmpului Lexicon. În vechea structură calculam acest câmp pe baza cuvântului-titlu principal al definiţiei (cel pentru care Priority = 0). În noua structură, acest lucru nu mai este posibil, deoarece un set de cuvinte este asociat (prin intermediul unui concept) cu un set de definiţii. Am scris o funcţie care extrage valoarea câmpului Lexicon din definiţia însăşi.
  2. Crearea înregistrărilor în tabelele Concept şi ConceptDefinitionMap şi migrarea de la DefinitionId la ConceptId în tabela Word. Dilema a fost că unele definiţii (de exemplu cele pentru care cuvântul-titlu era barză) trebuiau grupate într-un singur concept, pe când altele (de exemplu cele care au un cuvânt titlu officinalis) nu trebuie grupate, pentru că nu au nici o legătură (officinalis este un termen latinesc des întâlnit la plante). Am decis să aleg doar cuvintele pentru care Priority = 0 şi pe acelea să le grupez după câmpul Dname. Apoi, cuvintele cu Priority > 0 au fost folosite pentru a adăuga cuvinte-titlu noi la conceptele definite anterior.

Aspecte încă nedefinite

CătălinFrâncu 12 octombrie 2006 20:16 (PDT)

Attachments