Cautari Inteligente - stemuire si lematizare

PEAR, Smarty, ADOdb, OOP, PHP 5, XML, UML, Şabloane de proiectare, PHP-GTK.

Moderatori: coditza, Emil, Moderatori

crowbar_junkie
PHPRomania Supporter
Mesaje: 19
Membru din: Vin Iul 14, 2006 9:28 pm

Cautari Inteligente - stemuire si lematizare

Mesajde crowbar_junkie » 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!



Avatar utilizator
matheuzzy
Senior Member
Mesaje: 383
Membru din: Dum Apr 26, 2009 4:42 pm
Localitate: Bucuresti

Mesajde matheuzzy » Lun Aug 30, 2010 11:20 am


crowbar_junkie
PHPRomania Supporter
Mesaje: 19
Membru din: Vin Iul 14, 2006 9:28 pm

Mesajde crowbar_junkie » Lun Aug 30, 2010 2:02 pm


Avatar utilizator
Birkoff
Senior Member
Mesaje: 6380
Membru din: Joi Mar 18, 2004 2:34 pm
Localitate: Bucuresti
Contact:

Mesajde Birkoff » Lun Aug 30, 2010 3:28 pm

vezi daca te ajuta algoritmul spus in acest tutorial
1) )
2)
3) (open source)
4) Vrei un magazin virtual la cheie, usor de folosit, cu api-uri incluse pentru maximizarea vanzarilor si multe alte facilitati? Da un semn si discutam.

crowbar_junkie
PHPRomania Supporter
Mesaje: 19
Membru din: Vin Iul 14, 2006 9:28 pm

Mesajde crowbar_junkie » Lun Aug 30, 2010 8:55 pm

Edit: Multumesc mult pentru idee. Initial am crezut ca vrei sa imi sugerezi un sistem de auto-correct, dar mi-am dat seama ca impreuna cu un dictionar, se pot face niste lucruri tare interesante cu distanta levenstein. O sa lucrez la asta, si daca totul iese conform planului voi posta rezultatul.[/b]


Înapoi la “PHP Avansat”

Cine este conectat

Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 8 vizitatori