[ erekoz @ 10.10.2003. 16:05 ] @

Pozdrav svima prisutnima,

Mozda neko moze da mi pomogne sa sledecim problemom. Korisnik unese string, koji je obicno recenica. Treba da postavim upit tako da ako se u bazi nalazi rec koja se nalazi u stringu, tu rec i dobijem iz baze. (baza je MySQL).

Unapred zahvalan, erekoz
[ dinol @ 10.10.2003. 20:12 ] @
A u cemu programiraš

ako je PHP u pitanju pogledaj implode() i explode() func.

Rastaviš rečenicu u niz, i za svaki član niza ispituješ da li se nalazi u bazi.

Pomogao bih ti konkretinje, al iskreno niti imam pojma kakve su ti tabele niti koji prog jezik koristiš?!?!
[ erekoz @ 10.10.2003. 20:34 ] @

Program se pise u Delphiju. Baza je MySQL, a polja koja se pretrazuju su stringovi. Svaki zapis stringa ima jedinstveni broj povezan sa njim, zapisi brojeva su integer. Vec mi je palo na pamet da uradim to sa cepanjem na reci i pretrazivanjem baze, no i dalje se mucim oko algoritma. Ideja mi je bila da pretrazim bazu svakom recju, i sacuvam sifre svih pojavljivanja reci u nizu. Tako za svaku rec. Kada to uradim, trebalo bi nekako da uporedim nizove, izdvojim najverovatnije zapise na osnovu sifara, i to povucem iz baze. No, nisam siguran kako da odradim to uporedjivanje i odredjivanje sta je najverovatnije. Zato se pitam da li postoji SQL funkcija koja bi to odradila za mene?

[ Deep|Blue @ 11.10.2003. 00:50 ] @
Citat:
erekoz:

Program se pise u Delphiju. Baza je MySQL, a polja koja se pretrazuju su stringovi. Svaki zapis stringa ima jedinstveni broj povezan sa njim, zapisi brojeva su integer. Vec mi je palo na pamet da uradim to sa cepanjem na reci i pretrazivanjem baze, no i dalje se mucim oko algoritma. Ideja mi je bila da pretrazim bazu svakom recju, i sacuvam sifre svih pojavljivanja reci u nizu. Tako za svaku rec. Kada to uradim, trebalo bi nekako da uporedim nizove, izdvojim najverovatnije zapise na osnovu sifara, i to povucem iz baze. No, nisam siguran kako da odradim to uporedjivanje i odredjivanje sta je najverovatnije. Zato se pitam da li postoji SQL funkcija koja bi to odradila za mene?


pa.... bojim se da ne postoji takva funkcija na sql-u

a algoritam za to i nije toliko tezak

while len(recenica) >0
begin

{ovde ti treba funkcija za pronalazenje prvog blanka u recenici, ne znam tacno kako glasi }

{sledeci korak je da odseces prvu rec s leve strane prema indeksu prvog blanko karaktera u recenici}

{sledi upit u bazu za datu rec, uzimas id, trpas ga u niz i sta ti vec treba}

{odsecas prvu rec i prvi blanko iz recenice}

end {while}
[ degojs @ 11.10.2003. 01:10 ] @
SELECT recID, rec FROM .. WHERE rec IN (rec1, rec2, rec3..)

Naravno recenicu moras da rastavis na reci (rec1, rec2, rec3..).

/edit:
tek sad vidim da radis sa mySQL, a ja doticnu nisam ni video :) Tako da.. uzmi sve sa rezervom. Pogledaj, mozda ima funkcija tipa split koja bi ti pomogla. A ako SQL izraz saljes iz aplikacije (pisane u Delphi-ju) onda ne bi trebalo da je problem.

[Ovu poruku je menjao degojs dana 10.10.2003. u 21:46 GMT]
[ Deep|Blue @ 11.10.2003. 01:31 ] @
pritom ne moras nuzno da resavas problem u delfiju, mozes to da ubacis i u proceduru na sql serveru.
[ Nub.Saibot @ 11.10.2003. 11:51 ] @
Nisam siguran sta ti znaci ono da odredis sta je najverovatnije, ali da probamo. Ako imas recenicu na ulazu i hoces da pronadjes string u bazi koji najvise odgovara recenici na ulazu mozes to da izvedes na sledeci nacin:

