Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Gestion des césures
Syllabes, coupures de mots en Perl

Le , par djibril

39PARTAGES

1  0 
Bonsoir à tous,

Juste par curiosité, je me demandais si Perl qui est un très bon langage de traitement de texte possédait un module qui permet de gérer les coupures de mots avec ou sans césures. Elles sont généralement utiles en fin de ligne justifiée afin de couper le mot au bon endroit si possible. Bien évidement, cela dépend de chaque langue, mais en l’occurrence en français, est-ce qu'un module est existant sur le CPAN.
Par la même occasion, cela revient à être capable de couper correctement un mot en identifiant les syllabes et les césures dans les règles de l'art.

Prenons pour exemple le mot : représentation.
Couper ce mot revient à le tronquer de la sorte : re-pré-sen-ta-tion. Néanmoins, une césure ne doit pas laisser un mot de moins de trois lettres en début ou fin de ligne. De ce fait, la bonne coupure est repré-sen-ta-tion.

Il serait intéressant d'avoir un module Perl qui soit capable de faire ce genre de coupures . Vous en connaissez ? Dans d'autres langages cela doit exister vu que les coupures de mots sont gérés dans Word, OpenOffice... Cela permettrait d'améliorer les modules de coupure de texte comme Text::Wrap, Text::Format...

Le seul module que j'ai trouvé est : Text::Hyphen qui utilise l'algorithm Knuth-Liang que je ne connais pas.
Code : Sélectionner tout
1
2
3
4
5
6
use Text::Hyphen;

my $hyphenator = new Text::Hyphen;

print $hyphenator->hyphenate('representation');
# prints rep-re-sen-ta-tion
Qu'en pensez-vous de l'idée d'avoir ce genre de module, existe-il déjà ?

Une erreur dans cette actualité ? Signalez-le nous !

Avatar de dmganges
Membre chevronné https://www.developpez.com
Le 13/08/2015 à 5:52
Bonjour djibril,
Je ne connais pas de module Perl faisant la césure de mot en syllabes, mais j'avais fait çà en C , il y a près d'une trentaine d'années pour une "phonétisation", plutôt une simplification orthographique pour un thésaurus...

De mémoire, la fonction faisait le découpage en tout au plus une trentaine de lignes.
La piste que j'avais utilisé :
- Mettre le mot dans un tableau, pour accéder à chaque lettre
- Pour chaque lettre déterminer s'il s'agit d'une consonne ou d'une voyelle

Lire le tableau et appliquer les règles :
Celles dont je me souviens de mémoire :
- Si 2 consonnes se suivent on fait une césure entre les deux consonnes
- Si une ou plusieurs voyelles est/sont suivie(s) par une consonne, on coupe juste devant la consonne
Il y a une petite dizaine d'exception...
...
Un mot ne contient pas plus de 5 consonnes successives, le seul que j'ai rencontré à ce jour est Nietzsche

Tiens, je viens de trouver çà, ça ne devrait pas te poser de pb de programmation Perl

Je n'ai plus l'utilité d'un tel module, mais l'idée est excellente !

[EDIT 06:55] Code C
Tiens je viens de retrouver dans mes archives un bout de code C, ce n'est probablement pas le dernier...
NB : Il ne s'agissait pas de coller absolument aux règles de grammaire, mais de contourner avant tout les fautes d'orthographes de textes écrits par de nombreux personnels...
Le module gérait également les locutions et leurs synonymies... Ex :
Transport de matière dangereuse = Transport matière fissile = Transport matière radioactive...

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
                                  /*   CESURES   */ 
 
cesu(motinit,motcesures) 
char motinit[]; 
char motcesures[]; 
 
