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 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.