Difference between revisions of "Exemples de règles de transfert"

From Apertium
Jump to navigation Jump to search
(Simplification balises utilisées pour la mise en page)
Line 48: Line 48:
 
| align=center | Reformatage
 
| align=center | Reformatage
 
| Remet les données traduites au format du document source.
 
| Remet les données traduites au format du document source.
| Les mêmes logiciels sont utilisés pour toutes les paires de langues. Il existe un reformateur pour chaque déformateur disponible bien que tous les reformateurs fassent un traitement similaire.
+
| Les mêmes logiciels sont utilisés pour toutes les paires de langues. Il existe un reformateur pour chaque déformateur disponible bien que tous les reformateurs fassent un traitement similaire.
 
|-
 
|-
 
|}
 
|}
Line 95: Line 95:
 
Le fichier contenant les règles de transfert a comme suffixe <code>.t1x</code> . Ce fichier est composé de plusieurs sections obligatoires et peut contenir d'autres sections facultatives. Chacune des sections devra contenir au moins un élément.
 
Le fichier contenant les règles de transfert a comme suffixe <code>.t1x</code> . Ce fichier est composé de plusieurs sections obligatoires et peut contenir d'autres sections facultatives. Chacune des sections devra contenir au moins un élément.
   
<code>
+
<pre>
 
<?xml version="1.0" encoding="UTF-8"?>
 
<?xml version="1.0" encoding="UTF-8"?>
 
<transfer>
 
<transfer>
Line 101: Line 101:
 
..........
 
..........
 
</section-def-cats>
 
</section-def-cats>
  +
 
 
<section-def-attrs>
 
<section-def-attrs>
 
..........
 
..........
 
</section-def-attrs>
 
</section-def-attrs>
  +
 
 
<section-def-vars>
 
<section-def-vars>
 
..........
 
..........
 
</section-def-vars>
 
</section-def-vars>
  +
 
 
<section-def-macros>
 
<section-def-macros>
 
..........
 
..........
 
</section-def-macros>
 
</section-def-macros>
  +
 
 
<section-rules>
 
<section-rules>
 
..........
 
..........
 
</section-rules>
 
</section-rules>
 
</transfer>
 
</transfer>
</code>
+
</pre>
   
 
=== Section def-cats ===
 
=== Section def-cats ===
Line 126: Line 126:
 
Cette section contient un ou plusieurs éléments qui ont la structure suivante :
 
Cette section contient un ou plusieurs éléments qui ont la structure suivante :
   
<code>
+
<pre>
 
<def-cat n="nom_de_ce_qu'on_veut_décrire">
 
<def-cat n="nom_de_ce_qu'on_veut_décrire">
 
<cat-item tags="sa_description"/>
 
<cat-item tags="sa_description"/>
 
.... (il peut y avoir une ou plusieurs balises <cat-item .../>)
 
.... (il peut y avoir une ou plusieurs balises <cat-item .../>)
 
</def-cat>
 
</def-cat>
</code>
+
</pre>
   
 
=== Section def-attrs ===
 
=== Section def-attrs ===
Line 145: Line 145:
 
Cette section contient un ou plusieurs éléments qui ont la structure suivante :
 
Cette section contient un ou plusieurs éléments qui ont la structure suivante :
   
<code>
+
<pre>
 
<def-attr n="nom_d'une_liste_d'attributs_jouant_un_rôle_commun">
 
<def-attr n="nom_d'une_liste_d'attributs_jouant_un_rôle_commun">
 
<attr-item tags="un_attribut_de_la_section_sdef_d'un_dictionnaire"/>
 
<attr-item tags="un_attribut_de_la_section_sdef_d'un_dictionnaire"/>
Line 151: Line 151:
 
possibles pour l'attribut)
 
possibles pour l'attribut)
 
</def-attr>
 
</def-attr>
</code>
+
</pre>
   
 
=== Section def-vars ===
 
=== Section def-vars ===
Line 163: Line 163:
 