{ 
int i=0,j=0,voyrencontre=0; 
 
while (motinit[i]!='\0') 
   { 
    if (estvoy(motinit[i]))                      /*   VOYELLES     */ 
	if (estvoy(motinit[i]) &&                /*   glu-ant      */ 
	    (motinit[i-1]=='u' &&                /*   mar-quant    */ 
             motinit[i-2]!='q' &&                /*  u-a  -quant   */ 
	     motinit[i-2]!='g') && 
	    (motinit[i]=='i' && 
	     motinit[i+1]=='n')) 
	   { 
	    motcesures[j++]='-'; 
	    motcesures[j++]=motinit[i++]; 
	   } 
       else 
           {                                      /*  cas general */ 
            motcesures[j++]=motinit[i++];         /*    te-te     */ 
            voyrencontre=1; 
           } 
 
    else                                          /*   CONSONNES  */ 
      if (motinit[i+1]=='l' && motinit[i]!='l'    /*   e-xem-ple  */ 
			    && motinit[i]!='h'    /* a-phro-di-te */ 
			    && motinit[i]!='r'    /*  sur-li-gne  */ 
			    && i!=0)              /*  -phr  -pl   */ 
	 { 
	  motcesures[j++]='-'; 
	  motcesures[j++]=motinit[i++]; 
	  voyrencontre=0; 
	 } 
 
    else                                            /*  im-pri-me  */ 
      if (motinit[i+1]=='r' && motinit[i]!='r'      /*     -pr     */ 
			    && motinit[i]!='h' 
			    && motinit[i]!='n'      /* en-registre */ 
			    && i!=0) 
	 { 
	  motcesures[j++]='-'; 
	  motcesures[j++]=motinit[i++]; 
	  voyrencontre=0; 
         } 
 
    else                                          /* am-phi-thea-tre */ 
      if (motinit[i+1]=='h' && i!=0 &&            /*   de-clen-cher  */ 
	           (motinit[i]=='c' ||            /*   embau-cher    */ 
		    motinit[i]=='p' ||            /*  -ch -ph -th    */ 
	            motinit[i]=='t')) 
	 { 
	  motcesures[j++]='-'; 
	  motcesures[j++]=motinit[i++]; 
          voyrencontre=0; 
         } 
 
    else                                           /*  cham-pa-gne  */ 
      if (motinit[i+1]=='n' &&                     /*         -gn   */ 
	    motinit[i]=='g' && i!=0) 
	 { 
	  motcesures[j++]='-'; 
	  motcesures[j++]=motinit[i++]; 
          voyrencontre=0; 
         } 
 
    else 
      if (estvoy(motinit[i+1]) &&                  /* cas generaux  */ 
	 i!=0 && voyrencontre)                     /* voyelle deja  */ 
	 {                                         /*  rencontree   */ 
	  motcesures[j++]='-'; 
          motcesures[j++]=motinit[i++]; 
         } 
      else 
          motcesures[j++]=motinit[i++];            /* voyelle pas   */ 
   }                                               /* encore ren-   */ 
motcesures[j]='\0';                                /*   contree     */ 
}
NB : Les commentaires expriment l'idée générale de la règle et ne correspondent pas systématiquement au code C qui précède

