Difference between revisions of "Test de corpus"

From Apertium
Jump to navigation Jump to search
(correction liens)
(réactualisation page)
Line 7: Line 7:
 
pour avoir une idée sur ce à quoi ça devrait ressembler:
 
pour avoir une idée sur ce à quoi ça devrait ressembler:
   
* Récupérez avec <code>grep</code> toutes les lignes avec # et @ - ça vous aidera à trouver des problèmes dans le bidix (@) et dans le monodix de la langue cible (#).
+
* Utilisez <code>grep</code> to pour supprimer toutes les lignes de corpus d'origine contenant <code>#</code> et <code>@</code> puisque ces symboles sont utilisés dans Apertium pour marquer les erreurs dans le dictionnaire bilingue et le transfert.
  +
** ex : <code>grep -v '[@#]' corpus-origine > corpus-propre</code>
* Rajouter avant/après (?) le grep le tube <code>nl -s</code> '. ' pour avoir les bons numéros de ligne.
 
   
  +
* Utilisez la commande <code>nl</code> ou <code>nl -s '. '</code> pour numéroter les lignes dans le corpus.
<u>Note du traducteur :</u> Ce morceau est peu clair, mais les instructions suivantes devraient faire l'affaire sur un ordinateur fonctionnant sous Linux :
 
  +
** ex : <code>nl corpus-propre > corpus-propre-numéroté</code>
   
  +
== Script testcorpus ==
fgrep -n "#" ''monodix''
 
fgrep -n "@" ''bidix''
 
   
== Installation et invocation ==
+
=== Installation et invocation ===
   
 
Copiez le fichier <code>testcorpus_en-eo.sh</code> de la paire apertium-eo-en et changez son nom.
 
Copiez le fichier <code>testcorpus_en-eo.sh</code> de la paire apertium-eo-en et changez son nom.
Line 21: Line 21:
 
Pour commencer, tapez <code>bash regression-tests.sh</code> depuis une fenêtre ou un terminal UNIX.
 
Pour commencer, tapez <code>bash regression-tests.sh</code> depuis une fenêtre ou un terminal UNIX.
   
== Sortie ==
+
=== Sortie ===
   
 
Des lignes contenant @ et # (indiquant un problème de .dix, dont beaucoup pourraient également être trouvés par la méthode de [[test de vocabulaire]]) seront affichées.
 
Des lignes contenant @ et # (indiquant un problème de .dix, dont beaucoup pourraient également être trouvés par la méthode de [[test de vocabulaire]]) seront affichées.
Line 39: Line 39:
 
</pre>
 
</pre>
   
== Pour faire pareil sans script ==
+
== Simple diff sur des corpus ==
   
 
Vous n'avez pas forcément besoin d'un script. Tapez juste :
 
Vous n'avez pas forcément besoin d'un script. Tapez juste :
Line 45: Line 45:
 
make && cat corpa/en.crp.txt | apertium -d . en-eo > traduction_origine.txt
 
make && cat corpa/en.crp.txt | apertium -d . en-eo > traduction_origine.txt
   
pour faire la 'traduction originale'. Ensuite modifiez vos .dixes, et lancez :
+
pour faire la 'traduction originale'. Ensuite modifiez vos .dix, et lancez :
   
 
make && cat corpa/en.crp.txt | apertium -d . en-eo > traduction_nouvelle.txt &
 
make && cat corpa/en.crp.txt | apertium -d . en-eo > traduction_nouvelle.txt &
Line 54: Line 54:
 
diff -w traduction_origine.txt traduction_nouvelle.txt | grep -r '[<>]' > /tmp/crpdiff.txt &&
 
diff -w traduction_origine.txt traduction_nouvelle.txt | grep -r '[<>]' > /tmp/crpdiff.txt &&
 
for i in `cut -c3-8 /tmp/crpdiff.txt | sort -un`; do
 
for i in `cut -c3-8 /tmp/crpdiff.txt | sort -un`; do
echo --- $i ---; grep -r "^ *$i\." corpa/en.crp.txt; grep -r "^. *$i\." /tmp/crpdiff.txt;
+
echo --- $i ---; grep -r &quot;^ *$i\.&quot; corpa/en.crp.txt; grep -r &quot;^. *$i\.&quot; /tmp/crpdiff.txt;
 
done | less
 
done | less
 
</pre>
 
</pre>
  +
  +
La première commande crée un simple diff, tandis que la boucle for va à chaque changement, et essaie de faire correspondre la ligne du corpus d'origine avec la ligne qui comporte le changement.
  +
  +
== Pour aller au delà : word diffs ==
  +
  +
