#!/usr/bin/env python # -*- coding: utf-8 -*- import unicodedata def Graphie_desaccentuee(graphie): """Supprime les accents d'une chaîne de caractères unicode. La chaîne de caractères est normalisée en décomposant les lettres accentuées, puis on conserve uniquement les caractères qui ne sont pas des accents. """ return ''.join([c for c in unicodedata.normalize('NFD', graphie) if unicodedata.category(c) != 'Mn']) def Nb_noy_voc(graphie, lettres_voyelles=set('AEIOUaeiouàâäéèêëïîöôüûù')): """Calcule le nombre de noyaux vocaliques de la graphie. Validité sur les langues à écriture alphabétique voyellée. 1 noyau vocalique = 1 suite de voyelles contiguës. Pour que le calcul soit indépendant des langues, on ne s'occupe pas du fait qu'une syllabe finale soit muette ou pas (on la compte comme non muette). """ graphie = Graphie_desaccentuee(graphie) # graphie_voyelles[i] vaut True si graphie[i] est un voyelle, False sinon graphie_voyelles = [c in lettres_voyelles for c in graphie] # Traiter y : C ou V ? # Compter y comme voyelle ds systèmes et comme consonne ds rayon # 3 règles interlangue pour y C ou V : # - y = C / défaut (rien à faire) # - y au début ou à la fin : y = V (by y usually) # - CyC => y = V (remplacer y / V) nb_lettres = len(graphie) for i in range(nb_lettres): lettre = graphie[i] est_voyelle = graphie_voyelles[i] if ( lettre.lower() == 'y' and ( i == 0 or # "y" en début de mot i == nb_lettres-1 or not # "y" en fin de mot graphie_voyelles[i-1] or not # "y" précédé d'une consonne graphie_voyelles[i+1] # "y" suivi d'une consonne ) ): graphie_voyelles[i] = True # Décompte du nombre de noyaux vocaliques # = nombre de voyelles précédées d'une consonne (ou en début de mot) nb_noy = 0 for i in range(nb_lettres): if graphie_voyelles[i] and (i == 0 or not graphie_voyelles[i-1]): nb_noy += 1 return nb_noy if __name__ == "__main__": for mot in ['états', 'physique', 'hayon', 'really', 'ybycydy', 'Rohmilchk serteller', 'anticonstitutionnellement']: print(( '"%s" -> "%s" : %i noyaux vocaliques' % (mot, Graphie_desaccentuee(mot), Nb_noy_voc(mot)) ).encode('utf-8', 'replace'))