J'ai perdu le reste
Je m'étais également aidé du Dictionnaire des rimes orales et écrites
Bon courage
0  0 
Avatar de djibril
Responsable Perl et Outils https://www.developpez.com
Le 13/08/2015 à 10:11
Voici quelques liens intéressants :
  • http://www.plumefrancaise.fr/fr/c%C3%A9sure
  • https://fr.wikipedia.org/wiki/C%C3%A...typographie%29

    Bonjour à tous !
    Ce sujet m’a intéressé, et je me permets d’y revenir bien qu’il soit un peu ancien — ne serait-ce que parce que d’une part ça n’est pas non plus très ancien, d’autre part en cherchant sur Google par exemple on peut tomber dessus et avoir la curiosité de le lire — comme ç’a été mon cas, et ça m’a bien intéressé !
    Je vais essayer de faire en sorte, donc, que ce soit lisible.

    Il me semble que plusieurs choses ont été mélangées, et que pour les uns et les autres le terme “syllabation” ne recouvre pas la même réalité pour les uns et les autres.
    Il faut bien distinguer par exemple l’écrit et l’oral. L’exemple de pavement m’a frappé. Pour l’écrit, la seule syllabation est pa-ve-ment. Si l’on peut envisager pave-ment et pa-vement, c’est uniquement parce que la voyelle -e- [ə] est instable en français (on parle parfois de schwa) et peut disparaître. Il est important de remarquer que c’est peut, et non pas doit.
    Prenez le mot revenir ; syllabation écrite (même si ce concept, je vais y revenir, est lui-même flou) : re-ve-nir ; mais à l’oral, certains disent r'venir, d’autres rev'nir. Il me paraît donc bien téméraire de vouloir légiférer à l’écrit une syllabation orale, dans la mesure où l’écrit est fixe et l’oral fluctuant.

    Syllabation et langue des vers

    Je suis arrivé ici parce que je me préoccupe de la syllabation dans la versification classique (XVIIe–XVIIIe siècles, voire une bonne partie du XIXe). Dans ce domaine, il y a ce que l’on peut appeler une langue des vers qui fixe la prononciation. Dans la langue des vers, par exemple, il n’y a pas de [ljɔ˜], il n’y a que des [liɔ˜] (li-on), de même qu’il n’y a pas de [ʃiɛ˜] (chi-en) et seulement des [ʃjɛ˜] (chien). C’est comme ça, l’usage est fixe. Il y a également les règles d’ « élision » du e instable, et la disjonctivité du h. Bref, peu importe le détail, l’important est qu’en précisant bien toutes les règles (ce qui implique effectivement une liste de vocabulaire parce que la réalisation de la graphie i+V ne dépend en rien ou presque rien de la graphie effective du mot, mais de l’étymologie principalement), on peut syllaber de manière univoque des vers de la période classique. Il n’y a qu’une et une seule façon de "compter" tels vers de Racine, Corneille, Voltaire, même Musset et Baudelaire…

    Deux exemples situés aux antipodes l’un de l’autre
    Boileau, Art poétique :
    Code : Sélectionner tout
    1
    2
    3
    4
    5
    6
    7
    C’est / en / vain / qu’au / Par- / nass(e) / un / té- / mé- / rair(e) / au- / teur
    Pren- / se / de / l’art / des / vers / at- / tein- / dre / la / hau- / teur
    
    Verlaine, Poèmes saturniens :
    Bai- / ser / ro- / se / tré- / mièr(e) / au / jar- / din / des / ca- / res- / ses
    Vif / ac- / com- / pa- / gne- / ment / sur / le / cla- / vier / des / dents
    (et jamais cla-/vi-/er, p. ex.)


    Mettre des tirets en fin de ligne

    En ce qui concerne la "syllabation écrite", la césure, ce qu’on appelle en anglais hyphenation (hypen, tiret) est dicté par d’autres règles encore, qui sont bien sûr liées à la prononciation, mais pas uniquement. Par exemple, même si dans certains contextes ont prononce li-on, on n’a pas le droit de couper en fin de ligne li-
    on, pas plus qu’attenti-
    on, ou que li-
    en. Mais ces règles sont liées, elles aussi, à l’étymologie et à la tradition. Ça se voit particulièrement bien en anglais, où l’on coupe gov-
    ernment. En réalité, autant que de règles linguistiques cela relève de règles typographiques. D’ailleurs si quelqu’un voulait utiliser ces règles, je pense qu’il devrait se tourner vers les algorithmes de césure de LaTeX, qui sont maintenant très largement répandus (il me semble avoir lu ou entendu qu’Open/LibreOffice les utilisaient).
    C’est uniquement quand on met des tirets pour couper le mot qu’apprendre est ap-prendre et non a-pprendre, parce que pour beaucoup de gens, c'est a-prendre et la double consonne n’est pas réalisée dans la prononciation.

    Aiguille, anguille, aiguise

    Enfin, oui, il restera toujours en français des cas où la prononciation (la syllabation) doit être précisée par un “dictionnaire”, et aiguille en ferait à mon avis partie.
    Le fait qu’on prononce ai-gu-ille (en détachant le u) n’a rien avoir avec le ille, puisqu'on dit bien an-guille, et qu’inversement on entend aussi bien ai-gu-i-ser qu’ai-gui-ser.

    Je pense donc, pour conclure, que oui il est possible de syllaber un texte français par l’informatique, dans un certaine mesure et avec certaines restrictions, mais qu’une intervention qui ne relève pas de la pure algorithmique à partir de la graphie (recours à un dictionnaire) est nécessaire parce que la graphie en français (comme en anglais d’ailleurs) n’est pas suffisante, voire consistante, pour décrire la prononciation.


