Soundex en français

Document Actions
Réponses: 11   Visites: 0
Up one level
Vous devez être un membre enregistré pour contribuer sur ce forum. Inscrivez-vous maintenant

Soundex en français

Posté par kikan le 30/03/2005 17:32
Salut les pythoniennes et pythoniens,

Je cherche un module, ou un bout de source qui calcule un soundex en français.

C'est à dire, un petit numéro correspondant au son que produit un mot.
Le but est d'indexer un annuaire pour faire une recherche en trouvant quand même les orthographes avoisinantes, comme dans l'annuaire électronique de France Télécom.

Par exemple :
- GAUTHIER = 12345
- GOTTIAIT = 12345
Les deux codes sont égaux, donc on peut renvoyer le résultat pour les deux noms.

J'ai trouvé des infos intéressantes ici :
http://sqlpro.developpez.com/cours/soundex/

Il y a du Delphi, du Perl, du PLSQL, mais rien directement en python.

Avant de me lancer dans l'adaptation, je cherche si ça existe déjà...

Merci !

Re: Soundex en français

Posté par tarek le 30/03/2005 19:01
je n'ai rien trouvé en francais (phonex ou soundex) mais si tu implémentes tu peux partir sur cette lib :

http://www.pypackage.org/packages/python-levenshtein

Re: Soundex en français

Posté par fcarlier le 31/03/2005 11:18
Le lien http://sqlpro.... est vraiment trés intéréssant !!! lu pour culture générale !!

Au vue de l'Article, la programmation de SOUNDEX2 parait vraiment simple !! Cela permet de mettre en oeuvre une premiere technique !
Levenstein est plus complique à mon avis ! dépend des besoins !

Re: Soundex en français

Posté par fcarlier le 05/04/2005 13:30
Salut,

Je savais bien que j'avais vu un soundex qq part !!!! Sur http://www.diveintopython.org

En voici, le code (J'ai rajouté la suppression des espaces et tirés) :

"""Soundex algorithm - Version 2.0

Based on Soundex Algorithm of Mark Pilgrim (mark@diveintopython.org) This program is part of "Dive Into Python", a free Python book for experienced programmers.  Visit http://diveintopython.org/ for the latest version. __author__ = "Mark Pilgrim (mark@diveintopython.org)" __version__ = "$Revision: 1.5 $" __date__ = "$Date: 2004/05/11 19:11:21 $" __copyright__ = "Copyright (c) 2004 Mark Pilgrim" __license__ = "Python" """

__author__ = "Florent Carlier (florent.carlier@univ-lemans.fr" __version__ = "$Revision: 2.0 $" __date__ = "$Date: 2005/05/05 $"
import string
allChar = string.uppercase + string.lowercase charToSoundex = string.maketrans(allChar, "91239129922455912623919292" * 2)
def soundex(source):     "convert string to Soundex equivalent"     
    # Soundex requirements:     # source string must be at least 1 character     if (not source):         return "0000"
    # 0. Replace "-" and " " by ""     source = source.replace('-','')     source = source.replace(' ','')
    # and must consist entirely of letters     if (not source.isalpha()):         return "0000"
    # Soundex algorithm:     # 1. make first character uppercase     # 2. translate all other characters to Soundex digits     digits = source[0].upper() + source[1:].translate(charToSoundex)
    # 3. remove consecutive duplicates     digits2 = digits[0]     for d in digits[1:]:         if digits2[-1] != d:             digits2 += d              # 4. remove all "9"s     # 5. pad end with "0"s to 4 characters     return (digits2.replace('9', '') + '000')[:4]

Les trucs à rajouter seraient :
-> La gestion des caracteres accentués !! éèà
->
'Â','Ä','À' :         car := 'A';
'Ç' : car := 'S';
'È','É','Ê','Ë','Œ' : car := 'E';
'Î','Ï' : car := 'I';
'Ô','Ö' : car := 'O';
'Ù','Û','Ü' : car := 'U'; Voila, à votre tour de jouer avec moi !!!!!

Une fois fini, on rajoutera SOUNDEX 2 !!!!

Re: Soundex en français

Posté par kikan le 05/04/2005 17:34
Ahhh... Merci pour ce code ; à vrai dire, Dive Into Python est également mon livre de chevet :)