Cette section contient un ou plusieurs éléments qui ont la structure suivante :
 
Cette section contient un ou plusieurs éléments qui ont la structure suivante :
   
<code>
+
<pre>
 
<def-macro n="nom_de_la_macro" npar="nombre_de_paramètres">
 
<def-macro n="nom_de_la_macro" npar="nombre_de_paramètres">
 
.... (le code de la macro)
 
.... (le code de la macro)
 
</def-macro>
 
</def-macro>
</code>
+
</pre>
   
 
=== Section rules ===
 
=== Section rules ===
Line 175: Line 175:
 
Cette section contient un ou plusieurs éléments qui ont la structure suivante :
 
Cette section contient un ou plusieurs éléments qui ont la structure suivante :
   
<code>
+
<pre>
 
<rule>
 
<rule>
 
<pattern>
 
<pattern>
Line 185: Line 185:
 
</action>
 
</action>
 
</rule>
 
</rule>
</code>
+
</pre>
   
 
== Exemples de règles de transfert ==
 
== Exemples de règles de transfert ==
Line 265: Line 265:
 
<def-cat n="nom_commun">
 
<def-cat n="nom_commun">
 
<cat-item tags="n.*"/>
 
<cat-item tags="n.*"/>
</def-cat>
+
</def-cat>
 
</section-def-cats>
 
</section-def-cats>
 
</pre>
 
</pre>

Revision as of 14:16, 16 February 2013

Cette page est destinée à compléter la page Introduction aux règles de transfert. Les exemples utilisés concernent la paire apertium-eo-fr. Il s'agit d'une paire le langues validée pour le sens de traduction français → espéranto. Par contre, le sens de traduction espéranto → français n'a pas été implémenté par le développeur initial. C'est un autre développeur, totalement débutant pour l'écriture des règles de transfert qui a choisi de le faire. Les exemples fournis concernent les toutes premières règles écrites pour traduire un groupe d'un, deux ou trois mots espéranto en un groupe de deux ou trois mots français.

Cette page ne concerne que l'écriture du fichier de règles destiné à être utilisé par l'outil apertium-transfer dont le suffixe est .t1x. L'écriture de balises destinée à la fragmentation dans le cadre d'un transfert en 3 étapes n'y est pas abordé.

Les différentes étapes d'une traduction avec apertium

Commençons par lister les différentes opérations qui sont exécutées pour une traduction.

Opération Rôle Langues concernées
Déformatage Permet de marquer des zones du texte source à ne pas traduire. Par exemple, on ne traduit pas dans une autre langue les balises HTML, mais seulement le texte de la page web. Les mêmes logiciels sont utilisés pour toutes les paires de langues. C'est le format des données à traduire qui emmènera à utiliser tel ou tel déformateur.
Analyse Chaque mot du texte source est décomposé en un lemme suivi du type de mot et de ses attributs (genre, nombre, personne et temps pour un verbe ...). Pour certains mots, plusieurs analyses sont possibles. Dans ce cas, elles sont toutes envoyées en sortie. Valable pour toutes les langues, elle fait appel au dictionnaire morphologique de la langue source.
Désambiguïsation Lorsqu'un mot dispose de plusieurs analyses, cette étape permet de n'en conserver qu'une seule. Valable pour toutes les langues, elle fait appel à un fichier de suffixe .prob
Pour les langues non ambiguës comme l'espéranto, cette étape reste nécessaire pour supprimer la forme de surface de chaque mot analysé (pré-formatage pour l'étape de transfert).
Pré-transfert Traitement des multi-mots avant l'étape de transfert. Toutes langues. Ne nécessite pas de fichier de données particulier.
Transfert Transforme les analyses issues de la langue source en leur version traduite dans la langue cible. Valable pour toutes les paires de langues, il fait appel au dictionnaire bilingue et au fichier de transfert de suffixe .t1x
Traitement inter-fragments Permet des traitements sur un groupe de mots (le sujet, un complément ...)
Comme indiqué plus haut, on ne s'occupera pas de cette étape (ni de la suivante).
Utilisé à priori pour simplifier l'étape de transfert, il nécessite de rajouter quelques balises à l'étape de transfert. Il fait appel à un fichier de suffixe .t2x et éventuellement à d'autres fichiers si on exécute plusieurs passes de ce type.
Post-fragmentation Fin du ou des traitement(s) inter-fragments Nécessaire si un ou plusieurs traitements inter-fragments ont été exécutés. Elle fait appel à un fichier de suffixe .t3x
Génération Génère la forme de surface des mots de la langue cible à partir de la décomposition en lemme + attributs obtenue suite aux étapes précédentes. Valable pour toutes les paires de langues, elle fait appel au dictionnaire morphologique de la langue cible.
Post-génération Permet des corrections orthographiques entre mots voisins lorsqu'il y a des cas particuliers non traités par la génération. Utilisé pour beaucoup de langues cibles (dont le français), peut être pas pour toutes.
Reformatage Remet les données traduites au format du document source. Les mêmes logiciels sont utilisés pour toutes les paires de langues. Il existe un reformateur pour chaque déformateur disponible bien que tous les reformateurs fassent un traitement similaire.

