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 :
- le document ;
- le paragraphe ;
- la phrase ;
- le groupe syntaxique.
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 :
- noms, verbes et adjectifs ;
- noms seulement ;
- adjectifs seulement ;
- verbes seulement.
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 :
- rappelle l'objectif d'ensemble ;
- détaille les étapes ;
- fournit les résultats à chaque étape.
En outre, si le temps le permet :
- 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) ;
- 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 :
- décrire "avec des mots" ce que fait ce fragment
d'algorithme ;
- 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) ;
- décrire "avec des mots" l'algorithme modifié ;
- écrire en Perl l'algorithme modifié.