Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

FONCTION SOUNDEX EN VISUAL BASIC 6


Information sur la source

Catégorie :Trucs & Astuces Classé sous : soundex, phonétique, vidéothèque, données Niveau : Initié Date de création : 21/01/2007 Date de mise à jour : 03/02/2007 20:15:43 Vu : 4 165

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

Description

Ayant écrit un logiciel de gestion de vidéothèque je me suis aperçu que l'on pouvait vite avoir des soucis avec des noms d'acteurs mal orthographiés... Ex Bruce Willsi à la place de Bruce Willis....... J'ai donc traduit la fonction Soundex (Recherche phonétique) décrite notament par Frédéric Brouard avec qui j'ai bossé (dans une galère.....dans le Var..il devrait reconnaître !!!!) en VB 6.
 

Source

  • Public Function Analyse_Homonyme(ByVal NomActeur As String)
  • ValeurCaractere = ""
  • 'passage en majuscule et suppression des espaces
  • NomActeur = UCase(NomActeur)
  • 'NomActeur = UCase("ZARA WHITE")
  • NomActeur = Replace(NomActeur, " ", "")
  • caracteredepart = Mid(NomActeur, 1, 1)
  • 'Elimination des voyelles du H et du W
  • For i = 1 To Len(NomActeur)
  • caractere = Mid(NomActeur, i, 1)
  • Select Case caractere
  • Case "A", "E", "I", "O", "U", "Y"
  • NouveauNom = NouveauNom
  • Case "H", "W"
  • NouveauNom = NouveauNom
  • Case Else
  • NouveauNom = NouveauNom + caractere
  • End Select
  • Next
  • 'Analyse du NouveauNom
  • For i = 1 To Len(NouveauNom)
  • caractere = Mid(NouveauNom, i, 1)
  • Select Case caractere
  • Case "B", "F", "P", "V"
  • ValeurCaractere = ValeurCaractere & 1
  • Case "C", "G", "J", "K", "Q", "S", "X", "Z"
  • ValeurCaractere = ValeurCaractere & 2
  • Case "D", "T"
  • ValeurCaractere = ValeurCaractere & 3
  • Case "L"
  • ValeurCaractere = ValeurCaractere & 4
  • Case "M", "N"
  • ValeurCaractere = ValeurCaractere & 5
  • Case "R"
  • ValeurCaractere = ValeurCaractere & 6
  • End Select
  • Next
  • Mot_Code = ValeurCaractere
  • 'si la longeur est superieure a 4 je ne garde que les 4 premiers
  • If Len(ValeurCaractere) >= 4 Then Mot_Code = Mid(Mot_Code, 1, 4)
  • 'NouveauNom Codé --> Elimination des Doublons consécutifs
  • For i = 1 To Len(ValeurCaractere)
  • caractere = Mid(ValeurCaractere, i, 1)
  • Select Case caractere
  • Case "1"
  • ' je remonte d une lettre pour verifier les eventuels doublons
  • If i > 1 Then
  • LettrePrec = Mid(Mot_Code, i - 1, 1)
  • valeur = LettrePrec & 1
  • End If
  • If valeur = "11" Then
  • PositionPaire = InStr(1, Mot_Code, valeur)
  • Paire (PositionPaire)
  • End If
  • Case "2"
  • ' je remonte d une lettre pour verifier les eventuels doublons
  • If i > 1 Then
  • LettrePrec = Mid(Mot_Code, i - 1, 1)
  • valeur = LettrePrec & 2
  • End If
  • If valeur = "22" Then
  • PositionPaire = InStr(1, Mot_Code, valeur)
  • Paire (PositionPaire)
  • End If
  • Case "3"
  • ' je remonte d une lettre pour verifier les eventuels doublons
  • If i > 1 Then
  • LettrePrec = Mid(Mot_Code, i - 1, 1)
  • valeur = LettrePrec & 3
  • End If
  • If valeur = "33" Then
  • PositionPaire = InStr(1, Mot_Code, valeur)
  • Paire (PositionPaire)
  • End If
  • Case "4"
  • ' je remonte d une lettre pour verifier les eventuels doublons
  • If i > 1 Then
  • LettrePrec = Mid(Mot_Code, i - 1, 1)
  • valeur = LettrePrec & 4
  • End If
  • If valeur = "44" Then
  • PositionPaire = InStr(1, Mot_Code, valeur)
  • Paire (PositionPaire)
  • End If
  • Case "5"
  • ' je remonte d une lettre pour verifier les eventuels doublons
  • If i > 1 Then
  • LettrePrec = Mid(Mot_Code, i - 1, 1)
  • valeur = LettrePrec & 5
  • End If
  • If valeur = "55" Then
  • PositionPaire = InStr(1, Mot_Code, valeur)
  • Paire (PositionPaire)
  • End If
  • Case "6"
  • ' je remonte d une lettre pour verifier les eventuels doublons
  • If i > 1 Then
  • LettrePrec = Mid(Mot_Code, i - 1, 1)
  • valeur = LettrePrec & 6
  • End If
  • If valeur = "66" Then
  • PositionPaire = InStr(1, Mot_Code, valeur)
  • Paire (PositionPaire)
  • End If
  • End Select
  • If Resultat_Paire <> "" Then
  • Mot_Code = Resultat_Paire
  • End If
  • Next
  • ValeurCaractere = caracteredepart & Mot_Code
  • If Len(ValeurCaractere) > 4 Then
  • ValeurCaractere = Mid(ValeurCaractere, 1, 4)
  • Else
  • For i = 1 To (4 - Len(ValeurCaractere))
  • ValeurCaractere = ValeurCaractere & 0
  • Next
  • End If
  • End Function
  • Public Function Paire(ByVal Position As Integer)
  • chaine1 = ""
  • chaine2 = ""
  • Resultat_Paire = ""
  • ' je recupere la valeur avant le premier doublon
  • chaine1 = Mid(Mot_Code, 1, PositionPaire)
  • longueurrecupere = Len(chaine1)
  • If longueurrecupere >= 3 Then
  • chaine2 = ""
  • Else
  • ' si la position du premier doublon est autre que 1
  • If Position = 1 Then
  • ' j elimine le caractere de trop
  • chaine2 = Mid(Mot_Code, PositionPaire + 2, PositionPaire + 2)
  • Else
  • chaine2 = Mid(Mot_Code, PositionPaire + 2, 1)
  • End If
  • End If
  • Resultat_Paire = chaine1 & chaine2
  • End Function
