none
Matching in una tabella RRS feed

  • Domanda

  • Salve,

    sto facendo un sito per dei questionari online che si appoggia ad un database dove c'è ovviamente una tabella per le domande.

    Per impedire che vengano inserite più volte le stesse domande intanto ho messo un vincolo univoco nella colonna del testo della domanda. Ma al momento dell'inserimento di una nuova domanda volevo anche mostrare dinamicamente le domande simili già presenti nel database e proporle all'operatore. Un po' come qui sul forum che quando scrivi il titolo del post ti mostra le discussioni simili che possono essere attinenti alla domanda.

    Al momento ho pensato di prendere il testo della domanda inserita e con uno split per lo spazio verificare se ci sono domande contenenti ogni singola parola ma la cosa nonm i convince molto.

    Avreste qualche proposta?

    Grazie

    mercoledì 27 marzo 2013 11:32

Risposte

  • salve,

    se la lingua non e' pero' anglofona, l'utilizzo di SOUNDEX e DIFFERENCE puo' non produrre i risultati sperati, proprio perche' tali funzioni si basano su una lingua differente da quella ad esempio italiana...

    per ovviare tale problematica, il nostro Marc (Marcello Poletti), tempo fa dedico' parte del suo tempo ad una problematica simile basandosi sulla distanza Levensthein,

    http://blogs.dotnethell.it/epomops/Testi-simili-e-distanza-Levenshtein__5467.aspx

    ed ha "partorito" un articolo notevole in merito... 

    saluti


    http://www.asql.biz - DbaMgr2k - DbaMgr and further SQL Tools http://www.hotelsole.com/

    giovedì 28 marzo 2013 21:55
    Moderatore

Tutte le risposte

  • Buongiorno Y_Chen, 

    in TSQL esiste una funzione che verifica l'assonanza di stringhe e ritorna un valore numerico di similitudine a 4 caratteri.

    La funzione si chiama SOUNDEX e troverai la spiegazione del funzionamento a quest'indirizzo della developer network : SOUNDEX

    Prego, un saluto! (:


    • Modificato _ Luca Gaspari mercoledì 27 marzo 2013 12:55 modificato "4 cifre" in "4 caratteri"
    mercoledì 27 marzo 2013 11:52
  • Ho provato ad usare la funzione SOUNDEX con una domanda già presente nel database e mi restituisce 29 record con valore C500 e sinceramente non so come posso usare questi risultati per recuperare le domande simili. Comunque mi tira fuori tutte le domande che ci sono già nel database.

    • Modificato y_chen mercoledì 27 marzo 2013 13:02
    mercoledì 27 marzo 2013 12:56
  • Forse sono stato un po limitato nella risposta, ti chiedo scusa.. la funzione SOUNDEX usa un sistema di indexing per trasformare (in base ad un insieme di regole) la tua stringa in un insieme di caratteri alfanumerici su cui fare le tue considerazioni.

    Il suo utilizzo nel tuo caso dev'essere unito alla funzione DIFFERENCE, che confronta appunto l'assonanza delle due stringhe e restituisce un valore intero di "assonanza".

    Esempio :

    USE AdventureWorks;
    GO
    -- Ritorna 4, la più bassa differenza riscontrabile
    SELECT SOUNDEX('Green'), SOUNDEX('Greene'), DIFFERENCE('Green','Greene');
    GO
    -- Ritorna 0, la più alta differenza riscontrabile
    SELECT SOUNDEX('Blotchet-Halls'), SOUNDEX('Greene'), DIFFERENCE('Blotchet-Halls', 'Greene');
    GO

    Ovviamente non possiamo aspettarci che sia oro colato quello che ci torna indietro come risultato.. è pur sempre un algoritmo di similitudine, ma potresti ad esempio crearti un sistema di ranking che con dei tuoi parametri determini l'effettiva somiglianza tra due domande facendoti aiutare dalle funzioni sopracitate e "aggiustandone il tiro" mano a mano che lo provi, valutando i punteggi ed i risultati in base alla tua "esperienza umana" (:

    Msdn SOUNDEX

    Msdn DIFFERENCE

    Msdn Confronto tra SOUNDEX e DIFFERENCE

    mercoledì 27 marzo 2013 13:27
  • Per darti un'altro piccolo hint sul da farsi.. inizia scomponendo le frasi come dici tu, togli gli articoli, le preposizioni semplici, articolate, le congiunzioni e parti da quella base per un confronto.

    Sarà un lavoraccio ma sicuramente dà degli interessanti spunti di riflessione!

    Se vuoi poi torna a condividere il tuo lavoro con la community, potremmo consigliarti o magari potresti tu aprirci la via a nuove implementazioni di questo tipo (;

    mercoledì 27 marzo 2013 13:31
  • Figurati, anzi grazie a te per le risposte.

    OK, allora mi metto all'opera. Penso che il problema più grosso sarà fare un ripasso di grammatica! :D

    Grazie ancora.

    mercoledì 27 marzo 2013 13:38
  • Di nulla (:

    Se ritieni che una delle mie risposte sia stata utile flaggala pure come "risposta al topic" per chiuderlo.

    Facci sapere come procede il tutto, a presto!

    mercoledì 27 marzo 2013 13:50
  • salve,

    se la lingua non e' pero' anglofona, l'utilizzo di SOUNDEX e DIFFERENCE puo' non produrre i risultati sperati, proprio perche' tali funzioni si basano su una lingua differente da quella ad esempio italiana...

    per ovviare tale problematica, il nostro Marc (Marcello Poletti), tempo fa dedico' parte del suo tempo ad una problematica simile basandosi sulla distanza Levensthein,

    http://blogs.dotnethell.it/epomops/Testi-simili-e-distanza-Levenshtein__5467.aspx

    ed ha "partorito" un articolo notevole in merito... 

    saluti


    http://www.asql.biz - DbaMgr2k - DbaMgr and further SQL Tools http://www.hotelsole.com/

    giovedì 28 marzo 2013 21:55
    Moderatore
  • Deh.. :)

    come non detto allora! Bello l'articolo di Marcello!

    venerdì 29 marzo 2013 08:17
  • Sono d'accordo, veramente interessante quell'articolo.
    venerdì 29 marzo 2013 11:59
    Moderatore