Créer un tagueur en mode automatique

From Apertium
Jump to navigation Jump to search

In English

Voir aussi : Entraînement d'un tagueur

D'abord, fabriquez un répertoire appelé <lang>-tagger-data. Mettez y votre corpus avec un nom comme <lang>.crp.txt. Assurez-vous que le corpus est dans un format texte brut.

Lorsque vous y avez votre corpus vous avez besoin d'un Makefile qui spécifie comment générer le ficher de probabilités. Vous pouvez en prendre un d'un autre paquet de langue. Pour apertium-en-af j'ai pris le Makefile de apertium-en-ca. Le fichier dont vous avez besoin est appelé en-ca-unsupervised.make.

Copiez-le dans votre répertoire principal de la paire de langues sous un nom approprié, ensuite éditez-le et changez les variables au début du fichier, BASENAME, LANG1, et LANG2. Tout le reste devrait aller.

Maintenant lancez :

$ make -f en-af-unsupervised.make

et attendez... vous devriez obtenir une sortie comme :

Generating en-tagger-data/en.dic
This may take some time. Please, take a cup of coffee and come back later.
apertium-validate-dictionary apertium-en-af.en.dix
apertium-validate-tagger apertium-en-af.en.tsx
lt-expand apertium-en-af.en.dix | grep -v "__REGEXP__" | grep -v ":<:" |\
        awk 'BEGIN{FS=":>:|:"}{print $1 ".";}' | apertium-destxt >en.dic.expanded
lt-proc -a en-af.automorf.bin <en.dic.expanded | \
        apertium-filter-ambiguity apertium-en-af.en.tsx > en-tagger-data/en.dic
rm en.dic.expanded;
apertium-destxt < en-tagger-data/en.crp.txt | lt-proc en-af.automorf.bin > en-tagger-data/en.crp
apertium-validate-tagger apertium-en-af.en.tsx
apertium-tagger -t 8 \
                           en-tagger-data/en.dic \
                           en-tagger-data/en.crp \
                           apertium-en-af.en.tsx \
                           en-af.prob;
Calculating ambiguity classes...
Kupiec's initialization of transition and emission probabilities...
Applying forbid and enforce rules...
Training (Baum-Welch)...
Applying forbid and enforce rules...

Et après ça vous devriez avoir un fichier en-af.prob , qui peut être utilisé avec le module apertium-tagger .

Quelques questions et réponses au sujet de l'entraînement de tagueur non supervisé[edit]

Q: De quelle taille de dictionnaire ai-je besoin ?

R: Pour la paire anglais et espéranto on avait approximativement 13000 entrées. Approximativement la moitié des phrases d'entraînement avaient un mot inconnu. Avec ça, on obtenait une performance de tagueur très pauvre. Alors on a ajouté 7000 noms propres, donc on a 20000 entrées. Ça rend la qualité acceptable.

Q: Mon dictionnaire n'est pas assez grand, et approximativement la moitié des phrases d'entraînement ont un mot inconnu. Puis-je juste enlever ces phrases par grep, et ensuite entraîner le reste ?

R: Non. Les mots inconnus vont dans une catégorie spéciale, donc vous avez aussi besoin d'une représentation adéquate des mots inconnus dans votre ensemble d'entraînement.

Q: Dans quelles circonstances puis-je juste copier un fichier tagger .prob (ou un fichier .tsx) d'un autre projet ?

R: Vous devez vous assurer que les symboles sont exactement les même. Par exemple eo-en utilise les symboles have<vblex><pres><p3><sg> et es-en utilise have<vblex><pri><p3><sg>, donc ils ne marcheront pas.

Q: J'ai changé un paradigme qui est souvent utilisé et maintenant beaucoup de mots qui utilisent ce paradigme sont balisé différemment !

R: Oui. Vous aurez besoin de ré entraîner votre tagueur parce que les probabilités ont changé. Si par exemple vous supprimez l'impératif (qui en anglais est le même que l'infinitif) pour un paradigme de verbe le tagueur distribuera les probabilités aux autres possibilités.

Q: Puis-je faire en sorte que le tagueur distingue entre les formes de surface qui sont les mêmes en toutes circonstances.