[http://os.ghalkes.nl/dwdiff.html dwdiff] (<code>sudo apt-get install dwdiff</code> sur Ubuntu, <code>sudo pacman -S dwdiff</code> sur Arch Linux) est un programme qui utilise les entrées de diff et trouve les changements de mots. Donc au lieu de
  +
  +
<pre>
  +
1c1
  +
< Fruit flies enjoy a banana
  +
---
  +
> Fruit flies like a banana
  +
</pre>
  +
  +
vous obtenez
  +
  +
<pre>
  +
Fruit flies [-enjoy-] {+like+} a banana
  +
</pre>
  +
  +
Couplé avec une sortie en couleur (l'option -c, disponible sur les nouvelles versions), les grosse différences de corpus deviennent beaucoup plus lisibles.
  +
  +
S'il n'y a pas beaucoup de modifications, dwdiff continuera de lui même d'afficher les lignes inchangées. Comme il peut lire la sortie d'un diff dans le format "diff unifié", une des meilleures façons d'utiliser dwdiff dans ce cas est :
  +
  +
<pre>
  +
$ diff -U1 traduction_origine.txt traduction_nouvelle.txt | dwdiff -c --diff-input
  +
</pre>
  +
  +
Le <code>-U1</code> donne une sortie diff unifiée avec seulement une ligne de contexte avant et après le changement (essayez -U0, -U10, etc), alors que le <code>-c</code> vous assure d'avoir de belles couleurs, et <code>--diff-input</code> permet à dwdiff de lire depuis stdin plutôt que d'avoir besoin de 2 fichiers<ref>J'utilise ceci [https://gist.github.com/1564485 wrapper] qui positionne -c par défaut si affichage sur un terminal, et positionne --diff-input automatiquement si on lit un tube</ref>.
  +
  +
== Voir la forêt dans tous les arbres ==
  +
  +
La commande qui suit vous donnera un hit-parade (liste de fréquences) sur les changements de mots dans la sortie de traduction :
  +
  +
<pre>
  +
$ diff -U0 traduction_origine.txt traduction_nouvelle.txt | dwdiff --diff-input | grep -v '^@' |sed 's/.*\[-//' | sed 's/+}.*//' | sort | uniq -c | sort -n
  +
</pre>
  +
  +
Ainsi vous pouvez commencer avec les changements très fréquents en premier.
  +
  +
== Script d'aide : comparer pendant la traduction ==
  +
  +
Quand vous exécutez deux traductions de corpus en tâche de fond, vous voulez souvent les comparer pendant la traduction. Toutefois, vous obtiendrez un paquet de lignes supplémentaires à la fin de votre diff de la tache de traduction qui est allé le plus loin. Sauvez le script qui suit dans un fichier pour obtenir une différence limitée au plus petit des fichiers :
  +
  +
<pre>
  +
#!/bin/bash
  +
if [ $# -lt 2 ]; then echo "Utilisation : $0 fichier1 fichier2 [options additionnelles de diff]"; fi
  +
  +
M=$(calc 'min(' $(wc -l < "$1") ', ' $(wc -l < "$2") ')')
  +
  +
# ${@:3} signifie tous les arguments après le premier et le second
  +
diff ${@:3} <(head -n$M "$1") <(head -n$M "$2")
  +
</pre>
  +
  +
Appelez-le "mindiff" ou quelque-chose comme ça, et vous pourrez continuer en faisant
  +
  +
<code>mindiff traduction_origine.txt traduction_nouvelle.txt | tail</code>
  +
  +
pour chercher les nouvelles différences quand elles apparaîtront. Sinon vous pouvez faire
  +
  +
<pre>mindiff traduction_origine.txt traduction_nouvelle.txt -U0 | tail | dwdiff --diff-input</pre>
  +
  +
comme montré plus haut.
  +
  +
== Notes ==
  +
<references/>
   
 
[[Category:Development]]
 
[[Category:Development]]

Revision as of 16:49, 1 May 2012

Le test de corpus consiste à tester (par traduction) tout un corpus et à comparer le résultat à celui de la dernière fois que le corpus a été traduit. C'est très utile si vous voulez changer une règle ou un mot et obtenir une vue d'ensemble des conséquences sur le texte réel. Avec les tests de vocabulaire et les tests de régression c'est une bonne manière de vérifier que votre traducteur fonctionne, et que vos modifications ont rien de cassé.

Création d'un corpus

Avant que vous vous commenciez vous avez d'abord besoin d'un corpus. Regardez dans apertium-eo-en/corpa/enwiki.crp.txt.bz2 ? Lancez

bunzip2 -c enwiki.crp.txt.bz2 > en.crp.txt

pour avoir une idée sur ce à quoi ça devrait ressembler:

  • Utilisez grep to pour supprimer toutes les lignes de corpus d'origine contenant # et @ puisque ces symboles sont utilisés dans Apertium pour marquer les erreurs dans le dictionnaire bilingue et le transfert.
    • ex : grep -v '[@#]' corpus-origine > corpus-propre
  • Utilisez la commande nl ou nl -s '. ' pour numéroter les lignes dans le corpus.
    • ex : nl corpus-propre > corpus-propre-numéroté

Script testcorpus

Installation et invocation

Copiez le fichier testcorpus_en-eo.sh de la paire apertium-eo-en et changez son nom.

Pour commencer, tapez bash regression-tests.sh depuis une fenêtre ou un terminal UNIX.

Sortie

Des lignes contenant @ et # (indiquant un problème de .dix, dont beaucoup pourraient également être trouvés par la méthode de test de vocabulaire) seront affichées.

Mais plus important, dans testcorpus_en-eo.txt il y aura une liste de différences. D'abord un numéro de ligne, puis le texte d'origine, puis < et la traduction de la dernière fois, suivie d'une dernière ligne commençant par > et la traduction de cette fois-ci :

-- 1924 ---
  1924. In Japan there is an input system allowing you to type kanji.
<   1924.       En Japanio estas kontribuaĵan sistemon permesanta vi tajpi *kanji.
>   1924.       En Japanio estas kontribuaĵa sistemo permesanta vin tajpi *kanji.

--- 1937 ---
  1937. However, such apparent simplifications can perversely make a script more complicated.
<   1937.       Tamen, tiaj evidentaj simpligoj povas *perversely fari skribo pli komplika.
>   1937.       Tamen, tiaj evidentaj simpligoj povas *perversely fari skribon pli komplika.

Simple diff sur des corpus

Vous n'avez pas forcément besoin d'un script. Tapez juste :

 make && cat corpa/en.crp.txt | apertium -d . en-eo > traduction_origine.txt 

pour faire la 'traduction originale'. Ensuite modifiez vos .dix, et lancez :

 make && cat corpa/en.crp.txt | apertium -d . en-eo > traduction_nouvelle.txt &

Le signe & fera tourner le processus en tache de fond. Ça signifie que vous pouvez examiner les différences avant que toutes les phrases soient traduites, avec:

  diff -w traduction_origine.txt traduction_nouvelle.txt | grep -r '[<>]' > /tmp/crpdiff.txt && 
  for i in `cut -c3-8 /tmp/crpdiff.txt | sort -un`; do 
    echo  --- $i ---; grep -r "^ *$i\." corpa/en.crp.txt; grep -r "^. *$i\." /tmp/crpdiff.txt; 
  done | less

La première commande crée un simple diff, tandis que la boucle for va à chaque changement, et essaie de faire correspondre la ligne du corpus d'origine avec la ligne qui comporte le changement.

Pour aller au delà : word diffs

dwdiff (sudo apt-get install dwdiff sur Ubuntu, sudo pacman -S dwdiff sur Arch Linux) est un programme qui utilise les entrées de diff et trouve les changements de mots. Donc au lieu de

1c1
< Fruit flies enjoy a banana
---
> Fruit flies like a banana

vous obtenez

Fruit flies [-enjoy-] {+like+} a banana

Couplé avec une sortie en couleur (l'option -c, disponible sur les nouvelles versions), les grosse différences de corpus deviennent beaucoup plus lisibles.

S'il n'y a pas beaucoup de modifications, dwdiff continuera de lui même d'afficher les lignes inchangées. Comme il peut lire la sortie d'un diff dans le format "diff unifié", une des meilleures façons d'utiliser dwdiff dans ce cas est :

$ diff -U1 traduction_origine.txt traduction_nouvelle.txt | dwdiff -c --diff-input

Le -U1 donne une sortie diff unifiée avec seulement une ligne de contexte avant et après le changement (essayez -U0, -U10, etc), alors que le -c vous assure d'avoir de belles couleurs, et --diff-input permet à dwdiff de lire depuis stdin plutôt que d'avoir besoin de 2 fichiers[1].

Voir la forêt dans tous les arbres

La commande qui suit vous donnera un hit-parade (liste de fréquences) sur les changements de mots dans la sortie de traduction :

$ diff -U0 traduction_origine.txt traduction_nouvelle.txt | dwdiff --diff-input | grep -v '^@' |sed 's/.*\[-//' | sed 's/+}.*//' | sort | uniq -c | sort -n

Ainsi vous pouvez commencer avec les changements très fréquents en premier.

Script d'aide : comparer pendant la traduction

Quand vous exécutez deux traductions de corpus en tâche de fond, vous voulez souvent les comparer pendant la traduction. Toutefois, vous obtiendrez un paquet de lignes supplémentaires à la fin de votre diff de la tache de traduction qui est allé le plus loin. Sauvez le script qui suit dans un fichier pour obtenir une différence limitée au plus petit des fichiers :

#!/bin/bash
if [ $# -lt 2 ]; then echo "Utilisation : $0 fichier1 fichier2 [options additionnelles de diff]"; fi

M=$(calc 'min(' $(wc -l < "$1") ', ' $(wc -l < "$2") ')')

# ${@:3} signifie tous les arguments après le premier et le second
diff ${@:3} <(head -n$M "$1") <(head -n$M "$2") 

Appelez-le "mindiff" ou quelque-chose comme ça, et vous pourrez continuer en faisant

mindiff traduction_origine.txt traduction_nouvelle.txt | tail

pour chercher les nouvelles différences quand elles apparaîtront. Sinon vous pouvez faire

mindiff traduction_origine.txt traduction_nouvelle.txt -U0 | tail | dwdiff --diff-input

comme montré plus haut.

Notes

  1. J'utilise ceci wrapper qui positionne -c par défaut si affichage sur un terminal, et positionne --diff-input automatiquement si on lit un tube