1. Razbijes recenicu na reci koje drzis u StringList
Code:

  ExtractStrings([' ', ',', ';', '.'] ,   //Ode su navedeni moguci separatori izmedju reci
  [' '],  PChar(recenica),  reci);
 


2. Za svaku rec pravis upit u bazu koji bi trebao da lici na nesto ovako
Code:

  SELECT SIF FROM TABELA_STRINGOVA
  WHERE (STRING LIKE '%reci[i]%')
  ORDER BY SIF
 


3. Posle svakog upita rezultate upises u neku listu sifre koje je vratio upit. Ovo ovde je skakljivo ako je tabela strngova velika :)

4. Prolaskom kroz listu nadjes koje se sifre najvise pojavljuju i prikazes string koji je najverovatniji.

Mozda bi mogao da se napravi upit koji bi racunao za sve reci odjednom, ali nisam siguran da li bi to bilo moguce ako su recenice velike.

Ako ovo nije ono sto si ti mislio onda daj jos detalja pa da probam ponovo :)

Pozdrav
[ erekoz @ 11.10.2003. 15:08 ] @

Problem sa odredjivanjem najverovatnijeg zapisa se javlja iz odredjenog razloga . Naime, baza koja se pretrazuje je baza mp3-a. Polja u bazi su, izmedju ostalog, ordinal,artist,title. Baza nije preterano velika (1000~1500 zapisa). Ne bi bilo problema kada bi korisnici ukucavali ime artista ili ime pesme. Medjutim, korisnici ce ukucavati nestruktuirani string tipa : " Ej pustite mi od Red Hot Chili Peppersa nesto ako imate, a ako nemate onda mi pustite Madonnu". Ja mogu da rastavim string na reci, da njima pretrazim bazu,no javlja se problem da rec koja nema veze sa imenom artista ili pesme bude sadrzana u nekom zapisu u bazi. Sad, buduci da postoji artist sa najvecim brojem pesama u bazi, mogu da odstranim nevazne reci tako sto ako broj zapisa neke reci bude veci od broja zapisa artista sa maksimalnim brojem pesama, ta rec bude odbacena iz pretrage. No sta da radim sa onima ciji je broj pojavljivanja u bazi manji od maksimalne vrednosti. Zbog toga sam pricao o odredjivanju najverovatnijeg zapisa. U sustini. ovo je problem pretrazivanja baze nestruktuiranim stringom, bar mi se tako cini.
[ Deep|Blue @ 12.10.2003. 01:54 ] @
kako se boris sa sintaksom i gramatikom ???
-daj neku pesmu od Madone
-daj neku pesmu od Madonne
-daj neku Madoninu pesmu
-daj nesto madonino

[ erekoz @ 12.10.2003. 02:42 ] @

O tome jos nisam ni poceo da razmisljam..., korak po korak :-)
[ Deep|Blue @ 12.10.2003. 02:57 ] @
Koliko mi se cini pored probelema nestrukturiranog striga, mnogo veci problem ti je upravo sintaksa. Ok slucaj kad znas da neka rec u recenici mora da postoji u bazi, ali kad imas rec u recenici koja za "par" slova odstupa od svoje ispravne verzije u bazi sta onda uopste pretrazivati???

Sve ovo me podseca na one fore sa sms porukama na tv-u.
[ degojs @ 12.10.2003. 05:48 ] @
Citat:
DeepBlue:
kako se boris sa sintaksom i gramatikom ???
-daj neku pesmu od Madone
-daj neku pesmu od Madonne
-daj neku Madoninu pesmu
-daj nesto madonino


Ovo nije problem: postoje funkcije poput SOUNDEX i DIFFERENCE (Oracle, SQL Server). Ne znam samo ima li ih i na mySQL (bar zna šta da traži :).


[ Deep|Blue @ 12.10.2003. 14:27 ] @
Hmm nisu lose funkcije. Jesi li ih isprobavao sa nasim recima?
nesto sam se malo zezao i cini mi se da soundex manje vishe pazi na raspored i kolicinu konsonanta. difference se ponasa slicno.