Public Function Analyse_Homonyme(ByVal NomActeur As String)

ValeurCaractere = ""

'passage en majuscule et suppression des espaces
NomActeur = UCase(NomActeur)
'NomActeur = UCase("ZARA WHITE")
NomActeur = Replace(NomActeur, " ", "")
caracteredepart = Mid(NomActeur, 1, 1)

'Elimination des voyelles du H et du W
For i = 1 To Len(NomActeur)
    caractere = Mid(NomActeur, i, 1)
    Select Case caractere
        Case "A", "E", "I", "O", "U", "Y"
            NouveauNom = NouveauNom
        Case "H", "W"
            NouveauNom = NouveauNom
        Case Else
            NouveauNom = NouveauNom + caractere
    End Select
Next

'Analyse du NouveauNom
For i = 1 To Len(NouveauNom)
    caractere = Mid(NouveauNom, i, 1)
    Select Case caractere
        Case "B", "F", "P", "V"
            ValeurCaractere = ValeurCaractere & 1
        Case "C", "G", "J", "K", "Q", "S", "X", "Z"
            ValeurCaractere = ValeurCaractere & 2
        Case "D", "T"
            ValeurCaractere = ValeurCaractere & 3
        Case "L"
            ValeurCaractere = ValeurCaractere & 4
        Case "M", "N"
            ValeurCaractere = ValeurCaractere & 5
        Case "R"
            ValeurCaractere = ValeurCaractere & 6
        End Select
Next

Mot_Code = ValeurCaractere
'si la longeur est superieure a 4  je ne garde que les 4 premiers
If Len(ValeurCaractere) >= 4 Then Mot_Code = Mid(Mot_Code, 1, 4)

'NouveauNom Codé --> Elimination des Doublons consécutifs
For i = 1 To Len(ValeurCaractere)
    caractere = Mid(ValeurCaractere, i, 1)
    Select Case caractere
        Case "1"
            ' je remonte d une lettre pour verifier les eventuels doublons
            If i > 1 Then
                LettrePrec = Mid(Mot_Code, i - 1, 1)
                valeur = LettrePrec & 1
            End If
            If valeur = "11" Then
                PositionPaire = InStr(1, Mot_Code, valeur)
                Paire (PositionPaire)
            End If
        Case "2"
            ' je remonte d une lettre pour verifier les eventuels doublons
            If i > 1 Then
                LettrePrec = Mid(Mot_Code, i - 1, 1)
                valeur = LettrePrec & 2
            End If
            If valeur = "22" Then
                PositionPaire = InStr(1, Mot_Code, valeur)
                Paire (PositionPaire)
            End If
        Case "3"
            ' je remonte d une lettre pour verifier les eventuels doublons
            If i > 1 Then
                LettrePrec = Mid(Mot_Code, i - 1, 1)
                valeur = LettrePrec & 3
            End If
            If valeur = "33" Then
                PositionPaire = InStr(1, Mot_Code, valeur)
                Paire (PositionPaire)
            End If
        Case "4"
            ' je remonte d une lettre pour verifier les eventuels doublons
            If i > 1 Then
                LettrePrec = Mid(Mot_Code, i - 1, 1)
                valeur = LettrePrec & 4
            End If
            If valeur = "44" Then
                PositionPaire = InStr(1, Mot_Code, valeur)
                Paire (PositionPaire)
            End If
        Case "5"
            ' je remonte d une lettre pour verifier les eventuels doublons
            If i > 1 Then
                LettrePrec = Mid(Mot_Code, i - 1, 1)
                valeur = LettrePrec & 5
            End If
            If valeur = "55" Then
                PositionPaire = InStr(1, Mot_Code, valeur)
                Paire (PositionPaire)
            End If
        Case "6"
            ' je remonte d une lettre pour verifier les eventuels doublons
            If i > 1 Then
                LettrePrec = Mid(Mot_Code, i - 1, 1)
                valeur = LettrePrec & 6
            End If
            If valeur = "66" Then
                PositionPaire = InStr(1, Mot_Code, valeur)
                Paire (PositionPaire)
            End If
        End Select
        If Resultat_Paire <> "" Then
            Mot_Code = Resultat_Paire
        End If
