Calculer la couverture
Jump to navigation
Jump to search
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[edit]
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$