Fabriquer des dictionnaires

From Apertium
Revision as of 19:44, 18 February 2013 by Polo (talk | contribs) (→‎Fréquence)
Jump to navigation Jump to search

Certains d'entre vous ont été assez braves pour commencer à écrire de nouvelles paires de langues pour Apertium. Ça me rend (et toute l'équipe d'Apertium) très content et reconnaissant, mais plus important encore, ça rend Apertium utile pour davantage de monde.

Je veux partager quelques leçons que j'ai tirées de la construction de plusieurs dictionnaires : l'importance des estimations de fréquence. Pour les nouvelles paires pour avoir la couverture la meilleure possible avec un minimum d'effort, il est très important de rajouter les mots et les règles par ordre décroissant de fréquence,, en commençant par les mots et les phénomènes les plus fréquents.

La raison pour laquelle les mots devraient être rajoutés par ordre de fréquence est assez intuitive : plus la fréquence est élevée, plus le mot a des chances d'apparaître dans le texte que vous essayez de traduire (voir ci-dessous pour la loi de Zipf).

Par exemple, en anglais vous pouvez être pratiquement sûr que les mots "the" ou "a" apparaîtront partout même dans les phrases les plus simples; par contre, combien de fois avez-vous vu "hypothyroidism" ou "obelisk" écrit ? Plus la fréquence du mot est élevée, plus vous "gagnez" à l'ajouter.

Fréquence

L'intuition d'une personne quant à la fréquence ou à l'importance des mots peut être très trompeuse. Par conséquent, le mieux qu'on puisse faire est de récupérer une grande masse de textes (des millions de mots, si possible) représentatifs de ce que l'on veut traduire et de s'en servir pour étudier la fréquence des mots et des phénomènes. Récupérez-les depuis Wikipedia ou d'une archive de journal ou écrivez un robot qui les récupère sur le web.

Il est assez facile d'établir un « hit parade » brut des mots en utilisant une séquence de commandes Unix simple (une seule ligne) :

$ cat monfichierrepresentatif.txt | tr ' ' '\012' | sort -f | uniq -c | sort -nr > hitparade.txt