Next

ValeurCaractere = caracteredepart & Mot_Code
If Len(ValeurCaractere) > 4 Then
    ValeurCaractere = Mid(ValeurCaractere, 1, 4)
Else
    For i = 1 To (4 - Len(ValeurCaractere))
        ValeurCaractere = ValeurCaractere & 0
    Next
End If

End Function

Public Function Paire(ByVal Position As Integer)
    
    chaine1 = ""
    chaine2 = ""
    Resultat_Paire = ""
    ' je recupere la valeur avant le premier doublon
    chaine1 = Mid(Mot_Code, 1, PositionPaire)
    longueurrecupere = Len(chaine1)
    If longueurrecupere >= 3 Then
        chaine2 = ""
    Else
        ' si la position du premier doublon est autre que 1
        If Position = 1 Then
            ' j elimine le caractere de trop
            chaine2 = Mid(Mot_Code, PositionPaire + 2, PositionPaire + 2)
        Else
            chaine2 = Mid(Mot_Code, PositionPaire + 2, 1)
        End If
    End If
    Resultat_Paire = chaine1 & chaine2

End Function

Historique

21 janvier 2007 12:11:44 :
Oupss j'ai oublié de préciser que la fonction Soundex est une recherche "phonétique" sur un ou plusieurs mots. Chaque mot est codé selon un algorythme donné. il suffit ensuite de comparer les résultats obtenus pour trouver les éventuels homonynes dans la base de données.
22 janvier 2007 11:10:04 :
le 22/01/2007 Y avait un bug........et j ai un peu optimisé la chose...............les tests semblent corrects...........
03 février 2007 20:15:43 :
Une précision s impose........... du fait des differences de langage, (Anglais/Americain et Francais) les prononciatioins ne sont pas les mêmes. La fonction Soundex codée ici est la version Anglaise. La version Française comporte quelques différences dans la valeur des lettres. Un peu de pub maintenant ;) Cette fonction s'intègre dans un logiciel de Gestion de vidéothèque qui hormis les fonctions classiques d'ajout, modification et suppression de films comprend les fonctionnalités suivantes : - Gestion des Prêts - Enregistrement semi automatique des films depuis Internet (Récupérations des Acteurs, du Titre, du Résumé du film etc etc..) - Gestion des jaquettes Vidéos et des photos d'acteurs - Visualisation du film possible depuis l'application (WMPlayer) - Multi Bases (Sql et Access) - Nombreuses Statistiques et Editions......... - Evolutions futures : Gestion des Editions via Crystal Report... pour le moment c est le bloc notes via un fichier texte...... Voila.......... je m'occupe comme je peux lol

Commentaires et avis

signaler à un administrateur
Commentaire de zavier666 le 21/01/2007 20:35:23

Ca à l'air super interessant, le code est très bien écrit, en revanche lorsque je teste ton exemple, je n'ai rien du tout comme résultat, tu peux meiux expliquer ou donner un exemple à télécharger?

slts!
___________________________________________________
Toujours + de VB et d'APi => API @ la Loupe
http://xav.prog.power.free.fr

signaler à un administrateur
Commentaire de capricorne83 le 22/01/2007 11:22:18

