Création d'une nouvelle paire avec Matxin
Cette page prétend donner un cheminement pas à pas sur la manière de créer un nouveau traducteur avec la plate-forme Matxin.
Contents
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 dansapertium-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 :
- 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
- 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:
- Node specification: Defines which nodes to take information from, in this case
mi!=''
where the morphological information is non-null. - Source attribute: Which source attribute to copy, in this case the morphological information.
- 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. - Destination attribute: The attribute in which the information should be put.
- 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+]
).