2009-07-10 9 views
0

J'ai donc une colonne dans une table qui contient des valeurs de chaîne (mots-clés provenant d'un outil tiers). Je travaille sur un outil automatisé pour identifier des groupes de valeurs similaires qui pourraient probablement être normalisées à une seule valeur. Par exemple, "Pompiers"/"Pompier", "Isotope"/"Asotope" ou "Canin"/"Canin".Techniques performantes pour trouver des valeurs similaires dans SQL?

Une approche qui calcule la distance levenshtein semble idéale, sauf pour le fait qu'elle implique trop de manipulations/comparaisons de chaînes et ferait probablement une mauvaise utilisation des index SQL. J'ai considéré le groupement incrémental par les caractères de gauche (X) de la colonne, ce qui est une façon pas si mauvaise de maximiser l'utilisation de l'index, mais cette approche est vraiment efficace seulement pour trouver des mots avec des différences à la fin du mot.

Quelqu'un at-il de bonnes idées pour résoudre ce problème efficacement en SQL?

Remarque: Je réalise que cette question est très similaire à (Finding how similar two strings are), mais la distinction ici est la nécessité de le faire efficacement en SQL.

Répondre

1

Si vous utilisez SQL Server, vous pouvez regarder dans la fonction SOUNDEX() comme dans:

... 
where 
    SOUNDEX("searchterm") = SOUNDEX(searchvaluefield) 

il est censé faire de la correspondance Phonetic sur les cordes ...

Certains impairs exemples ... il semble que vous pourriez attraper pluriels en annexant toujours le texte pluriel des deux côtés, puisque plusieurs « s pour le son même ... :-)

select soundex('Canine'), soundex('Canines') 
go 

----- ----- 
C550 C552 

1 Row(s) affected 


select soundex('Canine'), soundex('Caynyn') 
go 

----- ----- 
C550 C550 

1 Row(s) affected 


select soundex('Canines'), soundex('Caniness') 
go 

----- ----- 
C552 C552 

1 Row(s) affected 
+0

Une expérience sur la façon dont Soundex résout plusieurs versions de mots? On dirait que ce serait bien pour "pompiers"/"pompier" mais peut-être pas autant pour "Canine"/"Canines". – JohnFx

2

Vous ne mentionnez pas ce DB utiliser, mais si c'est T-SQL, vous pouvez utiliser la valeur SOUNDEX et difference.

+0

Actuellement j'utilise T-SQL, mais je ne l'ai pas mentionné dans l'espoir d'obtenir des réponses plus générales qui pourraient fonctionner dans plusieurs plates-formes de base de données. L'approche Soundex/Différence semble prometteuse. Je vais faire un tour. – JohnFx

Questions connexes