Je m'y suis mis aussi, et ça donne ça (pensez à réindenter là où il faut, le copier-coller sur le site a un peu chamboulé la mise en page) :

code:
#!/bin/python
# -*- coding: UTF-8 -*-

import string
import re

def phonex(chaine):
  
chaine = chaine.upper()
  
print '0:'+chaine
  
  
#1 remplacer les y par des i
  
r = chaine.replace('Y','I')
  
print '1:'+r
  
  
#2 supprimer les h qui ne sont pas précédés de c ou de s ou de p
  
r = re.sub(r'([^P|C|S])H', r'\1', r)
  
print '2:'+r

  
#3 remplacement du ph par f
  
r = r.replace(r'PH', r'F')
  
print '3:'+r
  
  
#4 remplacer les groupes de lettres suivantes :
  
r = re.sub(r'G(AI?)','K\1',r)
  
print '4:'+r
  
  
#5 remplacer les occurrences suivantes, si elles sont suivies par une lettre a, e, i, o, ou u :
  
r = re.sub(r'I()','YN\1',r)
  
print '5:'+r
    
  
#6 remplacement de groupes de 3 lettres (sons 'o', 'oua', 'ein') :
  
r = r.replace('EAU','O')
  
r = r.replace('OUA','2')
  
r = r.replace('EIN','4')
  
r = r.replace('AIN','4')
  
r = r.replace('EIM','4')
  
r = r.replace('AIM','4')
  
print '6:'+r
  
  
#7 remplacement du son ‘é’ :
  
r = r.replace('É','Y')
  
r = r.replace('È','Y')
  
r = r.replace('Ê','Y')
  
r = r.replace('AI','Y')
  
r = r.replace('EI','Y')
  
r = r.replace('ER','YR')
  
r = r.replace('ESS','YS')
  
r = r.replace('ET','YT') #CP : différence entre la version Delphi et l'algo
  
r = r.replace('EZ','YZ')
  
print '7:'+r

  
#8 remplacer les groupes de 2 lettres suivantes (son ‘an’ et ‘in’), sauf s’il sont suivi par une lettre a, e, i o, u ou un son 1 à 4 :
  
r = re.sub(r'AN([^A|E|I|O|U|1|2|3|4])',r'1\1',r)
  
r = re.sub(r'AM([^A|E|I|O|U|1|2|3|4])',r'1\1',r)
  
r = re.sub(r'EN([^A|E|I|O|U|1|2|3|4])',r'1\1',r)
  
r = re.sub(r'EM([^A|E|I|O|U|1|2|3|4])',r'1\1',r)
  
r = re.sub(r'IN([^A|E|I|O|U|1|2|3|4])',r'4\1',r)
  
print '8:'+r

  
#9 remplacer les s par des z s’ils sont suivi et précédés des lettres a, e, i, o,u ou d’un son 1 à 4
  
r = re.sub(r'()S()',r'\1Z\2',r)
  
#CP : ajout du Y à la liste
  
print '9:'+r
  
  
#10 remplacer les groupes de 2 lettres suivants :
  
r = r.replace('OE','E')
  
r = r.replace('EU','E')
  
r = r.replace('AU','O')
  
r = r.replace('OI','2')
  
r = r.replace('OY','2')
  
r = r.replace('OU','3')  
  
print '10:'+r

  
#11 remplacer les groupes de lettres suivants
  
r = r.replace('CH','5')
  
r = r.replace('SCH','5')
  
r = r.replace('SH','5')
  
r = r.replace('SS','S')
  
r = r.replace('SC','S') #CP : problème pour PASCAL, mais pas pour PISCINE ?
  
print '11:'+r

  
#12 remplacer le c par un s s’il est suivi d’un e ou d’un i
  
#CP : à mon avis, il faut inverser 11 et 12 et ne pas faire la dernière ligne du 11
  
r = re.sub(r'C()',r'S\1',r)
  
print '12:'+r
  
  
#13 remplacer les lettres ou groupe de lettres suivants :
  
r = r.replace('C','K')
  
r = r.replace('Q','K')
  
r = r.replace('QU','K')
  
r = r.replace('GU','K')
  
