Création d'une nouvelle paire avec Matxin

From Apertium
Revision as of 20:21, 1 September 2012 by Bech (talk | contribs) (Création page (début de traduction))
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Cette page prétend donner un cheminement pas à pas sur la manière de créer un nouveau traducteur avec la plate-forme Matxin.

Pré requis

Article principal : Matxin (français)

Cette page ne donne pas des instructions sur l'installation de Matxin, mais présume que les paquets suivants sont correctement installés.

et au choix :

  • Freeling (depuis SVN) et les outils fl-* pour Freeling (pour le moment ceux-ci peuvent être trouvés dans apertium-tools/freeling dans apertium SVN (lien non direct)), si vous prévoyez d'utiliser FreeLing pour les étapes d'analyse/tagging/dépendance

ou

  • vislcg3 (depuis SVN), si vous prévoyez d'utiliser lttoolbox/apertium-tagger et Constraint Grammar pour les étapes d'analyse/tagging/dépendance

Aperçu

Comme mentionné au début, cette page prétend donner un guide pas à pas pour créer une nouvelle paire de langues avec Matxin depuis le début. Aucune connaissance en programmation n'est requise, tout ce qu'on a besoin de définir est quelques dictionnaires et grammaires. La plate-forme Matxin est décrite en détail dans Documentation de Matxin (lien non direct ?) et sur la page Matxin de sourceforge. Cette page se concentrera seulement sur la création d'une nouvelle paire de langues, et évitera les problèmes théoriques et méthodologiques.

