Calculer la couverture

From Apertium
Jump to navigation Jump to search

In English

Notes sur le calcul de la couverture à partir de dumps wikipédia (basé sur la page Asturian#Calculating coverage).

(La commande 'sed' de Mac OS X ne permet pas les remplacements de \n , donc on utilise un vrai passage à la ligne précédée d'un \ )

wikicat.sh:

#!/bin/sh
# Nettoyer le texte wiki pour l'utiliser via apertium-destxt

# awk affiche des lignes complètes, s'assurer que chaque élément html en possède une
bzcat "$@" | sed 's/>/>\
/g' | sed 's/</\
</g' |\
# on veut seulement ce qu'il y a entre <text...> et </text>
awk '
/<text.*>/,/<\/text>/ { print $0 }
' |\
sed 's/\./ /g' |\
# supprimer tous les liens transwiki
sed 's/\[\[\([a-z]\{2,3\}\|bat-smg\|be-x-old\|cbk-zam\|fiu-vro\|map-bms\|nds-nl\|roa-rup\|roa-tara\|simple\|zh-classical\|zh-min-nan\|zh-yue\):[^]]\+\]\]//g' |\
# balise wiki, garder bar et fie de [[foo|bar]] [[fie]]
sed 's/\[\[[^]|]*|//g' | sed 's/\]\]//g' | sed 's/\[\[//g' |\
# balise wiki, garder `bar fie' de [http://foo bar fie] et enlever [http://foo]
sed 's/\[http[^ ]*\([^]]*\)\]/\1/g' |\
# enlever les entités
sed 's/&[^;]*;/ /g' |\
# et mettre des espaces autour de la ponctuation
sed 's/[;:?,]/ /g' |\
# Garder seulement les lignes commençant par une lettre capitale, enlever les tables avec des informations de style etc.
grep '^[ 	]*[A-ZÆØÅ]' # Votre alphabet ici

count-tokenized.sh:

#!/bin/sh
# http://wiki.apertium.org/wiki/Asturian#Calculating_coverage

# Calculer le nombre de mots tokenisés dans le corpus :
apertium-destxt | lt-proc $1 |apertium-retxt |\
# pour une raison inconnue mettre directement un changement de ligne ne marche pas, donc deux sed
sed 's/\$[^^]*\^/$^/g' | sed 's/\$\^/$\
^/g' 

Pour trouver tous les tokens dans un dump wiki :

$ ./wikicat.sh nnwiki-20090119-pages-articles.xml.bz2 > nnwiki.cleaned.txt
cat nnwiki.cleaned.txt | ./count-tokenized.sh nn-nb.automorf.bin | wc -l

Pour trouver tous les tokens avec au moins une analyse (couverture naïve) :

$ cat nnwiki.cleaned.txt  | ./count-tokenized.sh nn-nb.automorf.bin | grep -v '\/\*' | wc -l

Pour trouver les tokens de tête inconnus :

$ cat nnwiki.cleaned.txt  | ./count-tokenized.sh nn-nb.automorf.bin | sed 's/[ 	]*//g' |\ # tabulation ou espace
   grep '\/\*' | sort -f | uniq -c | sort -gr | head 

Script prêt à l'emploi

corpus-stat.sh

#!/bin/sh
# http://wiki.apertium.org/wiki/Asturian#Calculating_coverage


# Exemple utilisé :
# zcat corpa/en.crp.txt.gz | sh corpus-stat.sh


#CMD="cat corpa/en.crp.txt"
CMD="cat"

F=/tmp/corpus-stat-res.txt

# Calculer le nombre de mots tokenisés dans le corpus :
# pour une raison inconnue mettre directement un changement de ligne ne marche pas, donc deux sed
$CMD | apertium-destxt | lt-proc en-eo.automorf.bin |apertium-retxt | sed 's/\$[^^]*\^/$^/g' | sed 's/\$\^/$\
^/g' > $F

NUMWORDS=`cat $F | wc -l`
echo "Nombre de mots tokenisés dans le corpus : $NUMWORDS"



# Calculer le nombre de mots qui ne sont pas inconnus
NUMKNOWNWORDS=`cat $F | grep -v '\*' | wc -l`
echo "Nombre de mots connus dans le corpus : $NUMKNOWNWORDS"


# Calculer la couverture

COVERAGE=`calc "round($NUMKNOWNWORDS/$NUMWORDS*1000)/10"`
echo "Couverture : $COVERAGE %"

# Si vous ne disposez pas de calc, changez la ligne précédente par :
#COVERAGE=$(perl -e 'print int($ARGV[0]/$ARGV[1]*1000)/10;' $NUMKNOWNWORDS $NUMWORDS)

# Montrer les 10 mots inconnus les plus fréquents.

echo "Mots inconnus les plus fréquents dans le corpus :"
cat $F | grep '\*' | sort -f | uniq -c | sort -gr | head -10

Exemple de sortie :

$ zcat corpa/en.crp.txt.gz | sh corpus-stat.sh
Nombre de mots tokenisés dans le corpus : 478187
Nombre de mots connus dans le corpus : 450255
Couverture : 	94.2 %
Mots inconnus les plus fréquents dans le corpus :
    191 ^Apollo/*Apollo$
    104 ^Aramaic/*Aramaic$
     91 ^Alberta/*Alberta$
     81 ^de/*de$
     80 ^Abu/*Abu$
     63 ^Bakr/*Bakr$
     62 ^Agassi/*Agassi$
     59 ^Carnegie/*Carnegie$
     58 ^Agrippina/*Agrippina$
     58 ^Achilles/*Achilles$
     56 ^Adelaide/*Adelaide$

Liens externes