Test de vocabulaire

From Apertium
Revision as of 21:48, 25 November 2011 by Bech (talk | contribs) (moved Test+de+vocabulaire to Test de vocabulaire: Problème récurent lorsqu'on crée une page en ayant été déconnecté)
Jump to navigation Jump to search

Un testvoc est littéralement un test de vocabulaire. Au niveau le plus basique, il étend (?) juste un dictionnaire sl, et fait passer chaque forme lexicale éventuellement analysée à travers toutes les étapes de traduction pour voir si pour chaque entrée possible, une traduction sensible (?) dans le tl, sans symboles #, ou @ est générée.

Toutefois, comme les règles de transfert peuvent introduire des erreurs qui ne sont pas visibles lorsqu'on traduit de simples unités lexicales, une paire de langues de qualité release nécessite aussi des tests de vocabulaire sur des phrases constituées de plusieurs unités lexicales. Souvent on peut trouver beaucoup d'erreurs en donnant un grand corpus (avec tous les symboles @, / ou # supprimés) au traducteur, avec les symboles de debug activés, et un grep sur [@#/].

Ce serait bien toutefois, avec un script qui teste le fonctionnement de toutes les règles de transfert possibles (sans avoir à travailler sur toutes les combinaisons d'unités lexicales possible, ce qui prendrait une éternité). Un des problèmes est que les règles de transfert peuvent ne pas se référer seulement aux balises, mais aussi aux lemmes; et que le transfert en plusieurs étapes suppose que vous avez à tester des séquences assez longues.

Scripts d'exemple pour le testvoc d'unités lexicales simples

Ce qui suit est un script très simple illustrant testvoc pour la première étape du transfert. La commande tee sauvegarde la sortie du transfert, qui inclue les mots (actuellement des unités lexicales) qui ont passé le transfert avec succès et des mots qui ont récupéré un @ en préfixe. Le dernier fichier est la sortie de la génération, qui inclue les mots qui ont été générés avec succès, et les mots qui ont un # en préfixe (n'importe quoi avec un @ obtiendra aussi un #):

MONODIX=apertium-nn-nb.nn.dix
T1X=apertium-nn-nb.nn-nb.t1x
BIDIXBIN=nn-nb.autobil.bin
GENERATORBIN=nn-nb.autogen.bin
ALPHABET="ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅabcdefghijklmnopqrstuvwxyzæøåcqwxzCQWXZéèêóòâôÉÊÈÓÔÒÂáàÁÀäÄöÖ" # from $MONODIX

lt-expand ${MONODIX} | grep -e ':<:' -e '[$ALPHABET]:[$ALPHABET]' |\
sed 's/:<:/%/g' | sed 's/:/%/g' | cut -f2 -d'%' |  sed 's/^/^/g' | sed 's/$/$ ^.<sent><clb>$/g' |\
apertium-transfer ${T1X} ${T1X}.bin ${BIDIXBIN} | tee after-transfer.txt |\
lt-proc ${GENERATORBIN} > after-generation.txt

Ce qui suit est un vrai script inconsistency.sh provenant de apertium-br-fr qui étend le dictionnaire de Breton et le passe au traducteur:

TMPDIR=/tmp

lt-expand ../apertium-br-fr.br.dix | grep -v '<prn><enc>' | grep -e ':<:' -e '\w:\w' |\
 sed 's/:<:/%/g' | sed 's/:/%/g' | cut -f2 -d'%' |  sed 's/^/^/g' | sed 's/$/$ ^.<sent>$/g' |\
 tee $TMPDIR/tmp_testvoc1.txt |\
        apertium-pretransfer|\
        apertium-transfer ../apertium-br-fr.br-fr.t1x  ../br-fr.t1x.bin  ../br-fr.autobil.bin |\
        apertium-interchunk ../apertium-br-fr.br-fr.t2x  ../br-fr.t2x.bin |\
        apertium-postchunk ../apertium-br-fr.br-fr.t3x  ../br-fr.t3x.bin  |\
        tee $TMPDIR/tmp_testvoc2.txt |\
        lt-proc -d ../br-fr.autogen.bin > $TMPDIR/tmp_testvoc3.txt

paste -d _ $TMPDIR/tmp_testvoc1.txt $TMPDIR/tmp_testvoc2.txt $TMPDIR/tmp_testvoc3.txt |\
 sed 's/\^.<sent>\$//g' | sed 's/_/   --------->  /g'


Testvoc d'un corpus

Typiquement le testvoc de corpus consiste à faire traiter un grand corpus par votre traducteur, et à récupérer avec grep les @ ou les #.

Cependant, quelquefois vous voulez récupérer la ligne d'origine du corpus qui a donné ce @ ou ce #.

Voici une façon de chercher les @ dans un corpus tout en étant encore capable de retrouver facilement la ligne d'origine :

$ cat corpus.txt | apertium-destxt | nl | apertium -f none -d . sme-nob-interchunk1 |grep '\^@' 

nl va numéroter chaque ligne de corpus.txt, dans le superblank (?) qui est à la fin de chaque ligne. Ainsi on va voir

   276  ]^part<part>{^å<part>$}$  ^verb<SV><inf><loc-for><m>{^@ballat<V><inf>$}$
...

on peut récupérer la ligne d'origine comme ceci :

$ head -n 276 corpus.txt | tail -n1