[J'ai tiré ça de Unix for Poets, je pense.]

Bien sûr, ça peut être bien amélioré mais ça sert à des buts d'illustration.

Fréquence des mots contre rang des mots: un graphique de fréquence des mots dans Wikipedia. Le graphique utilise des coordonnées logarithmiques. X est le rang d'un mot dans la table de fréquence ; Y est le nombre total d'occurrences du mot. La loi de Zipf correspond à la portion linéaire du dessus de la courbe, qui suit à peu près la ligne verte (1/x).

Vous découvrirez d'intéressantes caractéristiques à cette liste. Premièrement, en multipliant le rang d'un mot par sa fréquence, vous obtenez un nombre qui est à peu près constant. On appelle cela la loi de Zipf.

Une seconde est que la moitié de la liste est constituée d'hapax legomena (mots qui n'apparaissent qu'une fois).

Troisièmement, avec quelques 1.000 mots, on couvre 75 % du texte.

Donc utilisez les listes comme celles-ci quand vous construisez des dictionnaires.

Si l'une de vos langues est l'anglais, il existe des listes intéressantes :

Gardez à l'esprit, bien sûr, que ces listes sont également basées sur un modèle particulier d'utilisation de l'anglais, qui n'est pas l'anglais "qui vient naturellement".


La même chose s'applique aux autres phénomènes linguistiques. Les linguistes ont tendance à se focaliser sur des phénomènes très rares qui sont les clés de l'identité d'une langue, ou sur ce qui est différent entre les langues. Mais ces "bijoux" ne sont généralement pas les "blocs de construction" que vous utiliseriez pour créer des règles de traduction. Donc, ne vous emballez pas. Faites seulement confiance aux fréquences et à la grande quantité de vrai texte.

Récupérateur de corpus

Dumps Wikipedia

Pour de l'aide pour les traiter, voir :

Les dumps nécessitent du nettoyage (enlever la syntaxe Wiki et XML etc.), mais peuvent fournir une quantité substantielle de texte — à la fois pour l'analyse de fréquence et comme source de phrases pour les POS tagger training (?). Cela peut faire un peu de travail, et ce n'est pas aussi facile que de récupérer un beau corpus, mais d'un autre coté ils sont disponibles dans quelques 275 langues avec au moins 100 articles écrits dans chacune.

Vous prendrez celui intitulé "Articles, templates, image descriptions, et primary meta-pages". Celui-ci contient les versions actuelles de contenu de l'article, et c'est l'archive que la plupart des sites miroirs voudront probablement.

Quelque chose comme (pour l'afrikaans):

$ bzcat afwiki-20070508-pages-articles.xml.bz2 | grep '^[A-Z]' | tr -d "[]" |
sed 's/|/ /g
     s/&[a-z]*;/ /g'

Cela vous donnera approximativement des listes utiles d'une phrase par ligne (en sautant la plupart des formatages étrangers). Remarque, cela suppose que votre langue utilise l'alphabet latin, si elle utilise un autre système d'écriture, vous aurez besoin de changer cela.

Essayez quelque chose comme (pour l'afrikaans):

$ bzcat afwiki-20070508-pages-articles.xml.bz2 | grep '^[A-Z]' | tr -d "[]" |
sed 's/|/ /g
     s/&[a-z]*;/ /g
     s/ /\n/g' | sort -f | uniq -c | sort -nr > hitparade.txt

Une fois que vous avez ce 'hitparade' de mots, il vaut probablement mieux de mettre les 20,000–30,000 de tête dans un fichier séparé.

$ cat hitparade.txt | head -20000 > top.liste.20000.txt

Maintenant, si vous avez déjà travaillé sur un dictionnaire, il y a des chances qu'il existe dans cette 'top liste' des mots que vous avez déjà rajoutés. Vous pouvez supprimer les formes de mots que vous êtes déjà capable d'analyser en utilisant (par exemple pour l'afrikaans):

$ cat top.liste.20000.txt | apertium-destxt | lt-proc af-en.automorf.bin | apertium-retxt | grep '/\*' > mots_a_rajouter.txt

(ici lt-proc af-en.automorf.bin va analyser le flux d'entrée des mots afrikaans et mettre un astérisque * sur ceux il ne reconnaît pas)

Pour chaque 10 words environ que vous rajoutez, ça vaut probablement la peine de recommencer cette étape, tout particulièrement pour les langues fortement infléchies — comme un lemme peur produire plusieurs formes de mots, et que la liste de mots n'est pas "lemmatisée".

Récupérer des entrées de dictionnaires bilingues à peu de frais

Une manière économique de récupérer des entrées de dictionnaires bilingues pour une paire de langues se fait comme suit :

D'abord, saisissez vous-même une liste de noms dans la lange x; par exemple, récupérez les du dictionnaire Apertium que vous utilisez :

$ cat <monolingual dictionary> | grep '<i>' | grep '__n\"' | awk -F'"' '{print $2}' 

Ensuite, écrivez un script basique, du genre :

#!/bin/sh

# traduction depuis
LANGF=$2

# traduction vers
LANGT=$3

# nom du fichier contenant la liste des mots
LIST=$1

for LWORD in `cat $LIST`; do 
        TEXT=`wget -q http://$LANGF.wikipedia.org/wiki/$LWORD -O - | grep 'interwiki-'$LANGT`; 
        if [ $? -eq '0' ]; then
                RWORD=`echo $TEXT |  
                cut -f4 -d'"' | cut -f5 -d'/' | 
                python -c 'import urllib, sys; print urllib.unquote(sys.stdin.read());' |
                sed 's/(\w*)//g'`;
                echo '<e><p><l>'$LWORD'<s n="n"/></l><r>'$RWORD'<s n="n"/></r></p></e>'; 
        fi;
        sleep 8;
done

Note : Le "sleep 8" est pour éviter de mettre une pression excessive sur les serveurs Wikimedia.

Si vous sauvez ceci dans iw-word.sh, vous pouvez alors utiliser la ligne de commandes :

$ sh iw-word.sh <liste_de_mots> <code_langue_origine> <code_langue_destination>

Par exemple, pour récupérer une liste de mots bilingue de l'anglais à l'afrikaans, utilisez :

$ sh iw-word.sh en-af.wordlist en af

La méthode est de fiabilité variable. Les rapports avec entre 70% et 80% de précision sont habituels. C'est meilleur pour les termes non ambigus, mais ça fonctionne lorsque les termes gardent de l'ambiguïté entre les langues.

Chaque correspondance produite par cette méthode doit être testée par des locuteurs natifs ou expérimentés de la paire de langues en question.

Dictionnaire unilingue

Voir aussi Dictionnaire unilingue

Si la langue sur laquelle vous travaillez est assez régulière, et que l'inflection des noms est assez facile (par exemple le français, l'anglais ou l'afrikaans), alors le script suivant peut être utile :

Vous aurez besoin d'une grande liste de mots (de toutes les formes, pas seulement des lemmes) et de quelques paradigmes existants. Ça fonctionne en prenant d'abord toutes les formes au singulier de la liste, puis en cherchant les formes au pluriel, puis en affichant celles qui ont à la fois une forme au singulier et une forme au pluriel dans le format Apertium.

Note: Cela aura besoin d'être testé, puisqu'aucune langue à part l'espéranto est parfaitement régulière.

# mettre ici l'emplacement de votre liste de mots
WORDLIST=/home/spectre/corpora/afrikaans-meester-utf8.txt

# mettre le paradigme, et les terminaisons singulier et pluriel.
PARADIGM=sa/ak__n
SINGULAR=aak
PLURAL=ake

# mettre le nombre de caractères qui doivent être conservés dans la forme au singulier.
# ex : [0:-1] signifie 'supprimez une caractère', [0:-2] signifie 'supprimez deux caractères' etc.
ECHAR=`echo -n $SINGULAR | python -c 'import sys; print sys.stdin.read().decode("utf8")[0:-1];'

PLURALS=`cat $WORDLIST | grep $PLURAL$`
SINGULARS=`cat $WORDLIST | grep $SINGULAR$`
CROSSOVER=""

for word in $PLURALS; do 
        SFORM=`echo $word | sed "s/$PLURAL/$SINGULAR/g"`
        cat $WORDLIST | grep ^$SFORM$ > /dev/null
        
        # si la forme est trouvée alors l'ajouter à la liste
        if [ $? -eq 0 ]; then
                CROSSOVER=$CROSSOVER" "$SFORM
        fi
done

# afficher la liste
for pair in $CROSSOVER; do
        echo '    <e lm="'$pair'"><i>'`echo $pair | sed "s/$SINGULAR/$ECHAR/g"`'</i><par n="'$PARADIGM'"/></e>';
done

Voir aussi

Lectures complémentaires

  • Mark Pagel, Quentin D. Atkinson & Andrew Meade (2007) "fréquence of word-use predicts rates of lexical evolution throughout Indo-European history". Nature 449, 665
"A travers 200 significations, les mots fréquemment utilisés évoluent lentement et les mots peu utilisés évoluent plus vite. Cette relation est valable séparément et de manière identique dans les parties de discours pour chacune des quatre langues du corpus, et compte pour approximativement 50% de la variation historique des taux de remplacement lexicaux. Nous proposons que le fréquence avec lequel des mots spécifiques sont employés dans la langue de tous les jours exerce une influence générale et semblable à une loi sur leur taux d'évolution."