L'algorithme du SOUNDEX.


Introduction

Il n'est pas rare de voir un prof d'anglais poser la question suivante: "Comment prononce-t-on le mot 'GHOTI'?" Après que les étudiants aient tout essayé, le prof énonce fièrement: "Le mot se prononce 'FISH'!". Stupeur bien compréhensible des étudiants.
Explication:
     GH est prononcé comme dans 'tough'
      O comme dans 'women'
et   TI comme dans 'dictionary'. 

Tout ce cinéma pour montrer que les règles de prononciation sont complexes et pleines d'exceptions.

Le problème se pose de la même manière quand un client s'amène au guichet d'une banque, dit son nom et l'employé doit le retrouver dans son listing. Imaginons que le client s'appelle "Van Keersbilck". Il y a peu de chance que l'employé pense à cette orthographe et il risque donc de devoir lui demander d'épeler, dans le bruit, ...

L'algorithme

L'algorithme du Soundex tente d'apporter une solution à ce problème en traduisant le nom en code 'phonétique' sur lequel la recherche dans la table sera effectuée. C'est ainsi que les mots 'mer', mère', 'maire', 'maisre', ... auront le même code. Cet algorithme est d'ailleurs utilisé en généalogie pour retrouver les noms qui auraient subi une transformation due entre autres à une faute de recopie.

L'algorithme du Soundex a été développé au début du siècle par Margaret K. Odell et Robert C. Russel au bureau américain des archives.

Voici les idées sur lesquelles s'appuie l'algorithme:

* les voyelles et Y contribuent moins pour la consonnance d'un mot que les consonnes. Elles seront donc supprimées sauf celle en position initiale;
* les lettres H, W ont aussi une contribution minimale et seront donc supprimées sauf celle en position initiale;
* les consonnes redoublées comme NN, SS et MM ou les lettres qui ont la même prononciation peuvent être réduites à une seule occurence;

Pour savoir si des lettres ont la même consonnance, on s'appuie sur la table suivante:
pour l'anglais:
    1       B, F, P, V
    2       C, G, J, K, Q, S, X, Z
    3       D, T
    4       L
    5       M, N    
    6       R
pour le français:
    1       B, P
    2       C, K, Q
    3       D, T
    4       L
    5       M, N
    6       R
    7       G, J
    8       X, Z, S
    9       F, V
Voici un résumé des différentes étapes de l'algorithme:

* supprimer les éventuels 'espace' initiaux
* mettre le mot en majuscule
* garder la première lettre
* supprimer les lettres A, E, I, O, U, Y, H et W
* remplacer les lettres restantes par le chiffre associé dans la table
* supprimer les chiffres répétés (garder une occurence)
* si le code obtenu contient moins de 4 éléments, compléter à droite par des espaces
  si le code obtenu contient plus de 4 éléments, conserver les 4 éléments les plus à gauche

Un grand merci à Monsieur Lionel Durand qui m'a fourni la table de correspondance pour le français.

Le programme pour le français en Turbo Pascal
PROGRAM Soundex;

USES CRT;

VAR St,St2:STRING;
    i:BYTE;
    Voyelle:SET OF CHAR;

FUNCTION Majus(Ch:CHAR):CHAR;
BEGIN
CASE Ch OF
  'a','à','ä','â'    : Majus:='A';
  'e','é','è','ê','ë': Majus:='E';
  'i','ï','î'        : Majus:='I';
  'o','ô','ö'        : Majus:='O';
  'u','ù','û','ü'    : Majus:='U';
  'c','ç'            : Majus:='C';
ELSE Majus:=UPCASE(Ch);
END;
END;

BEGIN
Voyelle:=['A','E','I','O','U'];
WRITE('Introduisez une chaîne: ');READLN(St);
St2:='';
FOR i:=1 TO LENGTH(St) DO
  IF St[i]<>' ' THEN St2:=St2+Majus(St[i]);
St:='';
FOR i:=1 TO LENGTH(St2) DO
  IF NOT (St2[i] IN (Voyelle+['Y','H','W'])) THEN St:=St+St2[i];
St2:=St[1];
FOR i:=2 TO LENGTH(St) DO
  CASE St[i] OF
    'B','P'     : St2:=St2+'1';
    'C','K','Q' : St2:=St2+'2';
    'D','T'     : St2:=St2+'3';
    'L'         : St2:=St2+'4';
    'M','N'     : St2:=St2+'5';
    'R'         : St2:=St2+'6';
    'G','J'     : St2:=St2+'7';
    'S','X','Z' : St2:=St2+'8';
    'F','V'     : St2:=St2+'9';
  END;
St:=St2[1];
FOR i:=1 TO LENGTH(St2) DO
  IF St2[i]<>St[LENGTH(St)] THEN St:=St+St2[i];
IF LENGTH(St)<4 THEN FOR i:=LENGTH(St) TO 4 DO St:=St+'0'
ELSE IF LENGTH(St)>4 THEN St:=COPY(St,1,4);
WRITELN('Le code SOUNDEX vaut: ',St);
END.


Page d'accueil.