npr. poredeci sa vec pomenutom madonom (madonna), obe funkcije nisu nasli razliku sa recima poput Maiden, medena, modna, Modena, madna, moodena, medna, modne, mooduuuuna ...

koliko je moguce ispraviti ovo algoritmom.

erekoz, koliko je uopste bitno da se zahtev ispravno protumaci, tj da ne pustis Iron Maiden umesto Madonne?
[ degojs @ 12.10.2003. 17:24 ] @
DeepBlue,
a da se zaustavimo ovde? Rešava se problem koji i nije još problem.

Pozdrav.
[ Nub.Saibot @ 13.10.2003. 12:13 ] @
Citat:
Deep|Blue:
Hmm nisu lose funkcije. Jesi li ih isprobavao sa nasim recima?
nesto sam se malo zezao i cini mi se da soundex manje vishe pazi na raspored i kolicinu konsonanta. difference se ponasa slicno.

npr. poredeci sa vec pomenutom madonom (madonna), obe funkcije nisu nasli razliku sa recima poput Maiden, medena, modna, Modena, madna, moodena, medna, modne, mooduuuuna ...

koliko je moguce ispraviti ovo algoritmom.

erekoz, koliko je uopste bitno da se zahtev ispravno protumaci, tj da ne pustis Iron Maiden umesto Madonne?


U delphiju se soundex moze podesiti da vraca vise od cetiri karaktera za neku rec sto joj najverovatnije moze povecati preciznost, ali ovo treba proveriti.

Posto sam gore vec predlagao na koji bi nacin mogao da se resi ovaj problem imam neke ispravke.

Najbolje bi bilo da se za svaki uneti string (Autor, Naziv pesme, ...) u bazu generise soundex za svaku rec tog stringa i da se rec zameni sa soundexom. Npr.

U bazu se unosi:
Iron Maiden - The Clairvoiant
i za njega generisemo SoundEx oznake npr.:
I2345 M2333 T0011 C2345

Sada kad pretrazujemo bazu svaku rec iz recenice koju smo rastavili pretvorimo u njen SoundEx ekvivalent i pitamo u bazi da nam vrati sve stringove gde postoji taj SoundEx
Rezulate pretrage za svaku rec prebacimo u niz i na kraju izvucemo iz njega sifru stringa koji se najvise ponavlja.

Sta mislite o ovome?


Pozdrav
Ivan

P.S. Ako budem imao vremena pokusacu da napisem kod sa ovim mojim resenjem pa da vidim kako ce da radi.
[ Cola @ 08.12.2011. 07:04 ] @
OK na ovu temu nije pisano douuuugo ali je ovo ono što mi treba.

Kako da iz mysql baze dobijem odgovarajuće slogove
U bazi imam tabelu (radi primjetra pojednostavićemo stvari, nazive tabela i kolona)
Text(TextId, TextSadzaj)
recimo da je zadan neki string. Ja mogu splitovati unos na onoliko riječi koliko ih ima (u slučaju "Iron Maiden - The Clairvoiant" ima 5 riječi) i od svake uraditi soundex.
Kako da pretražijemo po koloni TextSadrzaj. Napominjem da tabela Text sadrži mnogo slogova.

Meni pada ideja jedino da prilikom indeksiranja tj inserta u bazu Text razbijem sadržaj na riječi i od svake uradim soundex i insertujem u drugu tabelu
TextSoundex(TextId, SoundexId, VrijednostSoundexa)

onda da odradim nešto slično ovome (upit sam samo ovako kakucao ne znam da li radi):
Code:

SELECT
 T.TextId,
 T.TextSadrzaj
FROM Text T
 LEFT JOIN TextSoundex S
  ON T.TextId = S.TextId
WHERE S.VrijednostSoundexa IN ('I2345', 'M2333', 'T0011', 'C2345') --svi soundexi iz upita
GROUP BY 
 T.TextId,
 T.TextSadrzaj
ORDER BY
 COUNT(S.SoundexId) DESC

Ideja je sledeća da se prebroji koliko se soundex-a iz korisničkog upita poklapa sa rekstom iz baze. Malo me ovo brije jer će tabela TextSoundex da bude prevelika.
Postoji li kakva alternativa?