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


Bibliographie


Manning & Schütze, 1999
Manning, C. D. and Schütze, H. (1999).
Foundations of Statistical Natural Language Processing.
The MIT Press, Cambridge, Massachusetts.