La paire de langue pour le tutoriel sera breton vers anglais. Elle a été choisie puisque les deux langues ont un ordre de mot assez divergent (le breton est assez libre, permettant VSO, OVS et SVO, là où l'anglais est assez uniformément SVO) ce qui peut montrer quelques avantages que Matxin a sur Apertium. La phrase que nous allons utiliser pour ce propos est :

Ur yezh indezeuropek eo ar brezhoneg.
[compl A language indo-european] [verb is] [subj the breton].
Breton is an Indo-European language.

Il y a deux problèmes principaux avec le transfert dans ce cas, le premier est de ré-ordonner, OVS → SVO, le second est d'enlever l'article défini précédant un nom de langue ar brezhoneg → Breton.

Pour commencer

Ce HOWTO suppose que l'utilisateur est familier avec les bases de la plate-forme Apertium, si ce n'est pas le cas, veuillez regarder les pages : Lttoolbox (français), Dictionnaire bilingue et Créer une nouvelle paire de langues.

Pour les étapes d'analyse/désambiguïsation/dépendance, il y a deux options principales ouvertes :

  1. utiliser l'outil Apertium lttoolbox pour la désambiguïsation morphologique, Constraint Grammar pour la désambiguïsation basée sur les règles et le marquage syntaxique, apertium-tagger (français) pour la désambiguïsation statistique et finalement Constraint Grammar pour l'analyse des dépendances
  2. utiliser FreeLing pour toutes ces étapes.

Typiquement le choix reposera sur quelles ressources sont disponibles, et les forces et faiblesses de chacun de ces outils.

Analyse avec Apertium et Constraint Grammar

(à écrire...)

Analyse avec FreeLing

Le processus d'analyse dans Matxin est fait par Freeling, une suite libre d'analyseurs de langues. L'analyse est faite en quatre étapes, nécessitant quatre (ou plus) ensembles ou fichiers séparés. Le premier est le dictionnaire morphologique, lequel est principalement une liste de formes complète (ex: Speling format (français)) compilée dans un format BerkeleyDB. Il y a ensuite des fichiers pour la désambiguïsation des catégories de mots et pour spécifier les règles de fragmentation et de dépendances. Il y a deux autres étapes qui viennent avant l'analyse morphologique, la tokenisation et le découpage des phrases, mais pour les propos de ce tutoriel elles seront considérées le long de l'analyse morphologique.

Normalement un programme unique est utilisé pour faire toutes les différentes étapes d'analyses, prendre en entrée du texte brut ou déformatté, et envoyer en sortie une analyse de dépendances, le comportement de ce programme est contrôlé par un fichier appelé config.cfg. Dans Matxin ce programme s'appelle Analyzer, toutefois dans les étapes suivantes, on va utiliser des outils séparés et laisser créer le fichier config jusqu'à la dernière minute comme il peut devenir compliqué.

Comme compagnon la lecture de cette section de la documentation Freeling est hautement recommandée. Ce tutoriel saute des caractéristiques de Freeling qui ne sont pas nécessaires pour faire un système de traduction automatique de base avec Matxin, et notez qu'il est également possible d'utiliser d'autres analyseurs comme entrée dans les parties fragmentation / dépendance analyse de Freeling, pour plus d'information voir ici.

Morphologique

Afin de créer votre analyseur morphologique dans Freeling vous avez besoin principalement de faire une liste de formes complète. S'il y a déjà un dictionnaire Apertium pour la langue, vous pouvez utiliser les scripts dans apertium SVN (module apertium-tools/freeling) pour générer un dictionnaire depuis le début, sinon, construisez-la quand même depuis le début, ou construisez un dictionnaire dans lttoolbox et ensuite générez la liste.

Pour le but de cet exercice, vous pouvez juste taper (??) dans un petit dictionnaire à la main. On appellera le dictionnaire matxin-br-en.br.dicc, et il contiendra

ul un DI0CN0 
un un DI0CN0 
ur un DI0CN0 
yezhoù yezh NCFPV0 
yezh yezh NCFSV0 yezh AQ0CN0
indezeuropek indezeuropek AQ0CN0 
eo bezañ VMIP3S0 
al an DA0CN0 
ar an DA0CN0 
an an DA0CN0
brezhoneg brezhoneg NCMSV0 
prezhoneg brezhoneg NCMSV0 
vrezhoneg brezhoneg NCMSV0 
. . Fp

Le fichier est séparé par des espaces avec trois colonnes ou plus. La première est pour le forme de surface du mot, les colonnes suivantes sont pour une liste de lemmes et de balises de mots.

Après avoir keyed (??) ceci, on peut le compiler au format BerkeleyDB en utilisant l'outil indexdict des utilitaires Freeling. Il est bon de noter que Freeling supporte seulement actuellement l'encodage latin1 des caractères, donc si vous travaillez en UTF-8, convertissez le dictionnaire à latin1 d'abord.

$ cat matxin-br-en.br.dicc | iconv -f utf-8 -t latin1 | indexdict br-en.br.db

Maintenant vous devriez avoir deux fichiers, matxin-br-en.br.dicc, qui est le dictionnaire source, et br-en.br.db qui est le dictionnaire dans le format BerkeleyDB. On ne peut toutefois pas utiliser cet analyseur sans spécifier un tokeniseur et un splitter. Ces fichiers définissent comment les mots et les phrases seront tokenisées. Pour l'instant on va utiliser un fichier de configuration minimal pour le splitter, donc écrire ce qui suit dans le fichier matxin-br-en.spt.dat

<SentenceEnd>
. 0
</SentenceEnd>

Bien sûr, d'autre ponctuation de fin de phrase comme '?' et '!' pourrait aussi être ajouté ici. Et maintenant pour le tokeniseur de mot, on va écrire dans matxin-br-en.tok.dat

<Macros>
ALPHANUM   [^\]<>[(\.,";:?!'`)^@~|}{_/\\+=&$#*+%\s\-]
OTHERS     [\]<>[(\.,";:?!'`)^@~|}{_/\\+=&$#*+%\-]
</Macros>
<RegExps>
WORD             0  {ALPHANUM}+
OTHERS_C         0  {OTHERS}+
</RegExps>

Les macros définissent des expressions régulières qui sont utilisées pour tokeniser l'entrée en mots et ponctuation. L'expression régulière WORD est définie comme une séquence d'un ALPHANUM ou plus qui à son tour est défini comme n'importe quoi sauf un caractère de ponctuation.

Donc maintenant si on veut analyser morphologiquement une phrase, nous faisons juste :

$ echo "Ur yezh eo ar brezhoneg." | fl-morph matxin-br-en.tok.dat matxin-br-en.spt.dat br-en.br.db  | iconv -f latin1
Ur un DI0CN0 -1   -1
yezh yezh NCFSV0 -1 yezh AQ0CN0 -1
eo bezañ VMIP3S0 -1   -1
ar an DA0CN0 -1   -1
brezhoneg brezhoneg NCMSV0 -1   -1
. . Fp -1

Le -1 après chaque analyse est la probabilité a priori de l'analyse et est calculé à partir d'un corpus balisé au préalable. Comme on n'a pas de corpus balisé au préalable, ceci est désactivé.

Désambiguïsation des catégories

Après avoir travaillé sur l'analyse morphologique, l'étape suivante est de créer un tagger de parties de discours. Freeling offre diverses façons de le faire, celles basées HMM et celles basées Relax Constraint Grammar (RelaxCG) sont toutes deux supportées. On va démontrer comment créer un tagger RelaxCG puisque c'est plus facile et que ça ne requiert pas d'entraînement de tagger.

Notre tagger sera très simple puisqu'on a seulement une ambiguïté, yezh 'langue' peut être un nom ou un adjectif. Comme les adjectifs se mettent après le nom en Breton, on va mettre un très faible poids pour les adjectifs après les déterminants,

SETS

CONSTRAINTS

%% après un déterminant faible poids pour l'adjectif
-8.0 AQ*  (-1 D*);

Le fichier (qu'on appellera matxin-br-en.br.relax est fait de deux sections, la première SETS définit les ensembles de balises ou lemmes, vraiment (?) comme les taggers LIST et SET dans VISL Constraint Grammar. La deuxième section définit une série de contraintes de poids, dans le format 'poids', suivi par un espace, suivi par la balise suivi par un autre espace and et ensuite le contexte. Le contexte est défini comme une série de positions relatives à la balise en question.

Donc, en utilisant ce fichier on devrait être capables d'obtenir une sortie désambiguïsée :

$ echo "Ur yezh eo ar brezhoneg." | fl-morph matxin-br-en.tok.dat matxin-br-en.spt.dat br-en.br.db  | \
    fl-tagger matxin-br-en.br.relax | iconv -f latin1
Ur un DI0CN0 -1
yezh yezh NCFSV0 -1
eo bezañ VMIP3S0 -1
ar an DA0CN0 -1
brezhoneg brezhoneg NCMSV0 -1
. . Fp -1

Fragmentation

Donc, après le balisage la prochaine étape est l'analyse du fragment. C'est un peu comme la fragmentation disponible dans Apertium (voir Fragmentation), toutefois aucun transfert n'est réalisé, on groupe juste des mots dans des fragments. La grammaire est assez familière, le côté gauche montre le non-terminal, et le côté droit peut être aussi bien un terminal (dans le cas d'une balise, ex: NCM*) ou un non-terminal (dans le cas de n-m). Cette grammaire extrêmement simple va fragmenter l'entrée balisée en constituants (groupe nominal sn et verb-eo) pour une utilisation ultérieure par l'analyseur de dépendance. Ça devrait être assez direct, | est une opération ou, et + marque le gouverneur (??), ou la tête du fragment. La fin de chaque règle est marqué avec un point . et les commentaires ils sont placés avec %.

n-m ==> NCM* .
n-f ==> NCF* .

adj ==> AQ* .

def ==> DA0CN0 .
indef ==> DI0CN0 .

verb-eo ==> VMIP3S0(eo).  %% Un type de fragment spécifique pour la forme 'eo' de bezañ
verb ==> VL* .

punt ==> Fp .

sn ==> def, +n-f, adj | def, +n-f | +n-f, adj | +n-f .
sn ==> def, +n-m, adj | def, +n-m | +n-m, adj | +n-m .
sn ==> indef, +n-m, adj | indef, +n-m | +n-m, adj | +n-m .
sn ==> indef, +n-f, adj | indef, +n-f | +n-f, adj | +n-f .

@START S.

La directive @START indique que le noeud de début de la phrase devrait être étiqueté S. Donc, la sortie de cette grammaire sera :

$ echo "Ur yezh indezeuropek eo ar brezhoneg." | fl-morph matxin-br-en.tok.dat matxin-br-en.spt.dat br-en.br.db  | \
 fl-tagger matxin-br-en.br.relax  | fl-chunker matxin-br-en.br.gram | iconv -f latin1
S_[
  sn_[
    indef_[
      +(Ur un DI0CN0)
    ]
    +n-f_[
      +(yezh yezh NCFSV0)
    ]
    adj_[
      +(indezeuropek indezeuropek AQ0CN0)
    ]
  ]
  verb-eo_[
    +(eo bezañ VMIP3S0)
  ]
  sn_[
    def_[
      +(ar an DA0CN0)
    ]
    +n-m_[
      +(brezhoneg brezhoneg NCMSV0)
    ]
  ]
  punt_[
    +(. . Fp)
  ]
]

Notez que la phrase est fragmentée en sn verb-eo sn. Ça peut valoir la peine de jouer un peu avec la grammaire pour obtenir un meilleur ressenti pour ça.

Analyse des dépendances

La prochaine étape est de créer une grammaire de dépendance. La grammaire de dépendance décrit et étiquette les dépendances entre constituants. Elle est constituée de deux sections principales, <GRPAR> qui arrange l'analyse fournie par le fragmenteur. Dans l'exemple, le verbe est déplacé au début de la phrase, avant le complément, et <GRLAB> qui étiquette les parties de l'analyse.

Notez qu'en breton, les phrases avec eo (une forme de bezañ 'être') a toujours la structure Objet—Verbe—Sujet, et donc nécessite une attention spéciale. Ainsi on étiquette le côté gauche comme le prédicat complément et le côté droit comme le sujet.

<GRPAR>

1 - - (sn,verb-eo) top_right RELABEL -  % (Ur yezh keltiek (eo))

</GRPAR>

<GRLAB>

verb-eo attr-pred d.label=sn d.side=left p.label=verb-eo %% Étiquette dépendant de la gauche du verb-eo comme attr-pred
verb-eo ncsubj d.label=sn d.side=right p.label=verb-eo %% Étiquette dépendant de la droite du verb-eo comme ncsubj

</GRLAB>

Dans la grammaire ci-dessus, d.side indique le côté du dépendant, et p.label indique l'étiquette du parent. Ce fichier est documenté de manière compréhensible dans la section Dependency parser rule file dans la documentation Freeling.

On va mettre le fichier dans matxin-br-en.br.dep, et la sortie résultante de l'analyse est :

$ echo "Ur yezh indezeuropek eo ar brezhoneg." | fl-morph matxin-br-en.tok.dat matxin-br-en.spt.dat br-en.br.db  | \
    fl-tagger matxin-br-en.br.relax | fl-parser matxin-br-en.br.gram matxin-br-en.br.dep | iconv -f latin1
verb-eo/top/(eo bezañ VMIP3S0) [
  sn/attr-pred/(yezh yezh NCFSV0) [
    indef/modnorule/(Ur un DI0CN0)
    adj/modnorule/(indezeuropek indezeuropek AQ0CN0)
  ]
  sn/ncsubj/(brezhoneg brezhoneg NCMSV0) [
    def/modnorule/(ar an DA0CN0)
  ]
  punt/modnomatch/(. . Fp)
]

Fichier de configuration

Donc maintenant nous avons une étape d'analyse qui fonctionne plus ou moins bien, il nous faut obtenir cette analyse dans une forme que peut être utilisé par Matxin. Ceci impliquera d'écrire un fichier de configuration qui spécifie tous les modules qu'on a utilisé auparavant (?) à un endroit. Ci dessous voici un fichier de configuration minimal pour les modules que nous avons utilisé ci-dessus. Toutes les options sont obligatoires, si une est omise, des messages d'error critiques peuvent se produire, donc le mieux est juste de copier et coller ceci, changer les chemins et ensuite y ajouter as we go along (???).

#### Langue
Lang=br

## Les formats d'entrée/sortie valides sont : plain, token, splitted, morfo, tagged, parsed
InputFormat=plain
OutputFormat=dep

# Considérer chaque passage à la ligne comme une fin de phrase
AlwaysFlush=no

# Options tokeniser
TokenizerFile="/home/fran/MATXIN/source/matxin-br-en/matxin-br-en.tok.dat"

# Options splitter (découpeur)
SplitterFile="/home/fran/MATXIN/source/matxin-br-en/matxin-br-en.spt.dat"

# Options d'analyse morphologique
SuffixFile=""
SuffixAnalysis=no
MultiwordsDetection=no
LocutionsFile=""
DecimalPoint="."
ThousandPoint=","
QuantitiesFile=""
NumbersDetection=no
PunctuationDetection=no
PunctuationFile=""
DatesDetection=no
QuantitiesDetection=no
DictionarySearch=yes
DictionaryFile=/home/fran/MATXIN/source/matxin-br-en/br-en.br.db
ProbabilityAssignment=no
ProbabilityFile=""

# Options NER
NERecognition=none
NPDataFile=""

# Options Tagger
Tagger=relax
TaggerRelaxFile=/home/fran/MATXIN/source/matxin-br-en/matxin-br-en.br.relax
TaggerRelaxMaxIter=500
TaggerRelaxScaleFactor=670.0
TaggerRelaxEpsilon=0.001
TaggerRetokenize=no
TaggerForceSelect=tagger

# Options Parser
GrammarFile=/home/fran/MATXIN/source/matxin-br-en/matxin-br-en.br.gram

# Options dépendence parser
DepParser=txala
DepTxalaFile=/home/fran/MATXIN/source/matxin-br-en/matxin-br-en.br.dep

Quand on a installé le fichier de configuration on peur utiliser le programme Analyzer du paquet Matxin. La sortie finale de Analyzer sera :

$ echo "Ur yezh indezeuropek eo ar brezhoneg." | Analyzer -f matxin-br-en.br-en.cfg  | iconv -f latin1

<?xml version='1.0' encoding='UTF-8' ?>
<corpus>
<SENTENCE ord='1' alloc='0'>
<CHUNK ord='2' alloc='21' type='verb-eo' si='top'>
  <NODE ord='4' alloc='21' form='eo' lem='bezañ' mi='VMIP3S0'>
  </NODE>
  <CHUNK ord='1' alloc='0' type='sn' si='attr-pred'>
    <NODE ord='2' alloc='3' form='yezh' lem='yezh' mi='NCFSV0'>
      <NODE ord='1' alloc='0' form='Ur' lem='un' mi='DI0CN0'>
      </NODE>
      <NODE ord='3' alloc='8' form='indezeuropek' lem='indezeuropek' mi='AQ0CN0'>
      </NODE>
    </NODE>
  </CHUNK>
  <CHUNK ord='3' alloc='24' type='sn' si='ncsubj'>
    <NODE ord='6' alloc='27' form='brezhoneg' lem='brezhoneg' mi='NCMSV0'>
      <NODE ord='5' alloc='24' form='ar' lem='an' mi='DA0CN0'>
      </NODE>
    </NODE>
  </CHUNK>
  <CHUNK ord='4' alloc='36' type='punt' si='modnomatch'>
    <NODE ord='7' alloc='36' form='.' lem='.' mi='Fp'>
    </NODE>
  </CHUNK>
</CHUNK>
</SENTENCE>
</corpus>

ce qui est une représentation XML (voir Documentation of Matxin) de l'analyse des dépendances qu'on a vu précédemment.

Transfert

Transfert lexical

La prochaine étape dans le processus est le transfert lexical, il prend les formes lexicales de la langue source et retourne les formes lexicales de la langue cible. Il y a trois fichiers impliqués dans le transfert lexical :

  • Le dictionnaire bilingue (matxin-br-en.br-en.dix), qui utilise le familier format de dictionnaire lttoolbox, bien que légèrement différent comme résultat des balises de parole
  • Le dictionnaire de sémantique des noms (matxin-br-en.br.sem_info), un fichier avec des tabulations comme séparateur
  • Le dictionnaire de type de fragment (matxin-br-en.br.chunk_type), un fichier avec des tabulations comme séparateur

Le module qui réalise le transfert lexical s'appelle LT, et le format des dictionnaires décrit ci-dessus sera expliqué en bas.

Dictionnaire bilingue

Le format de base du dictionnaire bilingue est le même que dans Apertium,

<dictionary>
  <alphabet/>
  <sdefs>
    <sdef n="mi"     c="Information morphologique"/>
    <sdef n="parol"  c="style de balise PAROLE"/>
  </sdefs>
  <section id="main" type="standard">

  </section>
</dictionary>

Contrairement à Apertium où les symboles sont utilisés pour supporter l'information morphologique (ex: <sdef n="adj"/> et pour les adjectifs), dans Matxin les symboles sont utilisés pour définir les attributs de l'élément noeud. Par exemple, fabrique un attribut dans le noeud appelé parol avec la valeur des balises qui suivent. Les balises suivantes sont habituellement entourées de crochets [].

Donc, pour transférer la balise de parole d'un nom féminin singulier (NCFSV0) en Breton dans la représentation appropriée en anglais pour le reste des étapes de transfert, ex: nom singulier sans genre parol="NC" mi="[NUMS]" , on peut utiliser l'entrée suivante dans le dictionnaire bilingue :

      <e><p><l>yezh<s n="parol"/>NCFSV0</l><r>language<s n="parol"/>NC<s n="mi"/>[NUMS]</r></p></e>

ce qui donnera en sortie

      <NODE ref="2" alloc="3" UpCase="none" lem="language" parol="NC" mi="[NUMS]">

par le module de transfert lexical. Comme ces modèles sont répétés fréquemment, typiquement ils sont mis dans des paradigmes, mais au lieu d'être des paradigmes morphologiques, comme dans Apertium, ce sont des paradigmes de transfert lexical, donc par exemple pour les noms on peur avoir :

    <pardef n="NC_STD">
      <e><p><l><s n="parol"/>NCFSV0</l><r><s n="parol"/>NC<s n="mi"/>[NUMS]</r></p></e>
      <e><p><l><s n="parol"/>NCFPV0</l><r><s n="parol"/>NC<s n="mi"/>[NUMP]</r></p></e>
      <e><p><l><s n="parol"/>NCMSV0</l><r><s n="parol"/>NC<s n="mi"/>[NUMS]</r></p></e>
      <e><p><l><s n="parol"/>NCMPV0</l><r><s n="parol"/>NC<s n="mi"/>[NUMP]</r></p></e>
    </pardef>

Transferring both feminine and masculine singular and plural nouns in Breton to their English equivalents. The corresponding entries for our two nouns in the main section would be,

    <e><p><l>yezh</l><r>language</r></p><par n="NC_STD"/></e>
    <e><p><l>brezhoneg</l><r>Breton</r></p><par n="NC_STD"/></e>

Using the information for nouns and the XML generated after lexical transfer below you should be able to create a full dictionnaire bilingue for our test phrase.

Noun semantic dictionary

The noun semantic dictionary is a simple file which allows basic semantic tagging of lemmas. The works somewhat like lists in Apertium transfer files, and allows the categorisation of nouns into semantic classes, for example language, animacy, material, communication medium etc. The file is a tab separated list of lemma and semantic tag, for example for our phrase we might want to tag brezhoneg 'Breton' as [HZK] (an abbreviation of hizkuntzak 'languages').

So make the file matxin-br-en.br.sem_info with the following contents:

##[HZK]: Languages / Yezhoù (hizkuntzak)

brezhoneg [HZK+]

You can add other languages such as euskareg 'Basque' and kembraeg 'Welsh'. The symbol + means that this feature is positive, the feature can also be followed by - for negative or ? for uncertain. The lexical transfer module doesn't seem to use this information directly, but it needs the file to be in place.

Chunk-type transfer dictionary

The final dictionary required for the lexical transfer stage is the chunk-type transfer dictionary. This transfers chunk types (e.g. sn sintagma nominal 'Noun phrase' and sp sintagma preposicional 'Prepositional phrase') into the target language chunk types. As we maintain the same chunk types between languages we can just have an empty file for this. Although it is probably worth adding a comment with the format, for example make a file called matxin-br-en.br-en.chunk_type with the following contents,

#Category (SL)	#Category (TL)	#Description (SL)	#Description (TL)
sn	        sn	        #Noun phrase             Noun phrase

Fichier de configuration

Now we come to editting the configuration file, we open the file, add the following options at the bottom of the file and save it.

# Transfer options 

TransDictFile=/home/fran/MATXIN/source/matxin-br-en/br-en.autobil.bin
ChunkTypeDict=/home/fran/MATXIN/source/matxin-br-en/matxin-br-en.br-en.chunk_type
NounSemFile=/home/fran/MATXIN/source/matxin-br-en/matxin-br-en.br.sem_info

Output of lexical transfer

$ echo "Ur yezh indezeuropek eo ar brezhoneg." | Analyzer -f matxin-br-en.br-en.cfg  | iconv -f latin1 | \ 
    LT -f matxin-br-en.br-en.cfg

<?xml version="1.0" encoding="UTF-8"?>
<corpus>
  <SENTENCE ref="1" alloc="0">
    <CHUNK ref="2" type="verb-eo" alloc="21" si="top">
      <NODE ref="4" alloc="21" slem="bezañ" smi="VMIP3S0" UpCase="none" lem="be" parol="VM" mi="[IND][PRES][P3][NUMS]"/>
      <CHUNK ref="1" type="sn" alloc="0" si="attr-pred">
        <NODE ref="2" alloc="3" slem="yezh" smi="NCFSV0" UpCase="none" lem="language" parol="NC" mi="[NUMS]">
          <NODE ref="1" alloc="0" slem="un" smi="DI0CN0" UpCase="none" lem="a" parol="DI"/>
          <NODE ref="3" alloc="8" slem="indezeuropek" smi="AQ0CN0" UpCase="none" lem="Indo-European" parol="AQ" mi="[PST]"/>
        </NODE>
      </CHUNK>
      <CHUNK ref="3" type="sn" alloc="24" si="ncsubj">
        <NODE ref="6" alloc="27" slem="brezhoneg" smi="NCMSV0" UpCase="none" lem="Breton" parol="NC" mi="[NUMS]">
          <NODE ref="5" alloc="24" slem="an" smi="DA0CN0" UpCase="none" lem="the" parol="DA"/>
        </NODE>
      </CHUNK>
      <CHUNK ref="4" type="punt" alloc="36" si="modnomatch">
        <NODE ref="7" alloc="36" slem="." smi="Fp" UpCase="none" lem="." parol="Fp"/>
      </CHUNK>
    </CHUNK>
  </SENTENCE>
</corpus>

Note: The above output has been post-processed by xmllint --format - to give more human readable formatting.

Intra-chunk transfer

The purpose of the intra-chunk transfer is to move information from nodes in a chunk to the chunk, for example to do concordance between a subject noun phrase and the verb in a verb phrase. We're just going to copy the morphological information straight over, so make a file called matxin-br-en.br-en.intra1 and put the following in.

#    1/2     3/4      5
mi!=''/mi	/mi	no-overwrite

The file is tab and forward-slash separated and has five columns:

  1. Node specification: Defines which nodes to take information from, in this case mi!='' where the morphological information is non-null.
  2. Source attribute: Which source attribute to copy, in this case the morphological information.
  3. Chunk condition: Restricts the chunk to which the information can be moved. In this case there is no restriction, but for example, you might want to only move the information when the subject is a common noun, in which case si='ncsubj' would do the trick.
  4. Destination attribute: The attribute in which the information should be put.
  5. Write mode: Can be one of three, either no-overwrite (do not overwrite previous information), overwrite (overwrite previous information), concat (concatenate information to any previously existing).

After you've made the file, add the details to the bottom of the configuration file as follows,

IntraMoveFile=/home/fran/MATXIN/source/matxin-br-en/matxin-br-en.br-en.intra1

After this has been added, we're ready to run the intra-chunk syntactic transfer module. This is done with the ST_intra program, which can be called as follows:

$ echo "Ur yezh indezeuropek eo ar brezhoneg." | Analyzer -f matxin-br-en.br-en.cfg  | iconv -f latin1 | LT -f matxin-br-en.br-en.cfg \
    ST_intra -f matxin-br-en.br-en.cfg

<?xml version="1.0" encoding="UTF-8"?>
<corpus>
  <SENTENCE ref="1" alloc="0">
    <CHUNK ref="2" type="verb-eo" alloc="21" si="top" mi="[IND][PRES][P3][NUMS]">
      <NODE ref="4" alloc="21" UpCase="none" lem="be" parol="VM" mi="[IND][PRES][P3][NUMS]" />
      <CHUNK ref="1" type="sn" alloc="0" si="attr-pred" mi="[NUMS]">
        <NODE ref="2" alloc="3" UpCase="none" lem="language" parol="NC" mi="[NUMS]">
          <NODE ref="1" alloc="0" UpCase="none" lem="a" parol="DI"/>
          <NODE ref="3" alloc="8" UpCase="none" lem="Indo-European" parol="AQ" mi="[PST]"/>
        </NODE>
      </CHUNK>
      <CHUNK ref="3" type="sn" alloc="24" si="ncsubj" mi="[NUMS]">
        <NODE ref="6" alloc="27" UpCase="none" lem="Breton" parol="NC" mi="[NUMS]">
          <NODE ref="5" alloc="24" UpCase="none" lem="the" parol="DA"/>
        </NODE>
      </CHUNK>
      <CHUNK ref="4" type="punt" alloc="36" si="modnomatch">
        <NODE ref="7" alloc="36" UpCase="none" lem="." parol="Fp"/>
      </CHUNK>
    </CHUNK>
  </SENTENCE>
</corpus>

The morphological information has been moved from the node head of the chunk to the chunk itself.

Inter-chunk transfer

The next stage is similar to the previous stage, but deals with movement between chunks themselves. In our example we don't need to use this.

Generation

Intra-chunk

As Breton and English differ in the internal structure of noun phrases, the next thing we want to do is transfer the Breton structure into English, this will involve changing det nom adj to det adj nom. Another intra-chunk process we want to take care of is the removal of the definite article before a noun which has the semantic tag for language ([HZK+]).