Fragmentation : un exemple complet

From Apertium
Jump to navigation Jump to search

In English

Ceci sera un exemple complet de fragmentation, qui sera construit depuis le début.

On examinera la paire espéranto <-> anglais et on essaiera de traduire la phrase "La libro estas blua" en "The book is blue" (le livre est bleu).

Aperçu

D'abord, un petit aperçu sur la manière dont le transfert en 3 étapes fonctionne :

  • Étape de transfert : Les mots sont traduits en utilisant le dictionnaire bilingue et catégorisés et assemblés dans des fragments (dans le fichier .t1x). Ici des balises dans les mots peuvent également être rajoutées, supprimées ou transformées en 'pointeurs' qui pointent sur les balises des fragments environnants.
  • Étape inter fragmentation : Les fragments sont réordonnés, combinés et découpés et les balises de fragments changées (dans le fichier .t2x)
  • Étape post fragmentation : Les mots dans les fragments sont restaurés (dans le fichier .t3x)

Si nous regardons comment "The blue book is good" passe à travers le système, on a juste avant le transfert :

^The<det><def><sp>$ ^blue<adj>$ ^book<n><sg>$ ^be<vbser><pres><p3><sg>$ ^good<adj><sint>$

qui est transféré en espéranto et fragmenté ainsi

^det_adj_nom<SN><sg><nom>{^La<det><def><2><3>$ ^blua<adj><2><3>$ ^libro<n><2><3>$}$ 
^ser<SV><pres><p3><sg>{^esti<vbser><pres>$}$ 
^adj<SN><sg>{^bona<adj><sg><nom>$}$

Ici 'det_adj_nom' est le nom du fragment et <SN><sg><nom> la balise du fragment. Le contenu du fragment est {^La<det><def><2><3>$ ^blua<adj><2><3>$ ^libro<n><2><3>$} où <2> et <3> sont des pointeurs vers des balises de fragments (<sg> et <nom> respectivement). Ceci permet de changer les valeurs au niveau de la fragmentation plus tard, si nécessaire.

Dans ce cas simple il ne se passe rien à l'étape inter fragmentation. Après l'étape post fragmentation ça ressemble à :

^La<det><def><sg><nom>$ ^blua<adj><sg><nom>$ ^libro<n><sg><nom>$ ^esti<vbser><pres>$ ^bona<adj><sg><nom>$

qui devient "La blua libro estas bona".

En commençant au début

Maintenant, on va essayer la même phrase de l'espéranto à l'anglais, mais avec des fichiers t1x, t2x et t3x plus ou moins vides. Après le balisage de disambiguïsation "La blua libro estas bona" devient :

^La<det><def><sp>$ ^blua<adj><sg><nom>$ ^libro<n><sg><nom>$ 
^esti<vbser><pres>$ 
^bona<adj><sg><nom>$

Sans aucune règle le résultat sera juste que chaque mot aura un fragment par 'défaut' :

^default{^The<det><def><sp>$}$ ^default{^blue<adj><sg><nom>$}$ ^default{^book<n><sg><nom>$}$  
^default{^be<vbser><pres>$}$  
^default{^good<adj><sint><sg><nom>$}$

Maintenant définissons quelques règles. Pour commencer, on va définir quelques règles de base mono mot. Voir Créer une nouvelle paire de langues#Règles de transfert.

Le déterminant

D'abord le déterminant. D'abord on définit la catégorie 'c_det' qui contient tous les mots marqués comme <det> et <det><autre balise>. On définit alors les attributs pour le nombre et la sorte de déterminant.

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

...
  <def-attr n="a_nbr">
     <attr-item tags="sg"/>
     <attr-item tags="sp"/>
     <attr-item tags="pl"/>
  </def-attr>

  <def-attr n="a_det">
     <attr-item tags="det.def"/>
     <attr-item tags="det.ind"/>
     <attr-item tags="det.pos"/>
     <attr-item tags="det.qnt"/>
  </def-attr>
...
  <rule>
     <pattern>
       <pattern-item n="c_det"/>
     </pattern>
     <action>
       <out>
         <chunk name="det" case="caseFirstWord">
           <tags>
             <tag><lit-tag v="SN"/></tag>
             <tag><clip pos="1" side="tl" part="a_nbr"/></tag>
           </tags>
           <lu>
             <clip pos="1" side="tl" part="lem"/>
             <clip pos="1" side="tl" part="a_det"/>
             <clip pos="1" side="sl" part="a_nbr" link-to="2"/>
           </lu>
         </chunk>
       </out>
     </action>
  </rule>

