Cautari Inteligente - stemuire si lematizare
Scris: Dum Aug 29, 2010 2:56 pm
De curand ma confrunt cu o dilema: cum pot reliza un algoritm de cautare inteligent pentru fraze din limba romana.
In momentul de fata, algoritmul functioneaza in felul urmator:
Pentru baza de date:
* se formeaza o fraza din campurile ce urmeaza a fi cautate
* se substituie caracterele nepermise ([^\w-]) cu spatiu
* se transforma diacriticele in cuvinte normale
* se formeaza o lista de cuvinte
* se elimina duplicatele din lista
* se elimina cuvintele des intalnite din lista (ex: si, sau)
* se consulta un dictionar (pentru a nu stemui nume proprii, branduri, samd ex: nike - stem: nik / la cautare ar gasi nike, cat si nikon). Daca cuvantul respectiv exista in dictionar, se extrage radacina lui folosind algoritmul de stemuire descris aici:
http://snowball.tartarus.org/algorithms ... emmer.html
Radacina cuvantului reprezinta o parte a cuvantului folosita pentru derivare. A nu se confunda cu baza unui cuvant. (ex: abstractizare - stem: abstractiz - radacina: abstract). In continuare, daca radacina cuvantului este mai lunga de 3 caractere, se adauga intr-o noua lista. In caz contrar, se pastreaza cuvantul initial, care se adauga la randul lui in acea lista. Verificarea pentru cele 3 caractere se realizeaza datorita posibilitatii ca mai multe cuvinte sa aiba aceeasi radacina.
* se adauga lista nou formata intr-un camp optimizat pentru cautari full-text din baza de date.
Pentru fraza cautata:
* acelasi sistem ca cel prezentat mai sus, exceptand pasul 1
* se realizeaza cautarea in campul full-text
* rezultatele vor fi indexate automat de catre baza de date dupa relevanta
EXEMPLU
Fraza din baza de date: masinuta absorbanta nike
Fraza rezultata: masin absorb nike
Fraza cautata: masini absorbante nike
Fraza rezultata: masin absorb nike
Intrebarea mea este urmatoarea: exista la momentul actual un lematizator (algoritm de extragere a bazei unui cuvant) stabil pentru limba romana sau a lucrat cineva la ceva asemanator? Lematizatorul ar elimina posibilitatea de a gasi radacini identice pentru cuvinte diferite si ar imbunatatii cautarile. Iar daca nu, ce recomandare mi-ati putea da pentru a imbunatatii cautarea? Credeti ca ar fi benefica implementarea unui dictionar de sinonime? Mentionez ca baza de date contine aproximativ 3.5 mil de randuri.
Daca este cineva care doreste algoritmul de stemuire transpus in php, cereti si vi se va da
Multumesc anticipat!
In momentul de fata, algoritmul functioneaza in felul urmator:
Pentru baza de date:
* se formeaza o fraza din campurile ce urmeaza a fi cautate
* se substituie caracterele nepermise ([^\w-]) cu spatiu
* se transforma diacriticele in cuvinte normale
* se formeaza o lista de cuvinte
* se elimina duplicatele din lista
* se elimina cuvintele des intalnite din lista (ex: si, sau)
* se consulta un dictionar (pentru a nu stemui nume proprii, branduri, samd ex: nike - stem: nik / la cautare ar gasi nike, cat si nikon). Daca cuvantul respectiv exista in dictionar, se extrage radacina lui folosind algoritmul de stemuire descris aici:
http://snowball.tartarus.org/algorithms ... emmer.html
Radacina cuvantului reprezinta o parte a cuvantului folosita pentru derivare. A nu se confunda cu baza unui cuvant. (ex: abstractizare - stem: abstractiz - radacina: abstract). In continuare, daca radacina cuvantului este mai lunga de 3 caractere, se adauga intr-o noua lista. In caz contrar, se pastreaza cuvantul initial, care se adauga la randul lui in acea lista. Verificarea pentru cele 3 caractere se realizeaza datorita posibilitatii ca mai multe cuvinte sa aiba aceeasi radacina.
* se adauga lista nou formata intr-un camp optimizat pentru cautari full-text din baza de date.
Pentru fraza cautata:
* acelasi sistem ca cel prezentat mai sus, exceptand pasul 1
* se realizeaza cautarea in campul full-text
* rezultatele vor fi indexate automat de catre baza de date dupa relevanta
EXEMPLU
Fraza din baza de date: masinuta absorbanta nike
Fraza rezultata: masin absorb nike
Fraza cautata: masini absorbante nike
Fraza rezultata: masin absorb nike
Intrebarea mea este urmatoarea: exista la momentul actual un lematizator (algoritm de extragere a bazei unui cuvant) stabil pentru limba romana sau a lucrat cineva la ceva asemanator? Lematizatorul ar elimina posibilitatea de a gasi radacini identice pentru cuvinte diferite si ar imbunatatii cautarile. Iar daca nu, ce recomandare mi-ati putea da pentru a imbunatatii cautarea? Credeti ca ar fi benefica implementarea unui dictionar de sinonime? Mentionez ca baza de date contine aproximativ 3.5 mil de randuri.
Daca este cineva care doreste algoritmul de stemuire transpus in php, cereti si vi se va da
Multumesc anticipat!