Zavier666 Salut
Le principe de ces fonctions (j'en ai fait deux en fait..... la premiere version etait buggee et pas vraiment optimisee) c'est de coder selon la méthode SOUNDEX un mot (exemple Belmondo va devenir quelque chose comme B642 ensuite il suffira de comparer chaque occurence de nom pour obtenir les homonymes). Dans mon code j'appelle la fonction par le biais de cette instruction : Analyse_Homonyme (acteur) ou acteur est le nom de l'acteur (en majuscule) la fonction renvoie ValeurCaractere qui corespond au nom codé. La seconde fonction Fonction Paire sert à eliminer les eventuels doublons dans le calcul du codage du nom. Puisque dans un premier temps les lettres sont traduites en chiffres ce qui va donner par exemple Belmondo =14532673 on peut trouver des cas ou cela va donner 1244. Dans ce dernier cas on ne gardera que 124.
Voila pour les explications. Pour ce qui est du fait que tu n'as pas de retour de valeur, as tu déclaré correctement ces variables la dans la partie "Général" de la feuille ?
Public ValeurCaractere As String
Public Resultat_Paire As String
Public PositionPaire As Integer
Public Mot_Code As String

A plus.

signaler à un administrateur
Commentaire de Mayzz le 22/01/2007 14:09:58

Très beau code, très instructif, bravo!

signaler à un administrateur
Commentaire de capricorne83 le 22/01/2007 14:13:54

Mayzz
Merci de ce compliment

signaler à un administrateur
Commentaire de zavier666 le 22/01/2007 16:37:40

Ok merci pour ces explications, tout marche comme il faut


slts!
___________________________________________________
Toujours + de VB et d'APi => API @ la Loupe
http://xav.prog.power.free.fr

signaler à un administrateur
Commentaire de thierrydelepine le 22/01/2007 22:24:28

code tres interressant, c'est vraiment une fonction qui peut servir.

signaler à un administrateur
Commentaire de Nix le 23/01/2007 22:44:29 administrateur CS

Ligne 7 : 'NomActeur = UCase("ZARA WHITE")

... Je me demande bien pour quel usage était prévu ce code initialement :-D

signaler à un administrateur
Commentaire de capricorne83 le 24/01/2007 02:28:31

Bin...... dans une videotheque y a pas forcement que du blanche neige et les sept nains ;)

signaler à un administrateur
Commentaire de thomthom63 le 03/04/2007 10:27:59

Salut!
Ton code est pas mal du tout, mais je vois au moins deux points sur lesquels tu peux apporter une amélioration:
   _ Ne pas prendre en compte les caractères accentués, car ton algo fait la distinction entre "é", "è" et "e"
   _ Ne pas tenir compte des lettre consécutives identiques, pour ceux qui ne savent pas que "Pomme" prend deux "M" par exemple.

Sinon, c'est du bon boulot!

Thom

signaler à un administrateur
Commentaire de capricorne83 le 03/04/2007 11:57:57

@Thom

Merci de ton commentaire, j'y apporterai les précisions suivantes ainsi que je l'ai expliqué plus haut cette version est la version anglophone. Les accents ne sont donc pas gérés. De même que je passe systématiquement le nom à tester en majuscules je ne me préoccupes pas des caractères accentués. Pour ce qui est du cas des deux lettres consécutives, je le gére a partir de la ligne 48.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

base de données [ par kwed ] bonjour à tous,Je voudrais ajouter un module de recherche sur une base de données gérée par un objet msflexgrid...En fait j'ai réussi à ressortir du t Données Binaires de la Base de registre. [ par Steph21 ] Avant tout, je me présente ! Je débute actuellement le VB (version 5), et j'ai déjà utilisé le VBA 97 et 2K.Passons aux choses sérieuses :)J'aimerai e Base de données sur VB [ par HATEM ] Je désire recevoir un exemple simple de base données developpé sue VB Manipulation des données dans un texte !! [ par beber ] debutant 100% voir plus !Recherche comment ouvrir un fichier contenant des variables X et Y d'une fonction. Puis d'arriver sous VB à les recuperer pou echange de données entre executable [ par thierry ] Bonjour,JE souhaiterais savoir s'il est possible avec VB d'échanger des infos entre programmes.exe.Exemple : Dans Un.exe j'ai un programme qui gère de Operation sur une table avec VB [ par H.laalouj ] Question 1:J'aimerais avoir un exemple d'acces à une table d'une base de données avec les differentes operations de manipulation de données: Ajout, Re Echange de données entre .exe [ par BTP ] Pblm : j'aurais besoin d'envoyer un mot sélectionné dans une application quelconque vers un dico et que ce dernier devienne actif.On m'a parlé des act Problème d'emission de données sur un port série [ par Lolo ] Plusieurs collègues et moi même avont constaté un bug du contrôle activeX MSComm32.ocxEn effet lors de l'envoi de données sur le port série en XOn Xof Problème d'emission de données sur un port série [ par Lolo ] Plusieurs collègues et moi même avont constaté un bug du contrôle activeX MSComm32.ocxEn effet lors de l'envoi de données sur le port série en XOn Xof problème Base de données [ par Fab ] Bonjour,Je travaille à la conception d'un outil (Systeme d'Information Territorial)d'aide à la décision. Je développe sur VB 6 et MapObject.Je suis no


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,655 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.