Finalement, cela ne semble pas si évident que ça. Il y a beaucoup d'exceptions. Mais juste pour le fun, j'aimerai bien essayer de faire un petit programme. Je vais dans un premier temps m'inspirer de ton code dmganges. Sur plusieurs sites, il est écrit qu'il faudrait presque avoir une BDD avec tous les mots du dictionnaires , ce qui semble moyen si j'en faisais un module.
Donc deux problématiques :
  • à partir d'un mot, isoler les syllabes ;
  • à partir d'un mot, isoler les césures pour les fins de ligne.


Je compte sur vous pour m'aider
0  0 
Avatar de Jipété
Expert éminent sénior https://www.developpez.com
Le 13/08/2015 à 11:11
Salut,
Citation Envoyé par djibril Voir le message
Voici quelques liens intéressants :

Faudra faire attention avec ce site : une magnifique faute d'orthographe sur la page en question, une autre sur la page d'accueil, et comme la page "Contact" est désactivée (le site a l'air inactif depuis un an), ça va rester...
0  0 
Avatar de dmganges
Membre chevronné https://www.developpez.com
Le 13/08/2015 à 11:12
Citation Envoyé par djibril
Finalement, cela ne semble pas si évident que ça. Il y a beaucoup d'exceptions.
Oui, il est difficile de faire un module générique, il faut bien penser les besoins aux départ :
- Césures pour un traitement de texte
- Césures en vue de phonétiser
- Césures en vue d'une simplification orthographique
...

En ce qui me concerne j'avais à phonétiser en vue d'une simplification orthographique :
Une fois le mot découpé en syllabes, je phonétisais les syllabes.
Les syllabes phonétisées était une entrée dans un dictionnaire d'une BDD, Ex :

Phonème Pho-nè-me donnait FoNeMe
Et ce que le mot initial soit Phonaime, Fonème, Fauneime...

Je n'ai pas eu le temps de finaliser correctement ce projet, mon patron s'étant aperçu que je m'amusais comme un petit fou, m'avait donné un autre os à ronger ! selon ces propres dires...
S'il passe par là, il se reconnaîtra sans aucun doute

La langue française est pleine de turpitudes du genre :

Les poules couvent dans le couvent,
elles sortaient dès qu'on leur avait ouvert la porte
elles sortaient des cons leur avaient ouvert la porte
...
0  0 
Avatar de djibril
Responsable Perl et Outils https://www.developpez.com
Le 13/08/2015 à 11:16
Citation Envoyé par Jipété Voir le message
Salut,

Faudra faire attention avec ce site : une magnifique faute d'orthographe sur la page en question, une autre sur la page d'accueil, et comme la page "Contact" est désactivée (le site a l'air inactif depuis un an), ça va rester...
C'est sûr ! Mais y a toujours moyen de tirer du positif dans ce site.
0  0 
Avatar de djibril
Responsable Perl et Outils https://www.developpez.com
Le 13/08/2015 à 11:20
Citation Envoyé par dmganges Voir le message
Oui, il est difficile de faire un module générique, il faut bien penser les besoins aux départ :
- Césures pour un traitement de texte
- Césures en vue de phonétiser
- Césures en vue d'une simplification orthographique
...

En ce qui me concerne j'avais à phonétiser en vue d'une simplification orthographique :
Une fois le mot découpé en syllabes, je phonétisais les syllabes.
Les syllabes phonétisées était une entrée dans un dictionnaire d'une BDD, Ex :

Phonème Pho-nè-me donnait FoNeMe
Et ce que le mot initial soit Phonaime, Fonème, Fauneime...

Je n'ai pas eu le temps de finaliser correctement ce projet, mon patron s'étant aperçu que je m'amusais comme un petit fou, m'avait donné un autre os à ronger ! selon ces propres dire...
S'il passe par là, il se reconnaîtra sans aucun doute
Bah n'ayant pas forcément de besoins, c'est juste pour le fun, je te dirais de partir sur quelques choses de simple dans un premier temps si c'est possible : césure pour du traitement de texte, c'est ce qui serait le plus utile au plus grand nombre, mais reste à savoir si c'est le plus simple à faire .

Voici une excellente documentation sur la typographie française : petite leçon de typographie de Jacques ANDRÉ.
0  0 
Avatar de Lolo78
Rédacteur/Modérateur https://www.developpez.com
Le 13/08/2015 à 13:21
Je pense que les traitements de texte comme Word ou OpenOffice Writer utilisent une base de données avec tous les mots (ça sert aussi à la vérification orthographique) et les emplacements des césures possibles.

Il y a peut-être moyen de récupérer la BDD de mots d'Open Office ou de Libre Office (c'est d'ailleurs peut-être la même), car elle doit être dans le domaine public. Avec environ 60.000 mots, on arrive sans doute à moins d'un demi mégaoctet, ce n'est pas forcément prohibitif.

Citation Envoyé par djibril Voir le message

Le seul module que j'ai trouvé est : Text::Hyphen qui utilise l'algorithm Knuth-Liang que je ne connais pas, mais rien que l'exemple de la documentation me laisse perplexe
Code : Sélectionner tout
1
2
3
4
5
6
use Text::Hyphen;

my $hyphenator = new Text::Hyphen;

print $hyphenator->hyphenate('representation');
# prints rep-re-sen-ta-tion
Les règles de la césure ne sont pas les mêmes en français et en anglais.

Et le mot anglais representation "s'hyphène" bien comme indiqué, rep-re-sen-ta-tion, comme on peut le vérifier sur n'importe quel bon dictionnaire anglais. Voir par exemple celui-ci.

Sinon, quand je vois le nom de Knuth dans un algorithme, j'ai le plus grand respect. Il serait peut-être utile d'y jeter un coup d’œil et de voir s'il peut être adapté aux règles de césure en français.
0  0 
Avatar de Lolo78
Rédacteur/Modérateur https://www.developpez.com
Le 13/08/2015 à 13:33
Quelques informations complémentaires, mais sans doute en partie périmées:

https://www.openoffice.org/fr/Documentation/How-to/General/LesDictionnaires.pdf

Et un second lien vers le site de ceux qui produisent les dictionnaires pour les logiciels libres, y compris le dictionnaire de césure.

Reste à comprendre comment se servir de leurs dictionnaires.
0  0 
Avatar de CosmoKnacki
Membre expert https://www.developpez.com
Le 13/08/2015 à 15:11
Pour les motivés, vous trouverez la thèse de Frank Liang sur le sujet et un lien vers le code source (en TeX et Pascal) de Donald Knuth: http://www.tug.org/docs/liang/
0  0 
Avatar de djibril
Responsable Perl et Outils https://www.developpez.com
Le 13/08/2015 à 16:28
Citation Envoyé par Lolo78 Voir le message
Je pense que les traitements de texte comme Word ou OpenOffice Writer utilisent une base de données avec tous les mots (ça sert aussi à la vérification orthographique) et les emplacements des césures possibles.

Il y a peut-être moyen de récupérer la BDD de mots d'Open Office ou de Libre Office (c'est d'ailleurs peut-être la même), car elle doit être dans le domaine public. Avec environ 60.000 mots, on arrive sans doute à moins d'un demi mégaoctet, ce n'est pas forcément prohibitif.

Les règles de la césure ne sont pas les mêmes en français et en anglais.

Et le mot anglais representation "s'hyphène" bien comme indiqué, rep-re-sen-ta-tion, comme on peut le vérifier sur n'importe quel bon dictionnaire anglais. Voir par exemple celui-ci.

Sinon, quand je vois le nom de Knuth dans un algorithme, j'ai le plus grand respect. Il serait peut-être utile d'y jeter un coup d’œil et de voir s'il peut être adapté aux règles de césure en français.
En effet, avoir le dictionnaire entier dans le module peut ne pas être une idiotie. Pour le module Text::Hyphen j'avais zappé le fait que cela s'applique plutôt à la langue anglaise. L'adapter à la langue française serait une bonne idée.
0  0