r = r.replace('GA','KA')
  
r = r.replace('GO','KO')
  
r = r.replace('GY','KY')
  
print '13:'+r

  
#14 remplacer les lettres suivante :
  
r = r.replace('A','O')
  
r = r.replace('D','T')
  
r = r.replace('P','T')
  
r = r.replace('J','G')
  
r = r.replace('B','F')
  
r = r.replace('V','F')
  
r = r.replace('M','N')
  
print '14:'+r
 
  
#15 Supprimer les lettres dupliquées
  
oldc='#'
  
newr=''
  
for c in r:
    
if oldc != c: newr=newr+c
    
oldc=c
  
r = newr
  
print '15:'+r

  
#16 Supprimer les terminaisons suivantes : t, x
  
r = re.sub(r'(.*)$',r'\1',r)
  
print '16:'+r

  
#17 Affecter à chaque lettres le code numérique correspondant en partant de la dernière lettre
  
num =['1','2','3','4','5','E','F','H','H','I','K','L','N','O','R','S','T','U','W','X','Y','Z']
  
l =
  
for c in r:
    
l.append(num.index(c))
  
print '17:'
  
print l
  
  
#18 Convertissez les codes numériques ainsi obtenu en un nombre de base 22 exprimé en virgule flottante.
  
res=0.
  
i=1
  
for n in l:
    
res = n*22**-i+res
    
i=i+1
  
print '18:'
  
print res
 
print phonex('PHILAURHEIMSMET')
print phonex('martin')

Re: Soundex en français

Posté par kikan le 05/04/2005 17:37
Non, finalement la mise en page est bien passée ! C'est l'aperçu qui a cafouillé.
J'ai oublié de citer l'auteur de l'algorithme dans le code, c'est mal.

Ajoutez les quelques lignes suivantes à votre code :
code:
#Origine : Algorithme Phonex de Frédéric BROUARD (31/3/99) #Source : http://sqlpro.developpez.com/cours/soundex

Re: Soundex en français

Posté par fcarlier le 05/04/2005 17:41
Je viens juste de finir le soundex2 en python !!!

Donc on peut dire que l'on a les 3 !!!

Je vais faire une page pour mettre à dispo les 3 sources !!!!

A+

Re: Soundex en français

Posté par kikan le 05/04/2005 17:47
Quelques expressions régulières ne sont pas passées du tout...
Je poste le source ici :

http://www.pennaforte.net/christian/phonex.py

Il est complet.

Re: Soundex en français

Posté par fcarlier le 05/04/2005 18:08
kikan : Ton fichier passe mal !!! deprecated .... pas encore tester !!!

Sinon, SOUNDEX et SOUNDEX2 sont dispo sur :
http://www-ic2.univ-lemans.fr/~carlier/recherche/soundex.py

Attend vos améliorations !!! j'ai contacte l'auteur Frédéric BROUARD qui voudrait les rajouter sur la page !!!

A+

Re: Soundex en français

Posté par kikan le 05/04/2005 22:10
Je l'ai remis en téléchargement : j'avais un problème d'Unicode qui le rendait illisible.

Est-ce qu'il est mieux maintenant ? Je viens de le télécharger depuis chez moi, ça passe bien (sur Mac).

Re: Soundex en français

Posté par fcarlier le 07/04/2005 11:28
Salut à tous je viens de faire une page propre sur les soundex/soundex2/phonex (Partie tiré de sqlpro... avec l'autorisation de l'auteur).

J'y ai placé un lien vers les deux script python.
A lire et à apporter des optimisations si vous voulez !!!

http://www-lium.univ-lemans.fr/~carlier/recherche/soundex.html

Merci à tous !!

Sinon, dans phonex, prise en compte du son "on"

Il faudrait maintenant finir d'implementer la fonction de hamming et voir l'appel au librairie de levenstein.

Donc la page doit encore évoluer !!!

A+

Re: Soundex en français

Posté par fcarlier le 07/04/2005 11:35

Python.org : Le site officiel du langage Python.
Zope.org : Le site web officiel de Zope.
Daily Python-URL : Actus de l'univers Python.
Tribute to Zyons : Zyons notre ami et membre fondateur de l'Afpy, nous quittait en 2005.