Newsgroup: it.comp.www.php
Titolo: Ricerca stringhe

Salve gente. Rieccomi di nuovo qui per un nuovo problema a cui 
sottoporre le menti più geniali di quest ng. :)
Restiamo, per convenzione, come sempre nell'ambito delle "abitazioni".
Supponiamo di avere un array di questo tipo:
$commenti = array( "abitazione" => "casa; abitazione;",
                   "camera_da_letto" => "camera da letto; stanza da 
letto;",
                   "camera_da_letto_singola" => "camera da letto 
singola; camera singola; stanza singola; stanza da letto singola;",
                   "camera_da_letto_matrimoniale" => "camera da letto 
matrimoniale; camera doppia; stanza doppia; stanza da letto doppia;",
                   "casa_rurale" => "casa rurale; rustico;",
                   "bagno" => "bagno; WC;" );
E supponiamo di avere una stringa di questo tipo:
$annuncio = "vendesi casa con stanza da letto singola, sala da pranzo e 
bagno.";
Bene, io vorrei che, parsando opportunamente l'$annuncio con le 
informazioni possedute (e cioè l'array $commenti, che per semplicità ho 
ridotto all'osso), venga fuori qualcosa del tipo:
"abitazione AND camera_da_letto_singola AND bagno"
In pratica, il parser va a cercare in $annuncio se le varie 
combinazioni di parole fanno matching esattamente con i valori 
dell'array $commenti.
Ma qui sorgono i problemi. Li espongo proseguendo con l'esempio. Si 
possono infatti presentare vari casi:
1) La parola "vendesi", ad esempio, non è presente in NESSUN valore 
dell'array $commenti. Nessun problema fin qui.
2) La parola "bagno" è presente UNA volta sola nell'array $commenti (e 
precisamente corrisponde alla chiave "bagno". Anche qui, tutto ok.
3) La parola "casa" è presente in DUE valori dell'array $commenti (e 
precisamente quelli aventi chiave "abitazione" e "casa_rurale"). E qui 
potrebbero già nascere dei problemi, in quanto in questo caso vorrei 
ottenere "abitazione" e NON "casa_rurale", in quanto nell'annuncio non 
è specificato l'attributo "rurale", ma si parla semplicemente di 
"casa".
4) La parola "stanza" è presente in TRE valori dell'array $commenti (e 
precisamente "camera_da_letto", 
"camera_da_letto_singola","camera_da_letto_matrimoniale"). Ma di questi 
tre, solo uno è quello voluto, e cioè "camera_da_letto_singola", in 
quanto è vero che la parola "stanza" è presente in TRE annunci, ma solo 
in UNO è presente ESATTAMENTE la successione di parole "stanza", "da", 
"letto", "singola".
Ecco dunque spiegato attraverso un esempio, di facile comprensione, 
l'entità del problema. In un certo senso i punti 3) e 4) sono uno 
l'opposto dell'altro (così come i punti 1) e 2) ).
Ho pensato a lungo su come operare per ottenere il risultato voluto.
Sicuramente ci saranno di mezzo cicli, e probabili ricorsioni.
Ma ahimé, non sono ancora riuscito a venirne a caso, se non con 
probabili idee veramente pesantissime.
Idee? ;)
-- 
rob4you

bagno.";
Dovresti innanzitutto ordinare i match dal piu' lungo al piu' breve. Poi
ti puo' convenire l'uso di preg_replace:
	vendesi {abitazione} con {camera_da_letto_singola},
{sala_da_pranzo} e {bagno}.
Prima ancora potresti eliminare le "null words"... di a da in con su per
tra fra ecc. :-), e anche vendesi/affittasi/permutasi/locasi/abbattesi.
A quel punto, "casa rurale" non matcha (non c'e'!), "casa" si' - ed ecco
che hai {abitazione}. "camera da letto singola" matcha, e, a quel punto,
"camera" non matcha piu' (ovviamente devi usare [\s$punteggiatura] o una
qualsiasi altra maniera di validare camera contro _camera_).
Il ciclo fottuto ce l'hai, ma lo fa preg_replace, quindi dovrebbe essere
piuttosto efficiente.
Leonardo SE&O
-- 
 What do you make, so fair and bright;
 What do you build with sails for flight;
 What do you weave with wool so white?

 piuttosto efficiente.
Ti ringrazio per l'interessamento....ma ahimé...sono ancora in mare ai 
dubbi!!! LOL
Sto valutando varie strade.
-- 
rob4you

 Sto valutando varie strade.
