• Super User

    Cercare testo simile (come google)

    Ciao a tutti, qualcuno si cimentato nell'impresa di effettuare delle ricerche con test simile, un pò come fa google? In particolare io avrei un database di termini, e dovrei vedere se il testo inserito dall'utente è contenuto tra questi o se almeno si avvicina a uno di questi.


  • Consiglio Direttivo

    Ciao cali1981
    per il "similare" non saprei dirti, per controllare che il testo digitato sia contenuto nel Db puoi usare l'istruzione LIKE
    [php] $sql="SELECT * FROM table WHERE termine LIKE '%$text%'";[/php]
    che se uno digita per esempio per lui mi estrapolerà i termini:
    percentuale
    Copernico
    super
    etc etc
    ma per somiglianza credo che ci sia da inventarsi qualcosa che al momento non mi sovviene 😄


  • Super User

    Si in effetti il like non è un problema, io cercavo un modo per trovare parole simili, ad esempio con una lettera diverso.


  • Consiglio Direttivo

    La prima cosa che mi vien in mente e' fare delle substringhe e quindi fare più query i cui valori vengon salvati in array, poi estrarti dagli array ottenuti il termine che magari è presente in tutte o magari e' maggiormente presente....ma la vedo trafficosa :mmm:


  • User Attivo

    Esiste una funzione di PHP, che permette di controllare le similitudini tra due stringe.
    La funzione similar_text(); restituisce i caratteri comuni nelle due stringhe e opzionalmente anche la percentuale di similarità.
    Una versione più veloce, ma meno accurata, è la funzione* levenshtein();
    *
    Esempio:
    [php]
    $parola = "carotta";
    $termini = array("carro", "carota", "limone");

    foreach($termini as $termine)
    {
    $num_char = similar_text($parola, $termine, $percententuale);

    echo "$num_char caratteri di '$parola' sono contenuti in '$termine'";
    echo " (" . round($percententuale) . "%)<br>";
    

    }

    //OUTPUT
    //
    //4 caratteri di 'carotta' sono contenuti in 'carro' (67%)
    //6 caratteri di 'carotta' sono contenuti in 'carota' (92%)
    //1 caratteri di 'carotta' sono contenuti in 'limone' (15%)
    [/php]Ciao!


  • Super User

    Si forse questa potrebbe andare, certo se ho un db con molti campi ci vuole un casino di tempo, se ci fosse una funzione simile in mysql...


  • User Attivo

    Dovresti unire la funzione similar_text(); con LIKE di MySQL.

    Esempio:
    Parola scritta: cioa
    Fai una ricerca LIKE su "ci", sottostringa di "cioa". ( ...LIKE '%ci%'; )
    Esegui la funzione di PHP, su tutti i termini di ritorno dalla query.
    I termini da paragonare ora sono molti meno e sicuramente contengono anche il possibile sostituto "ciao".


  • Super User

    Si anche questo potrebbe essere un modo, ma va visto quanto complesso computazionalmente. Comunque forse levenshtein è meglio perchè ti dice la similarità di una stringa. Si potrebbe prendere un sottoinsieme di tutte le stringhe tramite like e poi si applica questa funzione.


  • Super User

    E invece di questo che ne dite?? usphp.com/function.pspell-new.html
    In pratica restituisce un dizionario, poi si può usare pspell_check e pspell_suggest per controllare e suggerire una correzione. E' da vedere quanto è ampio il dizionario, comunque ci siamo! Se uno poi ha necessità particolari, ovvero se ad esempio non si deve correggere in base al dizionario ma a un elenco custom, penso si possa sostituire questo elenco al dizionario. Mo provo!

    Ciao


  • Super User

    mi sto interessando anche io a questo problema e le elucubrazioni mentali che ho fatto fino ad ora sono:

    1. archivio delle ricerche fatte per poter suggerire un "forse cercavi: xxxxx"
      questa cosa la puoi ottenere con i suggerimenti che ti sono stati dati prima del mio intervento unendoli a questo archivio di ricerche fatte.

    2. testi full text e relativa ricerca.
      per darti un'idea delle possibilità di una ricerca full text fai una ricerchina su gg con la key "ricerca full text" e troverai delle ottime info per capire la differenza tra una ricerca con like e una FT

    ciao