B. Habert
Projet Communautés

Cours 1

Des cooccurrences dans une fenêtre au graphe des cooccurrences

Décompte des cooccurrences dans une fenêtre

Fonctionnement général

Le décompte des cooccurrences s'effectue au sein d'une "fenêtre" textuelle choisie.
Cette fenêtre peut être structurelle :
Cette fenêtre peut aussi être en nombre de positions (1 mot, 5 mots, 100 mots, etc.).
On peut croiser les 2 (5 mots au sein de la phrase).

La taille de la fenêtre change la nature des cooccurrences : de la micro-syntaxe (groupe syntaxique, plus ou moins 5 mots) à des participations plus floues à un même domaine (paragraphe, document, plus ou moins 100 mots).

Par ailleurs, au sein de la fenêtre, on peut "écrémer" et ne garder les cooccurrences qu'entre mots relevant de telle ou telle catégorie.

Algorithme

Parcourir le texte de fenêtre en fenêtre.
Au sein d'une fenêtre :
engranger les mots relevant des catégories choisies ;
mémoriser les couples de mots au sein des mots engrangés.

On constitue un dictionnaire associatif (table de hashage) qui à un couple de cooccurrents fait correspondre sa fréquence.

Exemple

Les phrases contenant barrage dans LM10, en format tabulé.

<document><paragraphe><phrase><lemme><forme><catégorie><POS>
683121    2    4    le    L'    DetMS    D
683121    2    4    accalmie    accalmie    NomFS    N
683121    2    4    permettre    devrait permettre    VCONJS    V
683121    2    4    de    de    Prep    O
683121    2    4    récupérer    récupérer    VINF    V
683121    2    4    de    d'    Prep    O
683121    2    4    autre    autres    AdjFP    A
683121    2    4    trace    traces    NomFP    N
683121    2    4    de    de    Prep    O
683121    2    4    fioul    fioul    NomMS    N
683121    2    4    en    en    Prep    O
683121    2    4    mer    mer    NomFS    N
683121    2    4    ,    ,    Typo    T
683121    2    4    au moyen de    au moyen de    Prep    O
683121    2    4    barrage    barrages    NomMP    N
683121    2    4    flottant    flottants    AdjMP    A
683121    2    4    tracter    tractés    PpaMP    V
683121    2    4    par    par    Prep    O
683121    2    4    de le    des    Det    D
683121    2    4    bateau    bateaux    NomMP    N
683121    2    4    ,    ,    Typo    T
683121    2    4    dans    dans    Prep    O
683121    2    4    le    le    DetMS    D
683121    2    4    pertuis    Pertuis    NomMS    N
683121    2    4    breton    breton    AdjMS    A
683121    2    4    ,    ,    Typo    T
683121    2    4    séparer    séparant    Ppr    V
683121    2    4    le    l'    DetMS    D
683121    2    4    île    île    NomFS    N
683121    2    4    de    de    Prep    O
683121    2    4    le    la    DetFS    D
683121    2    4    côte    côte    NomFS    N
683121    2    4    de    de    Prep    O
683121    2    4    le    le    Det?S    D
683121    2    4    Marais    Marais    NomPr    NP
683121    2    4    Poitevin.le    poitevin.Le    NomPrXXInc    NP
683121    2    4    sud    sud    NomMS    N
683121    2    4    de    de    Prep    O
683121    2    4    le    l'    DetMS    D
683121    2    4    estuaire    estuaire    NomMS    N
683121    2    4    de    de    Prep    O
683121    2    4    le    la    DetFS    D
683121    2    4    Loire    Loire    NomPr    NP
683121    2    4    et    et    CCoord    Cc
683121    2    4    le    la    DetFS    D
683121    2    4    Vendée    Vendée    NomPr    NP
683121    2    4    atteindre    ont été atteints    VCONJPp    V
683121    2    4    également    également    Adv    R
683121    2    4    à nouveau    à nouveau    AdvGP    R
683121    2    4    par    par    Prep    O
683121    2    4    de le    des    Det    D
683121    2    4    galette    galettes    NomFP    N
683121    2    4    de    de    Prep    O
683121    2    4    fioul    fioul    NomMS    N
683121    2    4    ce    ce    DetMS    D
683121    2    4    week    week    NomInc    N
683121    2    4    -    -    Typo    T
683121    2    4    end    end    NomInc    N
683121    2    4    .    .    Typo    T
683199    10    18    un    Un    DetMS    D
683199    10    18    village    village    NomMS    N
683199    10    18    destiner    est destiné    VCONJSp    V

La fenêtre choisie est la phrase. Le programme va donc mémoriser les mots des catégories retenues pour toutes les lignes commençant par 683121    2    4. Il recommencera ensuite pour celles commençant par 683199    10    18.

La catégorie retenue est celle de l'adjectif (A en dernière position).
Les seules lignes pertinentes sont celles en gras supra.
Les lemmes retenus sont :

flottant breton poitevin

Les couples de cooccurrence qui en résultent sont :

flottant breton
flottant poitevin
breton poitevin

On voit qu'il s'agit d'un parcours où l'on examine successivement chaque mot de la liste et pour celui-ci, on note sa cooccurrence avec tous les suivants.