Per ora ho risolto in modo schifosissimo, e davvero da morire. Ma al 
momento non sono riuscito a trovare una strada "concettualmente" 
altrettanto semplice (ahimé, concettualmente, ma non 
computazionalmente).
Nell'annuncio tipo:
$annuncio = "vendesi casa con stanza da letto singola, sala da pranzo e 
bagno.";
Faccio effettuare ben due cicli, uno dentro l'altro, con un numero di 
iterazioni pari al numero dell'annuncio.
A ogni iterazione del ciclo PIU interno, vado a controllare se l'INTERO 
annuncio esiste nei commenti.
Se non esiste, accorcio l'annuncio, a ogni iterazione INTERNA, di una 
parola, a partire dalla FINE, e controllo di nuovo se esiste nei 
commenti. E così via fino a quando non trovo un matching.
Se non esiste nessun matching, accorcio l'annuncio, a ogni iterazione 
del ciclo piu ESTERNO, a partire dall'INIZIO, e proseguo con i 
controlli su esposti.
Esempio:
il ciclo interno, controlla, di volta in volta, se nei commenti esiste:
"vendesi casa con stanza da letto singola, sala da pranzo e bagno."
"vendesi casa con stanza da letto singola, sala da pranzo e"
"vendesi casa con stanza da letto singola, sala da pranzo"
"vendesi casa con stanza da letto singola, sala da"
...
"vendesi"
Se non trova niente fino alla fine, viene eliminata la prima parola 
dell'annuncio, e il controllo riprende:
"casa con stanza da letto singola, sala da pranzo e bagno."
"casa con stanza da letto singola, sala da pranzo e"
"casa con stanza da letto singola, sala da pranzo"
"casa con stanza da letto singola, sala da"
...
"casa"
In questo caso, il commento "casa" è stato trovato nella categoria 
"abitazione", e quindi lo prendo per buono, e vado avanti.
....continuando (ho saltato alcune fasi intermedie)......
"stanza da letto singola, sala da pranzo e bagno."
"stanza da letto singola, sala da pranzo e"
"stanza da letto singola, sala da pranzo"
...
"stanza da letto singola"
Trovato MATCHING con la categoria "camera_da_letto_singola". E vado 
avanti con:
"sala da pranzo e bagno."
sala da pranzo e"
...
..
.
Fino a scorrere tutto l'annuncio.
Come si può ben intuire, se da un punto "intuitivo" è abbastanza 
semplice, da un punto di vista computazionale, è un massacro, infatti 
su un annuncio di circa duecento parole, ci mette 4-5 secondi per 
fornire il risultato.
Fa schifo, e ne sono pienamente consapevole......ma altre strade, al 
momento NON sono riuscito a attuarle. Quando inizio a "lavorarci" su, 
mi accorgo di problemi che non mi consentono di andare avanti.
-- 
rob4you

Ma in tal caso i confronti diventano davvero una marea!!! :)
Lo so, ma mi sa che di scelte ce n'hai pochine. Considera che il grosso
del lavoro, la creazione del $tutticommenti, la fai solo ogni tanto. Il
"lavoro sporco" lo fa quell'unico giro di str_replace.
Leonardo



Come faccio a NON amare il tuo modo di scrivere il codice!!!!! LOL LOL
-- 
rob4you

 probabili idee veramente pesantissime.
Spiegaci meglio cosa devi fare e probabilmente riusciamo a trovare la
soluzione più idonea al tuo problema.
Ciao,
     Fabrizio
--- website: 
http://www.negusweb.it

 soluzione più idonea al tuo problema.
Quello che dovevo fare era esattamente ciò che ho spiegato.
In pratica, ho:
- un annuncio (a dire la verita ne ho quache migliaio, ma per 
semplicità ragioniamo con uno). Esempio: "affittasi stanza singola con 
prostituta che ti aspetta nella vasca da bagno, ma niente ascensore".
- un qualcosa (vedila come un array, una tabella di un database, un 
file, una bambola gonfiabile :) ) in cui è contenuta un'informazione 
del tipo "classe" => "commenti/sinonimi della classe". Esempio: 
"camera_da_letto_singola" => "camera singola; stanza singola; stanza 
con un letto; topaia dove riposare"
"vasca" => "vasca da bagno; vasca"
"ascensore" => "ascensore; montacarichi"
A partire da queste informazioni, voglio che mi esca fuori una formula 
in logica booleana, fatta di AND (e al limite NOT). Esempio (restando 
coerenti a quanto scritto sopra):
"camera_da_letto_singola AND vasca AND (NOT ascensore)"
Il problema è, anzi, era (poiché è stato risolto già con i suggerimenti 
di Leonardo), quello che hai intuito anche tu.
Nello specifico ho ordinato l'array per lunghezza descrescente; solo 
che a differenza di quanto consigliavi tu, ho un array unico, e 
monodimensionale.
In questo modo è stato piuttosto semplice e molto veloce scorrerlo e 
fare i dovuti confronti.
Grazie comunque per l'interessamento.
Se ti interessa dare un'occhiata a questa cosa, per farti vedere che 
effettivamente funziona, ed è anche piuttosto veloce (tempo di attesa 
di 5-6 secondi per parsare un migliaio di annunci), ti rimando alla 
pagina:
www.outofmind.eu/tesi/owl/crea_formula.php
-- 
rob4you