Alignement -- Heuristique

Principe

L'association entre un mot (a) dans la langue source et un mot (b) dans la langue cible se fait si (b) est présent dans les paragraphes correspondants à ceux où (a) apparait, et ce de façon systématique - c-à-d plus souvent que le hasard.

Notes préliminaires:

  • Cooccurrence : deux motifs sont en cooccurrence lorsqu'ils apparaissent dans des paragraphes ayant le même identifiant.
  • Par paragraphe on désigne la zone de texte comprise entre les balises <ALIGN>...</ALIGN> dans les bitextes du corpus.
  • Chaque identifiant de paragraphe est associé à un couple des paragraphes (un en langue source et un en langue cible) dont l'un est la traduction de l'autre.

Pour chaque couple de termes candidats à l'alignement, on va donc calculer un score d'association lié au rapport entre le nombre effectif de cooccurrences dans le corpus et la probabilité naturelle de cooccurrence. La formule appliquée dans notre algorithme est une version modifiée du Coefficient de Dice de rapport de vraisemblance (Log Likelihood Ratio):

  • 2 C(a,b) / C(a) * C(b)
  • C(a,b) = nb de cooccurrences de a et b
  • C(a) = nb d'occurrences de a
  • C(b) = nb d'occurrences de b

Optimisation

Le décompte des cooccurrences est très coûteux en temps s'il est fait à la volée.

Vu le grand nombre de termes à aligner (on rappelle que seule la liste des patrons français a été triée) nous avons décidé de ne plus toucher au corpus et de nous servir uniquement des listes des patrons extraits comme d'une base de données.

L'optimisation intervient notamment au moment de l'acquisition des données en mémoire :

  • En langue source chaque terme est associé au vecteur des identifiants des paragraphes où il apparait :
    donnees_source:
    ----------------------------------
    faction afghane fich2-par3, fich16-par66
    dette publique fich20-par46, fich20-par92
    cadre civil fich3-par1
    ... ...
  • de façon inverse, en langue cible chaque identifiant de paragraphe est associé au vecteur des termes qu'il contient (parmi ceux extraits, bien évidemment) :
    donnees_cible:
    -----------------------------------
    fich20-par46 pink dog,
    fich20-par46 blue pig, red pigeon
    fich20-par47 purple dove
    ... ...

La réalisation informatique des deux structures est la même : un tableau associatif avec des références sur tableaux comme valeurs.

# CLE VALEUR
# patron1 réf -------> TABLEAU: id_alignX, id_alignY, id_alignZ
# patron2 réf -------> TABLEAU: id_alignW, id_alignV
# CLE VALEUR
# id_alignX réf -------> TABLEAU: patron1, patron2, patron3
# id_alignY réf -------> TABLEAU: patron4, patron5

Formule Magique

Le calcul des cooccurrences (nbCoocc) se fait donc à partir de la structure donnees_source: pour chaque terme français on parcourt la liste de ses positions dans le corpus. L'identifiant de paragraphe constitue une sorte d'index de la table donnees_cible, nous permettant d'accéder directement au contenu des paragraphes dans le volet langue-cible du corpus.

Quant au nombre total d'occurrences (nbOccTot), il est calculé à la volée pour chaque terme en parcourant la liste de termes extraits.

Au début du projet le score d'association (scoreStat) entre deux termes était simplement le rapport entre nb de cooccurrences et nb total d'occurrences du mot en langue cible :

  • scoreStat = nbCoocc/nbOccTot (a)

[NOTE: On remarque que le nb d'occurrences du terme en langue source n'est pas pris en compte. Ceci ne pose pas de problèmes car la comparaison des scores se fait toujours parmi des couples ayant le même terme comme blockquotemier élément.]

En observant les résultats on s'est rendu compte qu'un nb de cooccurrences élevé était souvent un facteur suffisant pour choisir le bon candidat. Dans la formule finale le rapport (a) est donc multiplié par le nb de cooccurrences, ce qui donne la formule suivante :

  • scoreStat = nbCoocc²/nbOccTot (b)

Un autre problème est le bruit généré par les candidats dont le nbCoocc et le nbOccTot sont égaux à 1. Le score 1 résultant de la formule (b) est trop haut dans ces cas. Pour régler le problème le scoreStat est initialisé par défaut avec la valeur 0.5 et n'est pas recalculé pour les candidats de ce type.


Structure générée

La structure générée pour chaque terme en langue source ressemble à ceci :

  • termeSource ...
    candidat1 : nbOccTot, nbCoocc, scoreStat, scoreCognat, fichierContexte
    candidat2 : nbOccTot, nbCoocc, scoreStat, scoreCognat, fichierContexte
    ...

Un exemple :

  • parti démocrate ...
    مثقفين اكثر : 1 1 0.5 0 LAZARE2003-01.xml_35
    أزمة عراقية : 1 3 0.333333333333333 0 BENTLEY2003-02.xml_6
    وزراء بريطاني : 1 5 0.2 0 BENTLEY2003-02.xml_6
    ولايات متحدة : 1 576 0.00173611111111111 0 BENTLEY2003-02.xml_6
    حزب ديموقراطي : 3 9 1 3 BENTLEY2003-02.xml_6