Dans le programme Perl correspondant :

$LemmesGardes est le tableau des lemmes gardés.
$#LemmesGardes est l'indice du dernier élément du tableau. Si le tableau mémorise 3 lemmes, $#LemmesGardes vaut 2. $LemmesGardes[0] retourne "flottant" et $LemmesGardes[2] ou $LemmesGardes[$#LemmesGardes] retourne "poitevin".

           for ($l1 = 0 ; $l1 < $#LemmesGardes ; $l1++) {
              for ($l2 = $l1 + 1 ; $l2 <= $#LemmesGardes ; $l2++) {
                 $Cooccurrence = "$LemmesGardes[$l1]\t$LemmesGardes[$l2]" ;
                 $Cooccurrence2Frequence{$Cooccurrence}++ ;
              }
           }

$Cooccurrence2Frequence est un tableau associatif auquel on fait correspondre sa fréquence à la cooccurrence (concrétisée par la concaténation des 2 lemmes considérés séparés par une tabulation - Par exemple, si $LemmesGardes[$l1] retourne "flottant" et $LemmesGardes[$l2] retourne "poitevin", $Cooccurrence = "flottant\tpoitevin").

Plus précisément, si le couple n'existe pas, il est créé avec une fréquence de 1. Sinon, cette fréquence est incrémentée.
C'est le sens de :
$Cooccurrence2Frequence{$Cooccurrence}++ ;

Engendrement de graphes

Le mode d'emploi est le suivant :

PhraseLM10AutourPivot2CooccurrencesGraphML.pl <fichier d'entrée><fichier de sortie><pivot><POS gardées><cooccurrence plancher>

Exemple :
PhraseLM10AutourPivot2CooccurrencesGraphML.pl LM10NbarrageDocParPhraseLemmeFormeCatPOSWin.txt AdjBarragePlancher2.xml barrage A 2

Le 3ème argument est le lemme partagé par les fenêtres qu'on examine (ici barrage). On enlève ce lemme des lemmes à examiner : il introduirait du "bruit" dans les résultats.

Le 4ème argument est la ou les catégories retenues. Si l'on voulait garder les noms, les verbes et adjectifs, on indiquerait NAV (ou NVA ou AVN ou VNA, etc.).

Les POS (Part Of Speech) utilisables sont la première lettre des catégories suivantes :

A   Adjectif
Cc  Conjonction de coordination
Cs  Conjonction de subordination
D   Déterminant
E   Erreur
N   Nom commun
NP  Nom propre
O   PrépOsition
P   Pronom
R   AdveRbe
T   PoncTuation
V   Verbe

Le 5ème argument est la valeur plancher de la cooccurrence. On ne gardera que les cooccurrences intervenant au moins 2 fois (donc dans l'exemple choisi on élimine les hapax). L'élagage est crucial pour obtenir des graphes visualisables. A titre d'exemple, pour les adjectifs, au plancher de 1 (sans élagage en fait), on obtient plus de 1900 noeuds. En ne gardant que les cooccurrences égales ou supérieures à 5, on n'en retient plus qu'un peu moins de 600.

Le fichier engendré est au format GraphML.

Engendrer les graphes suivants :

Dans tous les cas, on utilisera plusieurs planchers. Au moins 5 et 10 cooccurrences.

On donnera aux fichiers engendrés des noms significatifs.

Version Windows du programme
Version Linux du programme
Fragment d'essai (catégorie retenue : A)
Fichier GraphML résultat
Fichier Pajek correspondant

Engendrement de la version Pajek des graphes

Utiliser la feuille de style de la dernière fois - GraphML2Pajek.xsl - et l'environnement idoine pour engendrer les versions Pajek des graphes. On leur donnera l'extension .net (net = réseau) qui est celle que préconise Pajek.

Archive des phrases avec barrage de LM10

Manipulation des graphes sous Pajek

Visualiser les graphes sous Pajek et choisissez le mode de visualisation le plus approprié.

Sauvegardez les visualisations (export).

Intégrer l'ensemble des résultats (via des liens) dans un document HTML qui :
  1. rappelle l'objectif d'ensemble ;
  2. détaille les étapes ;
  3. fournit les résultats à chaque étape.

En outre, si le temps le permet :
  1. indiquer une erreur qui s'est glissée dans le programme (dans sa conception même. Il n'est pas besoin de lire le détail du code. Il suffit de regarder plus en détail la nature de ce qui est stocké dans le dictionnaire associatif $Cooccurrence2Frequence) ;
  2. examiner comment modifier le fragment d'algorithme pour la notation des cooccurrences pour ne plus travailler au sein de la phrase, mais au sein d'une fenêtre (intérieure à la phrase) en générale plus petite (par exemple 5 mots).
Le mieux pour ce deuxième point est de :
  1. décrire "avec des mots" ce que fait ce fragment d'algorithme ;
  2. faire tourner cet algorithme non modifié sur un exemple simple (mais plus compliqué que celui fourni supra, puisqu'il faut plus de mots retenus dans la phrase que la limite retenue, 5 mots par exemple) ;
  3. décrire "avec des mots" l'algorithme modifié ;
  4. écrire en Perl l'algorithme modifié.