B. Habert
Répérer les "mots" qui
s'attirent
Information mutuelle
Soit un ensemble de 25 fenêtres et deux "mots", €
et ¥ présents
respectivement en 8 et 5 exemplaires. On examine donc la
répartion de :
€ € € € € € € €
¥
¥ ¥ ¥ ¥
dans les 25
fenêtres.
Trois situations peuvent se présenter :
1) Indépendance
|
¥ |
€ |
|
€ |
€ |
|
|
|
€ |
|
¥ |
€ |
|
¥ |
¥
€ |
|
|
|
|
¥ |
|
€ |
|
€ |
2) Attirance plus ou moins significative
|
€ |
|
€ |
|
|
¥ |
|
|
¥
€ |
|
|
¥ € |
|
|
|
|
|
¥
€ |
|
¥
€ |
€ |
|
|
€ |
3) "Répulsion"
€ |
|
|
¥ |
¥ |
|
€ |
|
|
€ |
|
¥ |
€ |
€ |
|
€ |
|
¥ |
|
€ |
|
|
€ |
¥ |
|
Plusieurs mesures permettent de déceler les mots qui
« s'attirent »,
c'est-à-dire qui tendent à apparaître en même
temps. La mesure utilisée
ici est l'information mutuelle [Manning
& Schütze, 1999, p. 66-68] :
IM(x,y) = log(p(x,y) / p(x)p(y)).
C'est le rapport de la probabilité de la co-apparition des deux
mots
- p(x,y) - et du produit de la probabilité d'apparition de
chacun
d'eux : p(x)p(y). La probabilité p(x,y) est estimée
comme : fréquence(x,y)
/ nombre total de mots. Il en va de même de p(x) et p(y). Le
logarithme ajouté permet de "contracter" la dispersion des
scores.
Il faut noter que l'information mutuelle mesure l'attirance au sein
de couples (les mots dans un certain ordre) et non au sein de paires.
La paire {soin, bébé} correspond à deux
couples <bébé,
soin> (bébé est le premier mot et soin
apparaît plus
à droite dans le texte) et <soin, bébé>
(c'est cette fois bébé
qui apparaît à droite de bébé dans
le texte).
Démarche et résultats
sur la version lemmatisée et étiquetée par Cordial
des 224 articles relevant de catégories autour de 'philosophie'
dans WikipédiaFR.
Chaîne de traitement
Entrée : une suite de "fenêtres" avec un item par
ligne.
La fenêtre est l'empan, l'espace textuel dans lequel on note les
cooccurrences. Elle peut correspondre à un document, un
paragraphe, une phrase.
Exemple
Extrait
ébauche_Nc
philosophie_Nc
le_D
méta-éthique_Nc
,_Y
ou_C
éthique_Nc
analytique_A
,_Y
désigner_V
le_D
analyse_Nc
de_D
concept_Nc
éthique_A
de_S
base_Nc
,_Y
de_S
...
sv_Nc
:_Y
Metaetik_Np
<FinFenetre/>
ébauche_Nc
philosophie_Nc
le_D
responsabilité_Nc
être_V
le_D
devoir_Nc
de_S
répondre_V
de_S
un_D
...
:_Y
Ikisellik_Np
<FinFenetre/>
ébauche_Nc
philosophie_Nc
le_D
Tao_Np
être_V
un_D
terme_Nc
de_S
philosophie_Nc
chinois_A
...
<FinFenetre/>
Une ligne particulière <FinFenetre/> marque les
fins de fenêtres. Un séparateur (ici _) figure entre le
lemme et la catégorie.
Production des informations nécessaires au calcul de
l'information mutuelle
Le calcul demande d'une part de connaître pour chaque item sa
fréquence globale dans le corpus, d'autre part de
connaître toutes les cooccurrences souhaitées au sein des
fenêtres.
Index
Programme
Usage : FaitIndexDeFenetres.pl <fichier avec un séparateur de
fenêtre et un item par ligne>
Exemple d'appel : perl FaitIndexDeFenetres.pl
PHILOLynx-dump-normaliseCordialLemmeCatBreve.ArticleEgalFenetre >
PHILOLynx-dump-normaliseCordialLemmeCatBreveArticleEgalFenetre.Index
Résultat
sur l'exemple
Format de l'index
<item><fréquence>
<?xml version="1.0"
encoding="iso-8859-1"?>
<index>
<t c="sceptique_A" f="21"/>
<t c="failler_V" f="1"/>
<t c="station_Nc" f="2"/>
<t c="quantificateur_Nc"
f="1"/>
<t c="3x3_A" f="1"/>
<t c="rabbin_Nc" f="3"/>
<t c="Dostoïevsky_Np"
f="5"/>
<t c="Saint thomas_Np"
f="2"/>
Cooccurrences
Le calcul des cooccurrences peut être très long et
produire un fichier très volumineux. On prendra soin d'ajouter
une distance maximale à la fenêtre utilisée si
cette dernière est importante (document) et une cooccurrence
plancher.
Programme
Usage : FaitCooccurrencesDansFenetre.pl <fichier un token par ligne
avec fins de fenêtres><catégories à garder
séparées par la barre verticale><distance
plafond><cooccurrence plancher>
Exemple d'appel : perl FaitCooccurrencesDansFenetre.pl
PHILOLynx-dump-normaliseCordialLemmeCatBreve.ArticleEgalFenetre
'Np|Nc|A' 20 3 >
PHILOLynx-dump-normaliseCordialLemmeCatBreveArticleEgalFenetre.CoocMaxDistance20MinCooc3
Résultat
sur l'exemple
Format des cooccurrences
<cooccurrent1><cooccurrent2><co-fréquence><distance
moyenne>
<?xml version="1.0"
encoding="iso-8859-1"?>
<cooccurrences>
<t c1="contexte_Nc"
c2="chose_Nc" cf="1" dm="11.00"/>
<t c1="japonais_A"
c2="wushutao_Nc" cf="1" dm="20.00"/>
<t c1="logique_A"
c2="responsabilité_Nc" cf="1" dm="13.00"/>
<t c1="esprit_Nc"
c2="différent_A" cf="1" dm="7.00"/>
<t c1="cerf_Nc" c2="Adorno_Np"
cf="1" dm="5.00"/>
...
</cooccurrences>
Précisions
Etape
|
var.
|
longtemps
|
je
|
me
|
suis
|
couché
|
de
|
malheur
|
couple
|
distance
|
a
|
L1
|
longtemps
|
|
|
|
|
|
|
|
|
a1
|
L2
|
|
je
|
|
|
|
|
|
<longtemps,
je>
|
0
|
a2
|
L2
|
|
|
me
|
|
|
|
|
<longtemps,me>
|
1
|
a3
|
L2
|
|
|
|
suis
|
|
|
|
<longtemps,suis>
|
2
|
a4
|
L2
|
|
|
|
|
couché
|
|
|
<longtemps,couché>
|
3
|
a5
|
L2
|
|
|
|
|
|
de
|
|
<longtemps,de>
|
4
|
a6
|
L2
|
|
|
|
|
|
|
malheur
|
<longtemps,malheur>
|
5
|
b
|
L1
|
|
je
|
|
|
|
|
|
|
|
b1
|
L2
|
|
|
me
|
|
|
|
|
<je,me>
|
0
|
b2
|
L2
|
|
|
|
suis
|
|
|
|
<je,suis>
|
1
|
b3
|
L2
|
|
|
|
|
couché
|
|
|
<je,couché>
|
2
|
b4
|
L2
|
|
|
|
|
|
de
|
|
<je,de>
|
3
|
b5
|
L2
|
|
|
|
|
|
|
malheur
|
<je,malheur>
|
4
|
...
|
|
|
|
|
|
|
|
|
|
|
f
|
L1
|
|
|
|
|
|
de
|
|
|
|
f1
|
L2
|
|
|
|
|
|
|
malheur
|
<de,malheur>
|
0
|
Calcul de l'information mutuelle
Programme
Usage : CooccurrencesDansFenetre2IM.pl
<index><cooccurrences><fréquence plancher>
Exemple d'appel : perl CooccurrencesDansFenetre2IM.pl
PHILOLynx-dump-normaliseCordialLemmeCatBreveArticleEgalFenetre.Index
PHILOLynx-dump-normaliseCordialLemmeCatBreveArticleEgalFenetre.CoocMaxDistance20MinCooc3
5 >
PHILOLynx-dump-normaliseCordialLemmeCatBreveArticleEgalFenetreCoocMaxDistance20MinCooc5.IM
Résultat
sur l'exemple
Format de sortie
<cooccurrent1><cooccurrent2><fréquence
cooccurrent1><fréquence
cooccurrent2><cofréquence><distance
moyenne><information mutuelle>
<?xml version="1.0"
encoding="iso-8859-1"?>
<information_mutuelle
occurrences="134102">
<c c1="philosophie_Nc"
c2="Alexius_Np" fc1="855" fc2="8" cf="5" dm="9.00" im="6.62"/>
<c c1="philosophie_Nc"
c2="métaphysique_Nc" fc1="855" fc2="50" cf="7" dm="12.57"
im="4.46"/>
<c c1="dieu_Nc"
c2="existence_Nc" fc1="107" fc2="84" cf="6" dm="10.83"
im="6.48"/>
<c c1="chose_Nc"
c2="cause_Nc" fc1="168" fc2="62" cf="6" dm="10.17" im="6.27"/>
<c c1="âme_Nc"
c2="existence_Nc" fc1="83" fc2="84" cf="6" dm="9.67"
im="6.85"/>
Engendrement d'un graphe GML
Programme
Usage : IM2GraphML.pl <fichier IM><distance plafond><IM
plancher>
Exemple d'appel : perl IM2GraphML.pl
PHILOLynx-dump-normaliseCordialLemmeCatBreveArticleEgalFenetreCoocMaxDistance20MinCooc5.IM
8 9.0 >
PHILOLynx-dump-normaliseCordialLemmeCatBreveArticleEgalFenetreCoocMaxDistance20MinCooc5IMDistMoyMAx8IMMin9.0.gml
Résultat
sur l'exemple
Format de sortie
<?xml version="1.0" encoding="iso-8859-1"?>
<graphml>
<key id="d0" for="node" attr.name="nom" attr.type="string"/>
<key id="d1" for="edge" attr.name="poids"
attr.type="double"/>
<graph edgedefault="undirected">
<node id="1"><data
key="d0">José_Np</data></node>
<node id="2"><data
key="d0">Gil_Np</data></node>
<edge source="1" target="2"><data
key="d1">14.42</data></edge>
<node id="3"><data
key="d0">jacques_Nc</data></node>
Engendrement d'un graphe Pajek
Feuille de style
xsltproc GraphML2Pajek.xsl
PHILOLynx-dump-normaliseCordialLemmeCatBreveArticleEgalFenetreCoocMaxDistance20MinCooc5IMDistMoyMAx8IMMin9.0.gml
> PHILOCordialDistMoyMax8IMMin9.net
Résultat sur
l'exemple
Format de sortie
*Vertices 590
1 "José_Np"
2 "Gil_Np"
3 "jacques_Nc"
4 "Bouveresse_Np"
5 "Fichte_Np"
6 "Georg_Np"
7 "Friedrich_Np"
8 "Bernard_Np"
9 "Stiegler_Np"
10 "h_Nc"
11 "q_Nc"
12 "Lucien_Np"
13 "eo_Nc"
14 "déclaration_Nc"
15 "droit_Nc"
16 "Martin_Np"
...
584 "Jürgen_Np"
585 "Habermas_Np"
586 "u_Nc"
587 "analytique_A"
588 "Mill_Np"
589 "Tao_Np"
590 "liberté_Nc"
*Edges
1 2 14.42
3 4 12.75
5 5 12.22
6 7 10.75
8 9 13.67
10 11 10.06
12 13 10.94
- Manning & Schütze, 1999
- Manning, C. D. and Schütze, H. (1999).
Foundations of Statistical Natural Language Processing.
The MIT Press, Cambridge, Massachusetts.