R: Probablement pas très bien. Par exemple l'impératif anglais a la même forme que l'infinitif. A moins que vous écriviez des règles TSX rules extrêmement astucieuses le tagueur n'a aucune chance de distinguer les deux formes et va choisir entre elles plus ou moins au hasard. Ce genre de choses sont beaucoup mieux détectées et supportées par le transfert.

Q: Que fait apertium-tagger-apply-new-rules ?

R: Il applique les règles forbid et enforce d'un nouveau fichier TSX à un fichier .prob existant, avec aucun besoin de ré-entraîner. Les catégories doivent rester les même. C'est une solution rapide pour les petits changements, si vous modifiez beaucoup le fichier TSX, il est recommandé de ré-entraîner le tagueur.

Q: On m'a raconté que les tagueurs fonctionnent à 99% ou plus pour l'anglais. Ça ne semble pas être le cas dans Apertium. Était-ce juste une histoire, ou le tagueur Apertium est il trop simpliste ?

R: Le meilleur tagueur fonctionne à 99%. Les humains généralement ont 98% de succès et notre tagueur fonctionne à environ 93-95%.

Pourquoi notre tagueur anglais fonctionne mal :

  1. les meilleurs tagueurs ont de nombreuses règles désambiguïsation écrites à la main
  2. les meilleurs tagueurs HMM utilisent des trigrammes (on utilise des digrammes -- pour la vitesse)
  3. les meilleurs tagueurs utilisent un corpus balisé à la main pour s'entraîner (on utilise un corpus non balisé -- pour l'anglais)

Donc, pour améliorer la performance, vous aurez besoin soit : 1) d'écrire de meilleures règles de désambiguïsation, 2) d'adapter le tagueur pour utiliser des trigrammes, 3) de baliser à la main un corpus d'entraînement -- ou de convertir un de ceux déjà balisés.

Q: Le tagueur utilise peu de CPU de toutes façon, c'est le transfert qui est gourmand en CPU. Donc pourquoi s'ennuyer avec des contraintes CPU ?

R: Le tagueur a été conçu et implémenté quand on avait un transfert en une étape (mais vous êtes bienvenu pour récrire le tagueur pour utiliser des trigrammes :-)

Améliorer la performance du tagueur[edit]

Q: Mon tagueur fonctionne pauvrement. Que puis-je faire ?

R: En supposant que votre fichier TSX est correct, la meilleure chose que vous pouvez faire est d'ajouter des mots à votre dictionnaire afin que moins de mots (mais toujours quelques-uns) soient inconnus. Vous pouvez aussi essayer avec un autre corpus.

Q: Puis-je juste baliser un corpus avec le tagueur, corriger les balises en places quand il a sélectionné la mauvaise possibilité, et ré-entraîner ce fichier ?

R: Oui vous pouvez. C'est ce qu'on appelle l'entraînement supervisé : utiliser un corpus désambiguïsé à la main. Vous aurez besoin d'environ 25000 mots pour obtenir de bons résultats.

Q: Puis-je améliorer mon entraînement non supervisé avec des exemples désambiguïsés choisis à la main ?

R: Vous pouvez entraîner avec une nouvelle itération en prenant les probabilités d'un entraînement précédent avec l'option --retrain. Les catégories doivent être les mêmes, et le fichier .tsx doit être le même.

L'expert ici est Felipe. Il dit :

L'option --retrain est utilisée pour ré-entraîner le tagueur : Dans chaque itération de Baum Welch, les probabilités du modèle de Markov sont ré-estimées en utilisant les probabilités obtenues dans une itération précédente. Avec --retrain ce que vous dites au tagueur est de lire les probabilités du fichier et de les re-estimer avec le corpus d'entraînement; en d'autres termes, d'ajouter une ou plusieurs autres itérations. Par exemple, un entraînement avec 6 itérations et un ré-entraînement avec 2 est équivalent à un entraînement avec 8 itérations depuis le début (en supposant que c'est le même corpus, bien sûr).

Une manière de mixer l'entraînement supervisé et non supervisé est d'entraîner de manière supervisée avec un corpus (désambiguïsé) balisé à la main et ensuite ré-entraîner (--retrain) avec un corpus plus grand non balisé.