T-SQL donne le pourcentage de caractère match de 2 cordes
Disons que j'ai un set de 2 mots:
Alexander et Alecsander OU Alexander et Alegzander
Alexander et Aleaxnder, ou toute autre combinaison. En général, nous parlons de l'homme d'erreur en tapant un mot ou un ensemble de mots.
Ce que je veux réaliser est d'obtenir le pourcentage de correspondance des caractères des 2 chaînes.
Voici ce que j'ai à ce jour:
DECLARE @table1 TABLE
(
nr INT
, ch CHAR
)
DECLARE @table2 TABLE
(
nr INT
, ch CHAR
)
INSERT INTO @table1
SELECT nr,ch FROM [dbo].[SplitStringIntoCharacters] ('WORD w') --> return a table of characters(spaces included)
INSERT INTO @table2
SELECT nr,ch FROM [dbo].[SplitStringIntoCharacters] ('WORD 5')
DECLARE @resultsTable TABLE
(
ch1 CHAR
, ch2 CHAR
)
INSERT INTO @resultsTable
SELECT DISTINCt t1.ch ch1, t2.ch ch2 FROM @table1 t1
FULL JOIN @table2 t2 ON t1.ch = t2.ch --> returns both matches and missmatches
SELECT * FROM @resultsTable
DECLARE @nrOfMathches INT, @nrOfMismatches INT, @nrOfRowsInResultsTable INT
SELECT @nrOfMathches = COUNT(1) FROM @resultsTable WHERE ch1 IS NOT NULL AND ch2 IS NOT NULL
SELECT @nrOfMismatches = COUNT(1) FROM @resultsTable WHERE ch1 IS NULL OR ch2 IS NULL
SELECT @nrOfRowsInResultsTable = COUNT(1) FROM @resultsTable
SELECT @nrOfMathches * 100 / @nrOfRowsInResultsTable
La SELECT * FROM @resultsTable
sera de retour le suivant:
ch1 ch2
NULL 5
[blank] [blank]
D D
O O
R R
W W
Et quel est le problème avec elle? Que le code de travail est-elle correcte?
Qu'il n'est pas précise.
Qu'il n'est pas précise.
OriginalL'auteur Dragos Durlut | 2011-12-15
Vous devez vous connecter pour publier un commentaire.
Ok, voici ma solution pour l'instant:
retourne 86%
Non, je n'ai pas poster une question pour rien. J'ai posté une question, puis j'ai continué à chercher une solution à mon problème. J'ai trouvé quelque chose d'utilisation et je l'ai posté ici, donc peut-être que quelqu'un avec plus de connaissances que moi peut me dire si il y a une meilleure ou d'une manière plus précise à-vis de cela. Aussi, dans l'avenir peut-être quelqu'un va profiter de cette situation. J'ai eu d'autres situations similaires(stackoverflow.com/questions/3107514/...) où mes réponses ont aidé les autres.
+1 pour créditer la source de votre algorithme de Levenshtein dans les commentaires de code. Chic.
Eh bien, il a expliqué mieux que je le pouvais.
Cet algorithme est horrible. Il considère que les 2 chaînes en tant que "18%" similaire: "129 W MCKNIGHT FAÇON" <---> "SPD". Sérieusement? Il n'y a littéralement rien de semblable à propos de ces deux chaînes. L'adresse ne contient pas de "S", pas de "P", et non "D". Ils sont de longueurs différentes. Ils devraient être énumérés comme 0%.
OriginalL'auteur Dragos Durlut
En fin de compte, vous semblez être à la recherche à résoudre pour la probabilité que les deux chaînes sont un "flou" match l'un de l'autre.
SQL fournit efficace, optimisée des fonctions intégrées qui le fera pour vous, et probablement avec de meilleures performances que ce que vous avez écrit. Les deux fonctions sont SOUNDEX et DIFFÉRENCE.
Alors qu'aucun d'eux ne résout exactement ce que vous avez demandé - c'est à dire qu'ils ne renvoient pas à un pourcentage de concordance - je crois qu'ils résoudre ce que vous êtes en fin de compte cherche à atteindre.
SOUNDEX
renvoie un 4-code de caractère qui est la première lettre du mot, plus un 3-numéro de code qui représente le motif sonore de la parole. Considérez les points suivants:Ce que vous remarquerez est que le nombre à trois chiffres 425 est le même pour tous ceux qui à peu près le même son de cloche. Donc, vous pouvez facilement correspondre entre eux et de dire "Vous avez tapé 'Owleksanndurr', avez-vous peut-être dire 'Alexander'?"
En outre, il y a le
DIFFERENCE
fonction qui compare leSOUNDEX
écart entre les deux cordes et donne un score.Comme vous pouvez le voir, plus le résultat est faible (entre 0 et 4), plus les cordes sont un match.
L'avantage de
SOUNDEX
surDIFFERENCE
est que si vous avez vraiment besoin de faire de fréquentes correspondance floue, vous pouvez stocker et indexer leSOUNDEX
de données dans un document distinct (à plaquettes indexables) de la colonne, tandis queDIFFERENCE
ne peut calculer que leSOUNDEX
au moment de la comparaison.Une correspondance exacte sera de retour à zéro. Je ne peux pas montrer que, dans l'exemple, mais il est important de savoir si vous n'avez pas commencé à le faire OÙ la DIFFÉRENCE(...) = 1 et manque tous les matchs parfaits. 🙂
En fait, la valeur 0 indique une faible ou aucune similitude et 4 indique une forte similitude. msdn.microsoft.com/en-us/library/ms188753.aspx
Aussi la Différence et de la Soundex seulement calculer la différence du premier mot (SQL 2008 R2). Donc, pour une phrase, vous avez besoin de la distance de Levenshtein, en plus de certains de la logique floue avec des longueurs de chaîne. Je suis venu à la même conclusion que ci-dessus mais je me demandais si l'utilisation de la plus courte longueur de la chaîne, plus la longueur de la chaîne, ou de les ajouter et de les diviser par la différence.
Les résultats de la liste sont à l'envers. J'ai mis un edit suggestion.
OriginalL'auteur Jonathan Van Matre