La règle cherche la catégorie c_det (n'importe quoi commençant par <det>) et par conséquent reconnaît le ^La<det><def><sp>$ et affiche

^det<SN><sp>{^The<det><def><2>$}$ 

"en dehors", sur le fragment est placé le premier attribut <SN> et ensuite l'attribut nombre. Dans le fragment (dans une 'unité lexicale') on met le lemme traduit (le dictionnaire bilingue donne la -> the), les attributs du déterminant (<det><def>) et un pointeur vers la balise 2 (le part="a_nbr" doit être présent mais il est ignoré en mode fragmentation).

L'attribut case du fragment a la valeur caseFirstWord. Si le déterminant est le premier mot de la phrase, le lemme du fragment sera envoyé en sortie comme "Det", sinon, il sera "det". Les autres valeurs possibles de case sont variableCase et case0therWord.

Est-ce que quelqu'un sait ce qu'impliquent ces autres valeurs, et comment les inconsistances sont résolues parmi le cas <lu> et le cas fragmentation ? --unhammer 14:13, 16 février 2010 (UTC)

Adjectifs

Ici nous avons ^blua<adj><sg><nom>$ et ^bona<adj><sg><nom>$ que nous - s'ils sont seuls (ce qui est le cas, nous sommes toujours au niveau un mot = un fragment) - aimerions fragmenter comme

^adj<SN><sg>{^blue<adj>$}$
^adj<SN><sg>{^good<adj><sint>$}$

D'abord on définit la catégorie c_adj et ensuite les attributs qui peuvent apparaître sur un adjectif :

  <def-cat n="c_adj">
     <cat-item tags="adj.*"/>
  </def-cat>
...
  <def-attr n="a_adj">
     <attr-item tags="adj"/>
     <attr-item tags="adj.comp"/>
     <attr-item tags="adj.sup"/>
     <attr-item tags="adj.sint"/>
     <attr-item tags="adj.sint.comp"/>
     <attr-item tags="adj.sint.sup"/>
  </def-attr>

Ici ça fait une liste plutôt longue puisque les adjectifs peuvent être comparatifs et superlatifs (bleu, plus bleu, le plus bleu) et synthétique (voir Liste_des_symboles#Adjectifs). Le dictionnaire bilingue prend vraiment soin de ça, donc on n'a vraiment pas à se soucier de l'aspect synthétique de ^good<adj><sint>$ :

<e><p><l>blua<s n="adj"/></l><r>blue<s n="adj"/></r></p></e>
<e><p><l>bona<s n="adj"/></l><r>good<s n="adj"/><s n="sint"/></r></p></e>

La règle de transfert qui reconnaît les adjectifs et envoie en sortie des fragments appelés adj avec des attributs <SN>+nombre de l'adjectif (<sg>) et à l'intérieur du fragment, il y a le lemme (good) avec les attributs de l'adjectif (<adj><sint>) :

  <rule>
     <pattern>
       <pattern-item n="c_adj"/>
     </pattern>
     <action>
       <out>
         <chunk name="adj" case="caseFirstWord">
           <tags>
             <tag><lit-tag v="SN"/></tag>
             <tag><clip pos="1" side="tl" part="a_nbr"/></tag>
           </tags>
           <lu>
             <clip pos="1" side="tl" part="lem"/>
             <clip pos="1" side="tl" part="a_adj"/>
           </lu>
         </chunk>
       </out>
     </action>
  </rule>

Donc avant, pendant et après le transfert les adjectifs ressemblent à

^blua<adj><sg><nom>$
^adj<SN><sg>{^blue<adj>$}$
^blue<adj>$

Où va la balise <nom> ?

Vous devriez avoir remarqué que blue en espéranto était pour l'instant ^blua<adj><sg><nom>$. Que s'est il passé ?

Hé bien, comme ce n'était pas mentionné dans la partie <out> de la règle ça a juste disparu. En espéranto les noms et adjectifs à l'accusatif (complément d'objet) reçoivent un n supplémentaire à la fin, ainsi :

  • "Mi havas la bluan libron (^blua<adj><sg><acc>$ ^libro<n><sg><acc>$) signifie "I have the blue book" (j'ai le livre bleu) alors que
  • "Min havas la blua libro (^blua<adj><sg><nom>$ ^libro<n><sg><nom>$) signifie "The blue book has me" (le livre bleu est à moi).

Pour l'instant, on va juste ignorer les balises <nom> et <acc> .

Noms

Les noms sont plus ou moins comme les adjectifs, à part que les noms en anglais sont infléchis en nombre, il est donc important de garder <sg> ou <pl> pour le nom :

  <rule>
     <pattern>
       <pattern-item n="c_nom"/>
     </pattern>
     <action>
       <out>
         <chunk name="nom" case="caseFirstWord">
           <tags>
             <tag><lit-tag v="SN"/></tag>
             <tag><clip pos="1" side="tl" part="a_nbr"/></tag>
           </tags>
           <lu>
             <clip pos="1" side="tl" part="lem"/>
             <clip pos="1" side="tl" part="a_nom"/>
             <clip pos="1" side="tl" part="a_nbr" link-to="2"/>
           </lu>
         </chunk>
       </out>
     </action>
  </rule>

Avant, pendant et après le transfert les noms ressemblent à

^libro<n><sg><nom>$
^nom<SN><sg>{^book<n><2>$}$
^book<n><sg>$

Support des multi-mots avec inflection interne

Ce qui précède fonctionne bien, mais malheureusement le monde n'est pas si simple : Quelquefois plusieurs mots dans une langue correspondent un mot dans une autre, et par conséquent on doit ajouter un twist(?) supplémentaire quand on affiche le fragment. Ne vous en faites pas si vous ne comprenez pas tout dans cette section, la conclusion est simple et vous pouvez l'utiliser même si vous ne suivez pas les arguments ici (qui a dit que j'ai compris moi-même ? ;-).

Par exemple en espéranto 'parlamentano' signifie 'membre du parlement', ce qui donne 'member of parliament' en anglais.

Donc, dans le eo.dix on a :

<e><p><l>parlamentano</l><r>parlamentano<s n="n"/><s n="m"/><s n="sg"/><s n="nom"/></r></p></e>

Dans le dictionnaire bilingue :

<e><p><l>parlamentano<s n="n"/><s n="m"/></l><r>member<g><b/>of<b/>parliament</g><s n="n"/></r></p></e>

Dans le en.dix on a :

<e><i>member</i><par n="house__n"/><p><l><b/>of<b/>parliament</l><r><g><b/>of<b/>parliament</g></r></p></e>

En utilisant la règle précédente sur les noms on obtient

parlamentano
^parlamentano<n><m><sg><nom>$
^nom<SN><sg>{^member# of parliament<n><2>$}$
^member# of parliament<n><sg>$
#member# of parliament

comparons ça avec un simple mot

libro
^libro<n><sg><nom>$
^nom<SN><sg>{^book<n><2>$}$
^book<n><sg>$
book

et vous allez peut-être voir (au moins si vous êtes plus intelligent que moi) que le problème est que c'est en fait me mot 'member' (membre) qui devrait être infléchi, pas le multi-mot dans sa totalité. Donc, on doit regarder la sortie pour le fragment du nom :

           <lu>
             <clip pos="1" side="tl" part="lem"/>
             <clip pos="1" side="tl" part="a_nom"/>
             <clip pos="1" side="tl" part="a_nbr" link-to="2"/>
           </lu>

La solution est de découper le lemme "member# of parliament" en deux parties, le mot de tête (lemh - member) et la fin composée des mots suivants (lemq - of parliament):

           <lu>
             <clip pos="1" side="tl" part="lemh"/>
             <clip pos="1" side="tl" part="a_nom"/>
             <clip pos="1" side="tl" part="a_nbr" link-to="2"/>
             <clip pos="1" side="tl" part="lemq"/>
           </lu>

Ce qui donne correctement.

parlamentano 
^parlamentano/parlamentano<n><m><sg><nom>$
^parlamentano<n><m><sg><nom>$
^nom<SN><sg>{^member<n><2># of parliament$}$
^member<n><sg># of parliament$
member of parliament

Règle de sauvetage pour les nuls

Oubliez tout ce qui précède et rappelez-vous juste :

  • écrivez part="lemh" au lieu de part="lem" quand vous affichez le lemme
  • ajoutez toujours un part="lemq" à la fin de toute unité lexicale que vous affichez.

MAUVAIS:

           <lu>
             <clip pos="1" side="tl" part="lem"/>
             ...
           </lu>

BON:

           <lu>
             <clip pos="1" side="tl" part="lemh"/>
             ...
             <clip pos="1" side="tl" part="lemq"/>
           </lu>

Groupement de plusieurs mots dans un fragment

Grouper plusieurs mots dans un fragment est étonnamment simple une fois que vous vous êtes fait la main avec la fragmentation des mots simples : Vous faites juste un modèle qui correspond à une séquence de catégories :

  <rule>
     <pattern>
       <pattern-item n="c_det"/>
       <pattern-item n="c_nom"/>
     </pattern>

maintenant, l'action devrait encore être d'afficher un simple fragment, mais cette fois on choisit de copier la balise nombre tag depuis le nom (clip pos="2"), bien sûr :

     <action>
       <out>
         <chunk name="det_nom" case="caseFirstWord">
           <tags>
             <tag><lit-tag v="SN"/></tag>
             <tag><clip pos="2" side="tl" part="a_nbr"/></tag>
           </tags>

at alors on affiche deux unités lexicales, la première copie depuis le lemme det, la seconde depuis le lemme noun :

           <lu>
             <clip pos="1" side="tl" part="lem"/>
             <clip pos="1" side="tl" part="a_det"/>
             <clip pos="1" side="sl" part="a_nbr" link-to="2"/>
           </lu>
           <b pos="1"/>
           <lu>
             <clip pos="2" side="tl" part="lem"/>
             <clip pos="2" side="tl" part="a_nom"/>
             <clip pos="2" side="sl" part="a_nbr" link-to="2"/>
           </lu>
         </chunk>
       </out>
     </action>
  </rule>

En faisant ça, la règle donne

la libro
^la<det><def><sp>$ ^libro<n><sg><nom>$
^det_nom<SN><sg>{^the<det><def><2>$ ^book<n><2>$}$
^the<det><def><sg>$ ^book<n><sg>$
the book

Fragment det_adj_nom

  <rule>
     <pattern>
       <pattern-item n="c_det"/>
       <pattern-item n="c_adj"/>
       <pattern-item n="c_nom"/>
     </pattern>
     <action>
       <out>
         <chunk name="det_adj_nom" case="caseFirstWord">
           <tags>
             <tag><lit-tag v="SN"/></tag>
             <tag><clip pos="3" side="tl" part="a_nbr"/></tag>
           </tags>
           <lu>
             <clip pos="1" side="tl" part="lem"/>
             <clip pos="1" side="tl" part="a_det"/>
             <clip pos="1" side="sl" part="a_nbr" link-to="2"/>
           </lu>
           <b pos="1"/>
           <lu>
             <clip pos="2" side="tl" part="lem"/>
             <clip pos="2" side="tl" part="a_adj"/>
           </lu>
           <b pos="2"/>
           <lu>
             <clip pos="3" side="tl" part="lem"/>
             <clip pos="3" side="tl" part="a_nom"/>
             <clip pos="3" side="sl" part="a_nbr" link-to="2"/>
           </lu>
         </chunk>
       </out>
     </action>
  </rule>

En faisant ça, la règle donne, sans surprise

la blua libro
^la<det><def><sp>$ ^blua<adj><sg><nom>$ ^libro<n><sg><nom>$
^det_adj_nom<SN><sg>{^the<det><def><2>$ ^blue<adj>$ ^book<n><2>$}$
^the<det><def><sg>$ ^blue<adj>$ ^book<n><sg>$
the blue book

Réordonner les mots/fragments

Maintenant que "La libro estas bona" -> "The book is good" fonctionne, regardons comment fonctionne la réorganisation des fragments. En espéranto vous transformez une phrase en question en mettant "Ĉu" au début de la phrase : "Ĉu la libro estas bona ?" (l'équivalent français de "est-ce que" En anglais le verbe doit être en premier : "Is the book good?".

À compléter à priori ...

Voir aussi