La page Préparation pour utiliser les outils de transfert donne un exemple de la manière dont une phrase espagnole est transformée à chaque étape du traitement pour aboutir finalement à une traduction en anglais.

Comment trouver ce qu'on doit faire

Fondamentalement, l'étape de transfert part d'une analyse désambiguïsée du texte en langue source pour fournir un équivalent dans la langue cible. L'étape de génération effectue alors le traitement inverse de l'analyse. Ça a une conséquence : il faut que les données fournies au générateur correspondent exactement à ce que donnerait une nouvelle analyse du texte traduit dans la langue cible. Sinon, la génération ne sera que partielle avec des # apparaissant au debut de certains mots qui seront alors présentés sous la forme de lemmes.

Exemple :

On veut traduire en français les 3 mots espéranto :

la aŭtomata traduko

Après analyse et désambiguïsation, on obtient :

^la<det><def><sp>$ ^aŭtomata<adj><sg><nom>$ ^traduko<n><sg><nom>$

Une étape de transfert lexical (utilisant seulement le dictionnaire bilingue) donnera :

^le<det><def><sp>$ ^automatique<adj><sg><nom>$ ^traduction<n><f><sg><nom>$

Le morceau de phrase que l'on veut obtenir en français est :

la traduction automatique

En analysant ce morceau de phrase, on obtient :

^le<det><def><f><sg>$ ^traduction<n><f><sg>$ ^automatique<adj><mf><sg>$

qui est le texte qu'on devra fournir au générateur pour obtenir la traduction souhaitée.

Il faudra donc dans l'étape de transfert de structure réaliser la transformation suivante :

Origine :

^le<det><def><sp>$ ^automatique<adj><sg><nom>$ ^traduction<n><f><sg><nom>$

Résultat :

^le<det><def><f><sg>$ ^traduction<n><f><sg>$ ^automatique<adj><mf><sg>$

C'est pour cela, qu'on écrit des règles de transferts. Leur but est d'ajouter ou de supprimer certaines balises dans les descriptions de mots, et éventuellement de changer l'ordre de certains mots.

Structure d'un fichier .t1x

Le fichier contenant les règles de transfert a comme suffixe .t1x . Ce fichier est composé de plusieurs sections obligatoires et peut contenir d'autres sections facultatives. Chacune des sections devra contenir au moins un élément.

 <?xml version="1.0" encoding="UTF-8"?>
 <transfer>
    <section-def-cats>
       ..........
    </section-def-cats>

    <section-def-attrs>
       ..........
    </section-def-attrs>

    <section-def-vars>
       ..........
    </section-def-vars>

    <section-def-macros>
       ..........
    </section-def-macros>

    <section-rules>
       ..........
    </section-rules>
 </transfer>

Section def-cats

