Test de corpus

From Apertium
Revision as of 11:52, 7 October 2014 by Bech (talk | contribs) (Lien page anglaise)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

In English

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