Difference between revisions of "Fabriquer des dictionnaires"

From Apertium
Jump to navigation Jump to search
(liens + catégories)
(Fin traduction)
Line 54: Line 54:
* http://meta.wikimedia.org/wiki/Help:Export
* http://meta.wikimedia.org/wiki/Help:Export


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 [[Formation d'un tagger|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 [http://meta.wikimedia.org/wiki/List_of_Wikipedias 275 langues] avec au moins 100 articles écrits dans chacune.
The dumps need cleaning up (removing Wiki syntax and XML etc.), but can
provide a ''substantial'' amount of text — both for fréquence analysis and
as a source of sentences for POS [[tagger training]]. It can take some work, and isn't as
easy as getting a nice corpus, but on the other hand they're available
in some [http://meta.wikimedia.org/wiki/List_of_Wikipedias 275 languages] with at least 100 articles written in each.


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.
You'll want the one entitled "Articles, templates, image descriptions,
and primary meta-pages. -- This contains current versions of article
content, and is the archive most mirror sites will probably want."


Quelque chose comme (pour l'afrikaans):
Something like (for Afrikaans):


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


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.
This will give you approximately useful lists of one sentence per line
(stripping out most of the extraneous formatting). Note, this presumes that your
language uses the Latin alphabet; if it uses another writing system,
you'll need to change that.


Essayez quelque chose comme (pour l'afrikaans):
Try something like (for Afrikaans):


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


Une fois que vous avez ce 'hitparade' de mots, il vaut probablement mieux de mettre les 20,000&ndash;30,000 de tête dans un fichier séparé.
Once you have this 'hitparade' of words, it is first probably best to skim
off the top 20,000&ndash;30,000 into a separate file.


<pre>
<pre>
$ cat hitparade.txt | head -20000 > top.lista.20000.txt
$ cat hitparade.txt | head -20000 > top.liste.20000.txt
</pre>
</pre>


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):
Now, if you already have been working on a dictionary, chances are that there
will exist in this 'top list' words you have already added. You can remove word forms
you are already able to analyse using (for example Afrikaans):


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


(here <code>lt-proc af-en.automorf.bin</code> will analyse the input stream of Afrikaans words and put an asterisk * on those it doesn't recognise)
(ici <code>lt-proc af-en.automorf.bin</code> 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 &mdash; comme un lemme peur produire plusieurs formes de mots, et que la liste de mots n'est pas "lemmatisée".
For every 10 words or so you add, it's probably worth going back and repeating this step, especially
for highly inflected languages &mdash; as one lemma can produce many word forms, and the wordlist
is not lemmatised.


== Récupérer des entrées de dictionnaires bilingues à peu de frais ==
== Getting cheap bilingual dictionary entries ==


Une manière économique de récupérer des entrées de dictionnaires bilingues pour une paire de langues se fait comme suit :
A cheap way of getting bilingual dictionary entries between a pair of
languages is as follows:


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 :
First grab yourself a wordlist of ''nouns'' in language ''x''; for
example, grab them out of the Apertium dictionary you are using:


<pre>
<pre>
Line 118: Line 103:
</pre>
</pre>


Next, write a basic script, something like:
Ensuite, écrivez un script basique, du genre :


<pre>
<pre>
#!/bin/sh
#!/bin/sh


# traduction depuis
#language to translate from
LANGF=$2
LANGF=$2

#language to translate to
# traduction vers
LANGT=$3
LANGT=$3

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


Line 143: Line 130:
</pre>
</pre>


''Note: The "sleep 8" is so that we don't put undue strain on the Wikimedia servers.''
''Note : Le "sleep 8" est pour éviter de mettre une pression excessive sur les serveurs Wikimedia.''


If you save this as <code>iw-word.sh</code>, then you can use it at the command line:
Si vous sauvez ceci dans <code>iw-word.sh</code>, vous pouvez alors utiliser la ligne de commandes :


<pre>
<pre>
$ sh iw-word.sh <wordlist> <language code from> <language code to>
$ sh iw-word.sh <liste_de_mots> <code_langue_origine> <code_langue_destination>
</pre>
</pre>
Par exemple, pour récupérer une liste de mots bilingue de l'anglais à l'afrikaans, utilisez :
Fr example, to retrieve a bilingual wordlist from English to Afrikaans, use:


<pre>
<pre>
Line 156: Line 143:
</pre>
</pre>


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.
The method is of variable reliability. Reports of between 70% and 80%
accuracy are common. It is best for unambiguous terms, but works all right where
terms retain ambiguity through languages.


Chaque correspondance produite par cette méthode '''doit''' être testée par des locuteurs natifs ou
Any correspondences produced by this method '''must''' be checked by native or
fluent speakers of the language pairs in question.
expérimentés de la paire de langues en question.


== Monodix ==
== Dictionnaire unilingue ==
{{main|Monodix}}


Voir aussi [[Dictionnaire unilingue]]
If the language you're working with is fairly regular, and noun inflection is quite easy (for example English or Afrikaans), then the following script may be useful:


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 :
You'll need a large wordlist (of all forms, not just lemmata) and some existing paradigms. It works by first taking all singular forms out of the list, then looking for plural forms, then printing out those which have both singular and plural forms in Apertium format.


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: These will need to be checked, as no language except Esperanto is that regular.''

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


<pre>
<pre>
# mettre ici l'emplacement de votre liste de mots
# set this to the location of your wordlist
WORDLIST=/home/spectre/corpora/afrikaans-meester-utf8.txt
WORDLIST=/home/spectre/corpora/afrikaans-meester-utf8.txt


# mettre le paradigme, et les terminaisons singulier et pluriel.
# set the paradigm, and the singular and plural endings.
PARADIGM=sa/ak__n
PARADIGM=sa/ak__n
SINGULAR=aak
SINGULAR=aak
PLURAL=ake
PLURAL=ake

# set this to the number of characters that need to be kept from the singular form.
# mettre le nombre de caractères qui doivent être conservés dans la forme au singulier.
# e.g. [0:-1] means 'cut off one character', [0:-2] means 'cut off two characters' etc.
# 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];'
ECHAR=`echo -n $SINGULAR | python -c 'import sys; print sys.stdin.read().decode("utf8")[0:-1];'


Line 191: Line 178:
SFORM=`echo $word | sed "s/$PLURAL/$SINGULAR/g"`
SFORM=`echo $word | sed "s/$PLURAL/$SINGULAR/g"`
cat $WORDLIST | grep ^$SFORM$ > /dev/null
cat $WORDLIST | grep ^$SFORM$ > /dev/null
# if the form is found then append it to the list
# si la forme est trouvée alors l'ajouter à la liste
if [ $? -eq 0 ]; then
if [ $? -eq 0 ]; then
CROSSOVER=$CROSSOVER" "$SFORM
CROSSOVER=$CROSSOVER" "$SFORM
Line 197: Line 185:
done
done


# afficher la liste
# print out the list
for pair in $CROSSOVER; do
for pair in $CROSSOVER; do
echo ' <e lm="'$pair'"><i>'`echo $pair | sed "s/$SINGULAR/$ECHAR/g"`'</i><par n="'$PARADIGM'"/></e>';
echo ' <e lm="'$pair'"><i>'`echo $pair | sed "s/$SINGULAR/$ECHAR/g"`'</i><par n="'$PARADIGM'"/></e>';
Line 208: Line 196:
* [[Récupération de dictionnaires bilingues depuis OmegaWiki]]
* [[Récupération de dictionnaires bilingues depuis OmegaWiki]]


== Further reading ==
== 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
* 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."
:"Across all 200 meanings, frequently used words evolve at slower rates and infrequently used words evolve more rapidly. This relationship holds separately and identically across parts of speech for each of the four language corpora, and accounts for approximately 50% of the variation in historical rates of lexical replacement. We propose that the fréquence with which specific words are used in everyday language exerts a general and law-like influence on their rates of evolution."


[[Category:Documentation]]
[[Category:Documentation]]

Revision as of 22:41, 6 February 2012

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 pour laquelle les mots sont importants ou fréquents peut être très décevante. Par conséquent, le mieux qu'on puisse faire est de récupérer beaucoup de texte (des millions de mots, si possible) qui sont représentatifs de ce que l'on veut traduire, et d'étudier la fréquence des mots et des phénomènes. Récupérez les de Wikipedia ou d'une archive de journal, ou écrivez un robot qui les récupère sur le Web.

Il est assez facile de faire 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 Zipf correspond à la portion linéaire du dessus de la courbe, qui suit à peu près la ligne verte (1/x).

Vous allez trouver d'intéressantes propriétés à cette liste. L'une d'elle c'est qu'en multipliant le rang d'un mot par sa fréquence, vous obtenez un nombre qui est à peu près constant. On appelle ça la loi de Zipf.

Une autre est que la moitié de la liste est hapax legomena (des mots qui n'apparaissent qu'une fois).

Troisièmement, avec environ 1,000 mots vous devriez avoir 75% du texte couvert.

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

Si l'une de vos langues est l'anglais, il y a 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."