La section def-cats est obligatoire. Elle permet de déclarer des catégories de mots que l'on va rechercher pour appliquer une règle de transfert particulière. Il peut s'agir de mots simples (un article (déterminant), un nom, un adjectif, un verbe, ...) ou de choses un peu plus compliquées comme un nom possédant dans sa description la balise <nom> (nominatif) signifiant qu'il fait partie du sujet de la phrase.

Cette section contient un ou plusieurs éléments qui ont la structure suivante :

    <def-cat n="nom_de_ce_qu'on_veut_décrire">
      <cat-item tags="sa_description"/>
      .... (il peut y avoir une ou plusieurs balises <cat-item .../>)
    </def-cat>

Section def-attrs

La section def-attrs est obligatoire. Elle permet de regrouper par fonctionnalités des noms d'attributs de mots définis dans la section sdefs d'un dictionnaire morphologique. Par exemple, on regroupera dans cette section toutes les balises correspondant au :

  • genre d'un mot
  • nombre d'un mot (singulier, pluriel, ...)
  • personne d'un verbe
  • temps d'un verbe
  • ...

Cette section contient un ou plusieurs éléments qui ont la structure suivante :

    <def-attr n="nom_d'une_liste_d'attributs_jouant_un_rôle_commun">
      <attr-item tags="un_attribut_de_la_section_sdef_d'un_dictionnaire"/>
      .... (on a plusieurs balises <attr-item .../> autant que de valeurs
            possibles pour l'attribut)
    </def-attr>

Section def-vars

La section def-vars est obligatoire et doit comporter au moins un élément respectant la syntaxe <def-var n="..."/> . Il s'agit de lister les variables globales utilisées dans les règles de transferts. Toutefois, pour les règles décrites dans cette page, nous n'aurons besoin d'aucune de ces variables.

Section def-macros

La section def-macros est facultative. Néanmoins, elle sera très utile pour écrire des fichiers de transfert moins longs en évitant de dupliquer à l'identique (ou presque) un même traitement dans plusieurs règles de transfert.

Cette section contient un ou plusieurs éléments qui ont la structure suivante :

    <def-macro n="nom_de_la_macro" npar="nombre_de_paramètres">
      .... (le code de la macro)
    </def-macro>

Section rules

Enfin, La section rules est obligatoire. C'est la plus longue du fichier de transfert et celle qui justifie son existence. Elle permet en effet de définir les traitements à effectuer pour traduire des groupes de mots (ou quelquefois des mots isolés, comme on le verra).

Cette section contient un ou plusieurs éléments qui ont la structure suivante :

    <rule>
      <pattern>
        <pattern-item n="nom_défini_comme_def-cat_correspondant_au_premier_mot_à_traiter"/>
        .... (autant de balises <pattern-item ..../> que de mots qu'on veut traiter ensemble)
      </pattern>
      <action>
        .... (description de la règle de transfert)
      </action>
    </rule>

Exemples de règles de transfert

Transférer deux mots en les accordant

On va commencer par traduire en français l'article "la" suivi d'un nom commun.

Recherche des modifications à apporter

En espéranto, l'article défini "la" est invariant, alors qu'en français, il possède 3 formes : "le", "la", "les" selon le genre du nombre auquel il s'accorde.

Pour le nom commun, il a deux formes en espéranto selon qu'il fasse partie du sujet ou du complément d'object dans la phrase. En français, il s'écrit pareil dans les deux cas.

Exemples :

Espéranto Analyse espéranto Français Analyse français
la tago
la tagon
^la<det><def><sp>$ ^tago<n><sg><nom>$
^la<det><def><sp>$ ^tago<n><sg><acc>$
le jour ^le<det><def><m><sg>$ ^jour<n><m><sg>$
la nokto
la nokton
^la<det><def><sp>$ ^nokto<n><sg><nom>$
^la<det><def><sp>$ ^nokto<n><sg><acc>$
la nuit ^le<det><def><f><sg>$ ^nuit<n><f><sg>$
la tagoj
la tagojn
^la<det><def><sp>$ ^tago<n><pl><nom>$
^la<det><def><sp>$ ^tago<n><pl><acc>$
les jours ^le<det><def><mf><pl>$ ^jour<n><m><pl>$
la noktoj
la noktojn
^la<det><def><sp>$ ^nokto<n><pl><nom>$
^la<det><def><sp>$ ^nokto<n><pl><acc>$
les nuits ^le<det><def><mf><pl>$ ^nuit<n><f><pl>$

Examinons ce que donne la traduction lexicale de l'analyse espéranto et comparons-la à l'analyse en français que l'on veut soumettre au générateur :

Analyse espéranto Analyse espéranto traduite en français L'analyse en français que l'on veut obtenir
^la<det><def><sp>$ ^tago<n><sg><nom>$
^la<det><def><sp>$ ^tago<n><sg><acc>$
^le<det><def><sp>$ ^jour<n><m><sg><nom>$
^le<det><def><sp>$ ^jour<n><m><sg><acc>$
^le<det><def><m><sg>$ ^jour<n><m><sg>$
^la<det><def><sp>$ ^nokto<n><sg><nom>$
^la<det><def><sp>$ ^nokto<n><sg><acc>$
^le<det><def><sp>$ ^nuit<n><f><sg><nom>$
^le<det><def><sp>$ ^nuit<n><f><sg><acc>$
^le<det><def><f><sg>$ ^nuit<n><f><sg>$
^la<det><def><sp>$ ^tago<n><pl><nom>$
^la<det><def><sp>$ ^tago<n><pl><acc>$
^le<det><def><sp>$ ^jour<n><m><pl><nom>$
^le<det><def><sp>$ ^jour<n><m><pl><acc>$
^le<det><def><m><pl>$ ^jour<n><m><pl>$
^la<det><def><sp>$ ^nokto<n><pl><nom>$
^la<det><def><sp>$ ^nokto<n><pl><acc>$
^le<det><def><sp>$ ^nuit<n><f><sg><nom>$
^le<det><def><sp>$ ^nuit<n><f><pl><acc>$
^le<det><def><f><pl>$ ^nuit<n><f><pl>$

On constate que :

  • pour l'article, la traduction lexicale donne systématiquement ^le<det><def><sp>$ . Il faudra remplacer la dernière balise <sp> (singulier ou pluriel) par les balises du nom commun indiquant son genre et son nombre.
  • pour le nom commun, la traduction lexicale a trouvé (dans le dictionnaire bilingue) le genre du nom traduit en français. Pour savoir si ce nom est au singulier ou au pluriel, elle a conservé l'attribut nombre de la langue d'origine. Par contre, on a aussi conservé les attributs <nom> ou <acc> dont on n'a pas besoin en français et qui empêcheraient la génération du mot. Il faudra donc les supprimer dans la règle de transfert.

Ecriture de la règle de transfert

Section def-cats

Dans cette section, on va définir 2 catégories de mots :

  • les déterminants qu'on apellera det et qu'on identifiera dans les analyses par la balise <det> suivie de n'importe quoi.
  • les noms communs qu'on apellera nom_commun et qu'on identifiera dans les analyses par la balise <n> suivie de n'importe quoi.

La section def-cats s'écrira comme ceci :

  <section-def-cats>
    <def-cat n="det">
      <cat-item tags="det.*"/>
    </def-cat>

    <def-cat n="nom_commun">
      <cat-item tags="n.*"/>
    </def-cat>
  </section-def-cats>
  • les noms des catégories de mots sont dans l'attribut n des balises <def-cat n="...">
  • les description de ce qu'on doit trouver dans l'analyse pour reconnaitre la catégorie de mot sont dans l'attribut tags des balises <cat-item tags="..."/>
Section def-attrs
Section rules

Rajouter un mot dans la langue cible

Intervertir deux mots

Changer des attributs en fonction de conditions

N'écrire qu'une fois des traitements communs à plusieurs règles