forked from aymara/lima
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdocTL.xml
1019 lines (1018 loc) · 53.8 KB
/
docTL.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. -->
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN" "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" []>
<article>
<title>Le traitement linguistique (de LIMA) expliqué aux débutants</title>
<section>
<title>Introduction</title>
<para>LIMA signifie LIst Multilingual Analyzer. C'est donc --- faut-il
l'expliciter ? --- l'analyseur linguistique multilingue du CEA LIST / LASTI.
Attention, LIMA n'est pas le moteur de recherche du laboratoire. Celui-ci,
pour des raisons historiques porte actuellement le superbe nom de S2. Ce
devrait un jour être modifié. Les modules logiciels qui composent LIMA
sont appelés s2common et s2lp car il s'agissait initialement des modules
commun et d'analyse linguistique (linguistic processing, d'où lp dans
s2lp) du moteur de recherche. Ces deux modules sont maintenant largement
indépendants du moteur (qui continue à les utiliser) mais ont conservé
leurs dénominations malgré tout.</para>
<para>Ce document présente les différentes étapes du traitement
linguistique. Pour chaque étape on essaira de mettre en évidence les
mécanismes de traitement ainsi que les ressources utilisées. Nous
commencerons par examiner les traitements utilisés pour l'analyse du
Français, ce qui permettra d'appréhender le système dans son ensemble.
Ensuite, nous étudierons les traitements spécifiques à d'autres langues,
et enfin nous dresserons un inventaire des ressources
linguistiques.</para>
<para>Nous décrirons au fur et à mesure les structures de données
manipulées.</para>
</section>
<section>
<title>Traitement linguistique du Français</title>
<para>L'analyse d'une langue est composée de 3 grandes étapes :</para>
<orderedlist>
<listitem>
<para>Tokenization : découpage du texte en tokens, utilise uniquement
les caractères.</para>
</listitem>
<listitem>
<para>Analyse Morphologique : assignation des catégories grammaticales
possibles, quelques redécoupages locaux (par exemple lors du
traitement des expressions idiomatiques), utilise uniquement les
informations morphologiques</para>
</listitem>
<listitem>
<para role="">Part of Speech (PoS) Tagging et Analyse syntaxique :
extrait la catégorie grammaticale pertinente pour chaque token et
utilise ces catégories pour construire les dépendances syntaxiques. Ce
niveau d'analyse utilise le contexte des mots.</para>
</listitem>
</orderedlist>
<para>Chacune de ces grandes étapes est elle-même découpée en étapes
élémentaires. De plus, des étapes de production de traces de l'analyse ou
de résultats intermédiaires peuvent être insérées entre ces étapes
d'analyse. Toutes ces étapes sont des unités de traitement ou ProcessUnit.
Ensembles, ces ProcessUnit représentent une séquence nommée pipeline. Une
structure de données nommée AnalysisContent est transmise de ProcessUnit
en ProcessUnit. Elle contient un ensemble de données d'analyse
(AnalysisData) nommées.<figure>
<title>Vue simplifiée des classes utilisées par l'analyse</title>
<mediaobject>
<imageobject>
<imagedata fileref="resources/PipelineClasses.jpeg" contentdepth="100%" scalefit="1" width="100%"/>
</imageobject>
</mediaobject>
</figure></para>
<para>Chaque ProcessUnit est initialisé à l'aide d'un élément
<group> issu d'un fichier de configuration XML.</para>
<para>Les sections ci-dessous présentent une vue simplifiée des différents
ProcessUnit.</para>
<section>
<title>Tokenization</title>
<variablelist>
<varlistentry>
<term>Ressources utilisées</term>
<listitem>
<para>Table de caractères et automate de découpage (fichier
tokenizerAutomaton-fre.xml)</para>
</listitem>
</varlistentry>
<varlistentry>
<term>Description de la tâche</term>
<listitem>
<para>Il s'agit de découper le texte initial en tokens et de les
relier entre eux selon leur enchaînement dans le texte. Cette
étape crée un graphe contenant un noeud pour chaque token trouvé
et un arc entre chaque paire de tokens adjacents. Ce graphe est
appelé <emphasis>graphe d'analyse</emphasis>
(<code>AnalysisGraph</code>) pour le différencier d'autres graphes
utilisés dans la suite de l'analyse. Les noeuds de l'AnalysisGraph
sont numérotés à partir de 0. En plus des noeuds correspondant aux
tokens, l'AnalysisGraph comprend deux noeuds "vides" (sans aucune
information attachée), les noeuds 0 et 1.</para>
<para>En français le tokenizer découpe selon les espaces et les
points, en traitant de manière intelligente les points qui
signalent une abbréviation. (ex. : dans <emphasis>C. Fluhr</emphasis>, le point après C n'est pas un point de fin de
phrase). Le tokenizer assigne à chaque token un <emphasis>statut de tokenization</emphasis> en fonction des caractères qu'il
contient.</para>
<blockquote>
<para>ex: Il a vu 27 fois Titanic à l'U.G.C. de CLERMONT.</para>
</blockquote>
</listitem>
</varlistentry>
</variablelist>
<table>
<title>Les tokens de la phrase exemple et leur statut de tokenisation</title>
<tgroup cols="2">
<thead>
<row>
<entry align="center">token</entry>
<entry align="center">statut</entry>
</row>
</thead>
<tbody>
<row>
<entry>Il</entry>
<entry>t_capital_1st</entry>
</row>
<row>
<entry>a</entry>
<entry>t_small</entry>
</row>
<row>
<entry>vu</entry>
<entry>t_small</entry>
</row>
<row>
<entry>27</entry>
<entry>t_integer</entry>
</row>
<row>
<entry>fois</entry>
<entry>t_small</entry>
</row>
<row>
<entry>Titanic</entry>
<entry>t_capital_1st</entry>
</row>
<row>
<entry>à</entry>
<entry>t_small</entry>
</row>
<row>
<entry>l'</entry>
<entry>t_small</entry>
</row>
<row>
<entry>U.G.C.</entry>
<entry>t_acronym</entry>
</row>
<row>
<entry>de</entry>
<entry>t_small</entry>
</row>
<row>
<entry>CLERMONT</entry>
<entry>t_capital</entry>
</row>
<row>
<entry>.</entry>
<entry>t_sentence_brk</entry>
</row>
</tbody>
</tgroup>
</table>
<figure>
<title>Un extrait du graphe AnalysisGraph après tokenisation</title>
<mediaobject>
<imageobject>
<imagedata fileref="resources/test1.tok.png" scalefit="1" width="100%" format="PNG" contentdepth="100%"/>
</imageobject>
</mediaobject>
</figure>
</section>
<section>
<title>SimpleWord : consultation du dictionnaire de langue</title>
<variablelist>
<varlistentry>
<term>Ressources utilisées</term>
<listitem>
<para>Dictionnaire de langue, table de caractères.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>Description</term>
<listitem>
<para>Il s'agit, pour chaque token, d'interroger le dictionnaire
de langue afin d'y récupérer la liste des catégories grammaticales
possibles à affecter au token. Dans le cas où le token n'existe
pas, on interroge le dictionnaire avec sa forme désaccentuée. Le
dictionnaire possède un lien vers les entrées réaccentuées, ce qui
permet de retrouver le mot d'origine.</para>
<blockquote>
<para>ex : "fois" donne les informations<footnote>
<para>Tous les exemples d'accès au dictionnaire de langue
sont réalisés à l'aide du programme
<code>composedDict</code>, par exemple avec la commande
"<code>composedDict --language=fre --dicoId=mainDictionary --key=fois</code>"</para>
</footnote> :</para>
<programlisting>DictionaryEntry : form="fois" final="false"
- has linguistic infos :
foundLingInfos : l="fois" n="fois"
foundProperties : GENDER=L_FEM, MACRO=L_NC, MICRO=L_NC_GEN, NUMBER=L_SING,
foundProperties : GENDER=L_FEM, MACRO=L_NC, MICRO=L_NC_GEN, NUMBER=L_PLUR,
foundProperties : GENDER=L_FEM, MACRO=L_NC, MICRO=L_NC_ATT_COD, NUMBER=L_SING,
foundProperties : GENDER=L_FEM, MACRO=L_NC, MICRO=L_NC_ATT_COD, NUMBER=L_PLUR,
foundProperties : GENDER=L_FEM, MACRO=L_NC, MICRO=L_NC_U_MESURE, NUMBER=L_SING,
foundProperties : GENDER=L_FEM, MACRO=L_NC, MICRO=L_NC_U_MESURE, NUMBER=L_PLUR,
endLingInfos
- has no concatenated infos
- has no accented forms</programlisting>
<para>"légéreté" n'existe pas dans le dictionnaire. En revanche,
sa désaccentuation "legerete" va donner les informations
suivantes :</para>
<programlisting>DictionaryEntry : form="legerete" final="false"
- has no linguistic infos
- has no concatenated infos
- has accented forms :
foundAccentedForm : form="légèreté"
foundLingInfos : l="légèreté" n="légèreté"
foundProperties : GENDER=L_FEM, MACRO=L_NC, MICRO=L_NC_GEN, NUMBER=L_SING,
foundProperties : GENDER=L_FEM, MACRO=L_NC, MICRO=L_NC_ATT_COD, NUMBER=L_SING,
endLingInfos
endAccentedForm
</programlisting>
</blockquote>
<para>Le dictionnaire peut également contenir des entrées
concaténées, comme "It's => It + is" en anglais. Dans ce cas,
le token est remplacé par 2 tokens, un pour chaque composant de
l'entrée concaténée.</para>
<para>La figure <xref linkend="figgraphsw"/> montre un extrait du
graphe après accès au dictionnaire. Pour chaque noeud, on voit son
numéro, sa forme de surface (tel qu'il apparaît dans le texte),
son lemme (forme du dictionnaire), la liste de ses catégories
possibles (ici les microcatégories, c'est à dire des catégories
plus fines nom ou verbe et qui donnent des informations sur la
position du token dans le texte, comme pré ou post-verbal, par
exemple) et les valeurs numériques des propréités linguistiques du
token. Ces valeurs numériques sont une représentation codée sur un
entier (donc compacte et rapide à manipuler) de l'ensemble des
informations morphologiques du token (macro et micro-catégorie,
temps, genre, nombre, etc.). Une API spéciale permet de manipuler
ces codes, accéder aux valeurs internes, etc.</para>
<para>Tous les tokens qui n'ont pas été trouvés dans le
dictionnaire, ni sous leur forme de surface ni dans leur forme
désaccentuée restent inchangés, c'est à dire sans informations
linguistiques.</para>
</listitem>
</varlistentry>
</variablelist>
<figure id="figgraphsw">
<title>Un extrait du graphe AnalysisGraph après accès au dictionnaire</title>
<mediaobject>
<imageobject>
<imagedata fileref="resources/test1.sw.png" contentdepth="100%" scalefit="1" width="100%"/>
</imageobject>
</mediaobject>
</figure>
</section>
<section>
<title>HyphenWord : découpage des mots à tirets</title>
<variablelist>
<varlistentry>
<term>Ressources utilisées</term>
<listitem>
<para>Dictionnaire de langue, table des caractères</para>
</listitem>
</varlistentry>
<varlistentry>
<term>Description de la tâche</term>
<listitem>
<para>Il s'agit, pour tous les mots à tirets (i.e. comportant un
'-') sans informations linguistiques, de les découper et chercher
chaque partie dans le dictionnaire. Attention, il est possible
qu'un mot à tiret existe dans le dictionnaire, par exemple
"plate-forme". Dans ce cas il est traité à l'étape précédente. Ici
ne sont traité que les mots qui n'ont pas déjà d'informations
linguistiques.</para>
<blockquote>
<para>ex: "israelo-palestinien" n'existe pas dans le
dictionnaire. Donc il sera découpé en "israelo" et "palestinien"
qui existent dans le dictionnaire.</para>
</blockquote>
<para>Le traitement vérifie également si le premier mot n'est
pas un préfixe connu. Les préfixes sont suivis d'un '-' dans le
dictionnaires. Par exemple, il existe une entrée "franco-" dans le
dictionnaire qui attribut des catégories différentes de "franco"
(sans '-' le mot pourrait être une réaccentuation vers un nom
propre alors que dans un mot à tiret c'est impossible, il est donc
important d'en tenir compte).</para>
</listitem>
</varlistentry>
</variablelist>
<figure>
<title>Exemple de graphe après traitement des mots à tirets</title>
<mediaobject>
<imageobject>
<imagedata fileref="resources/test2.hyphen.png" contentdepth="100%" width="100%" scalefit="1"/>
</imageobject>
</mediaobject>
</figure>
</section>
<section>
<title>Reconnaissance d'expression idiomatiques</title>
<variablelist>
<varlistentry>
<term>Ressources utilisées</term>
<listitem>
<para>Règles d'expressions idiomatiques</para>
</listitem>
</varlistentry>
<varlistentry>
<term>Description de la tâche</term>
<listitem>
<para>Cette tâche consiste à détecter plusieurs tokens qui
constituent une expression idiomatique et à les rassembler dans un
seul token.</para>
<blockquote>
<para>ex: Il a démarré sur les chapeaux de roues.</para>
<para>"sur les chapeaux de roues" est une expression
idiomatiques, les 5 tokens seront donc remplacé par 1 seul qui
recevra la catégorie adverbe.</para>
</blockquote>
<para/>
<para>L'exemple de la figure ci-dessus montre que les noeuds
d'origine sont conservés. Nous verrons plus loin que le lien entre
le nouveau noeud et ceux-ci est stocké dans un autre graphe,
appelé graphe d'annotation.</para>
<para>Une expression idiomatique peut être reconnues sur des
formes de surface contigues, comme l'exemple précédent, mais
également sur des lemmes, et pour des expressions non contigues.
C'est le cas de beaucoup d'expressions et aussi des verbes
pronominaux.</para>
<blockquote>
<para>ex: Il s'est trompé.</para>
<para>ici le verbe pronominal "se tromper" est une expression
idiomatique</para>
</blockquote>
<para>Une expression idiomatique peut être absolue ou non. Une
expression absolue, quand elle sera reconnue, sera remplacée par
un token, alors que si elle n'est pas absolue, on ajoutera une
alternative dans le graphe sans supprimer les noeuds de départ.
Certaines expressions idiomatiques ne sont pas absolues</para>
<blockquote>
<para>ex : Nous nous trompons, nous trompons nos maris, il n'y a
pas de raison.</para>
<para>"nous trompons" est une expression idiomatique qui
reconnait un verbe pronominal. Cette expression n'est pas
absolue. Dans le début de l'exemple il s'agit bien du verbe
pronominal, dans le deuxième cas non.</para>
</blockquote>
</listitem>
</varlistentry>
</variablelist>
<figure>
<title>Exemple de graphe après traitement des expressions idiomatiques</title>
<mediaobject>
<imageobject>
<imagedata fileref="resources/test3.ie.png" contentdepth="100%" width="100%" scalefit="1"/>
</imageobject>
</mediaobject>
</figure>
</section>
<section>
<title>Traitement des mots inconnus</title>
<variablelist>
<varlistentry>
<term>Ressources utilisées</term>
<listitem>
<para>Liste des catégories par défaut (default-fre.txt)</para>
</listitem>
</varlistentry>
<varlistentry>
<term>Description de la tâche</term>
<listitem>
<para>Ce traitement consiste à assigner à chaque token restant
sans aucune information linguistique des catégories par défaut en
fonction de son statut de tokenization. C'est à ce niveau que sont
traités les nombres en chiffres arabes et romain, mais également
les acronymes et tous les mots qui ne sont pas dans le
dictionnaire. Ainsi les mots commençant par une majuscule seront
étiquetés nom propre, ainsi que les acronymes. Les nombres
pourront recevoir les catégories déterminant numéral cardinal,
pronom numéral cardinal, etc.</para>
<para>L'association entre les statuts de tokenisation et les
catégories est effectuée au niveau des sources du dictionnaire
d'analyse.</para>
</listitem>
</varlistentry>
</variablelist>
</section>
<section>
<title>Reconnaissance d'entités nommées</title>
<variablelist>
<varlistentry>
<term>Ressources utilisées</term>
<listitem>
<para>Règles d'entitées nommées.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>Description de la tâche</term>
<listitem>
<para>La reconnaissance des entitées nommées consiste à identifier
les dates, lieu, heures, expressions numériques, produits,
évènements, organisations, présentes sur un ou plusieurs tokens,
et à les remplacer par un seul token. Contrairement au traitement
des expressions idiomatiques, le traitement des entitées nommées
conserve les anciens tokens. Cette reconnaissance se base sur un
ensemble de listes et de règles. On utilise des listes de lieu, de
prénoms, l'organisation, etc. Les règles permettent d'utiliser
cetains déclencheurs (comme "Monsieur ...", ou "la société ...".
La syntaxe complète de ces règles est décrite dans le document
<ulink url="specif_regles.html">Spécifications du format des règles pour la construction d'automates de reconnaissance d'expressions</ulink>. Il faut noter que le même moteur de règles
est utilisé aussi bien pour la reconnaissance des expressions
idiomatiques, l'analyse syntaxique en dépendances ou encore le
peuplement d'ontologies.</para>
<para>Dans le cas de l'analyse du Français, le traitement des
entitées nommées se trouve avant la désambiguisation, ce qui n'est
pas le cas dans toutes les autres langues.</para>
<blockquote>
<para>ex : Samedi 1er Avril, le président J. Chirac a reçu la
visite du chef d'état du Togo</para>
<para>Les entités nommées présentes dans cette phrase sont
:</para>
<itemizedlist>
<listitem>
<para>Samedi 1er Avril : DATE</para>
</listitem>
<listitem>
<para>J. Chirac : PERSON</para>
</listitem>
<listitem>
<para>Togo : LIEU</para>
</listitem>
</itemizedlist>
</blockquote>
<para>Il faut aussi noter que on peut étendre la notion au-delà
des pures entitées "nommées". On peut repérer de la meme manière
les entités spécifiques à un domaine ; on parle alors
d'Entités Spécifiques. Par exemple, dans le domaine aéronautique,
on aura des types d'entités comme "compagnie aérienne",
"constructeur aéronautique", "modèle d'avion", etc. Cette
acception n'est pas généralement répandue dans le domaine. En cas
de communication avec l'extérieur, il faut donc
l'expliciter.</para>
</listitem>
</varlistentry>
</variablelist>
<para>La description des entités nommées est l'occasion d'introduire une
structure de données utilisée en divers endroits de l'analyse, le graphe
d'annotation ou AnnotationGraph. Il s'agit d'un graphe dont les noeuds
et les arcs portent des annotations nommées, chaque annotation contenant
un objet quelconque grâce à l'utilisation de la bibliothèque
<code>boost</code><footnote>
<para>boost est une collection de bibliothèques C++ développées dans
l'optique d'être intégrées à une future version de la bibliothèque
standards du C++. Les outils qu'elle contient comportent entre
autres une bibliothèque de reconnaissance d'expressions régulières,
une bibliothèque de gestion des dates et heures ou encore une
bibliothèque de gestion de graphes. C'est d'ailleurs cette Boost
Graph Library (BGL) qui est utilisée dans LIMA pour stocker tous les
graphes manipulés.</para>
</footnote> <code>boost::any</code>.</para>
<para><figure id="figannotgraph">
<title>Un exemple de graphe d'annotation</title>
<mediaobject>
<imageobject>
<imagedata fileref="resources/test1.ag.png" contentdepth="100%" width="100%" scalefit="1"/>
</imageobject>
</mediaobject>
</figure>L'AnnotationGraph est un outil générique. Dans le cadre de
LIMA, nous avons décidé d'insérer un noeud pour chaque noeud des graphes
AnalysisGraph et PosGraph. Chacun de ces noeuds portent une annotation
indiquant le graphe et le noeud auquel il correspond. Dans la figure
<xref linkend="figannotgraph"/>, on voit que le noeud 24 correspond au
noeud 7 du PosGraph.</para>
<para><figure>
<title>Extraits de graphes en rapport avec la reconnaissance d'entités nommées</title>
<mediaobject>
<imageobject>
<imagedata fileref="resources/test5.ne.png" contentdepth="100%" width="100%" scalefit="1"/>
</imageobject>
</mediaobject>
</figure>La figure montre en haut un extrait de l'AnalysisGraph avant
reconnaissance des entités nommées, en bas à droite le même graphe après
et à gauche l'extrait de graphe d'annotation correspondant. On peut y
voir que les noeuds 2, 3 et 4 de l'AnalysisGraph ont été remplacés par
le noeud 9. Cette information se retrouve dans l'annotation nommée
SpecificEntity du graphe d'annotation, dans son attribut vertices. De
même, les noeuds du graphe d'annotation correspondant aux noeuds 2, 3 et
4 du graphe d'analyse (ici 2, 3 et 4 aussi) sont reliés par un arc
annoté "belongstose" au noeud correspondant à celui de l'entité
nommée.</para>
</section>
<section>
<title>Désambiguisation (PoS Tagging)</title>
<variablelist>
<varlistentry>
<term>Ressources utilisées</term>
<listitem>
<para>Matrices de désambiguisations : trigrammes et
bigrammes</para>
</listitem>
</varlistentry>
<varlistentry>
<term>Description de la tâche</term>
<listitem>
<para>Cette tâche consiste à sélectionner la (ou les) catégorie(s)
valide(s) parmis toutes les catégories grammaticales issues de
l'analyse morphologique. Pour celà on utilise une matrice de
trigrammes et de bigrammes, pondérés par leur fréquence. Ces
matrices sont issues d'un texte annoté. Le programme permet de ne
garder que les catégories possibles, voire uniquement la catégorie
la plus probable.</para>
<blockquote>
<para>ex: "La belle porte le voile."</para>
<programlisting>1 | La | le#DET
4 | belle | belle#NC
10 | porte | porter#V
16 | le | le#DET
19 | voile | voile#NC
24 | . | .#PONCTU_FORTE
</programlisting>
<para>Cet exemple est intéressant car il est très ambigu.
'belle' peut être ADJ ou NC, 'porte' peut être NC ou V, 'voile'
peut être NC ou V. L'ambiguité ne peut pas être levée
entièrement par la syntaxe, car il existe 2 interprétations
possibles toutes deux valides grammaticalement : une belle femme
portant le voile, ou une belle porte, en bois massif avec des
sculptures qui voilerait quelquechose. Cette interprétation est
plus difficile mais la structure de phrase est tout à fait
correcte.</para>
<para>Ici on a configuré le POS Tagger de façon à ce qu'il ne
garde que la possibilité la plus fréquente.</para>
<para>Regardons maintenant : "La belle porte le retient." Ici
retient ne peut plus être NC mais seulement verbe.</para>
<programlisting>1 | La | le#DET
4 | belle | bel#ADJ
10 | porte | porte#NC
16 | le | le#PRON
19 | retient | retenir#V
26 | . | .#PONCTU_FORTE</programlisting>
<para>L'exemple montre que la tâche de désambiguisation est
globale. 'retient' ne peut plus être que Verbe, 'porte' devient
donc NC et 'belle' ADJ.</para>
</blockquote>
<para>En cas d'erreur de désambiguïsation, un des premiers
réflexes à avoir est de s'assurer que les bigrammes et trigrammes
prévus sont bien présents dans la matrice de désambiguisation. Si
ce n'est pas le cas, il faut enrichir le corpus d'apprentissage
avec de nouvelles phrases contenant ces n-grammes. Cf. plus loin
la section <xref lang="" linkend="secdisambmatrices"/>.</para>
<para>Du point de vue des structures de données manipulées, cette
étape génère un nouveau graphe, du même format que l'AnalysisGraph
mais dont chaque noeud a une et une seule microcatégorie. Notons
que les noeuds peuvent malgré tout avoir plusieurs codes car cette
étape ne désambiguise que la microcatégorie et non les autres
attributs comme le genre, le temps ou le nombre. Le nouveau graphe
s'appelle le PosGraph.</para>
<para>C'est à ce niveau que les nombres qui apparaissent sur les
arcs des graphes prennent leur sens : il s'agit des
trigrammes et bigrammes de micro-catégories (dans leur forme
codée) qui ne sont pas présents dans les matrices. Ainsi, cette
information peut permettre de comprendre pourquoi une
interprétation est choisie plutôt qu'une autre et de compléter
éventuellement le corpus d'apprentissage avec un morceau de texte
permettant de compléter les matrices.</para>
</listitem>
</varlistentry>
</variablelist>
<figure>
<title>Exemple de graphe après désambiguisation (PosGraph)</title>
<mediaobject>
<imageobject>
<imagedata fileref="resources/test4.pos.png" contentdepth="100%" width="100%" scalefit="1"/>
</imageobject>
</mediaobject>
</figure>
</section>
<section>
<title>Reconnaissance des chaînes nominales et verbales</title>
<variablelist>
<varlistentry>
<term>Ressources utilisées</term>
<listitem>
<para>Matrice de chaînes nominales et verbales.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>Description de la tâche</term>
<listitem>
<para>Il s'agit d'identifier les groupes nominaux et groupes
verbaux. En fait, les groupes dont il s'agit ici vont au delà de
l'acception habituelle puisque les chaînes relient tous les noeuds
en relation plus ou moins lointaine avec un nom pour une chaîne
nominale ou avec un verbe pour une chaîne verbale. Ces chaînes
sont utilisés lors de la construction des mots composés pour
éviter de construire des termes contenant des mots issus de
chaînes différentes.</para>
<para>Les chaînes sont définies par un ensemble de catégories
pouvant les débuter (la catégorie article défini est dans cet
ensemble pour les chaînes nominales en français, par exemple), un
ensemble de catégories pouvant les terminer (nom commun, par
exemple) et u ensemble de transitions possible entre catégories
(la transition article défini -> nom commun est possible en
français). L'algorithme utilisé est assez complexe puisqu'il doit
trouver tous les chemins de chaînes possibles dans le graphe en
évitant les chaînes trop courtes ou inclues les unes dans les
autres.</para>
</listitem>
</varlistentry>
</variablelist>
<para>Ce module est hérité des versions précédentes de l'analyseur. Il
pourrait probablement être supprimé au prix d'un certain
refactoring.</para>
</section>
<section>
<title>Analyse des dépendances syntaxiques</title>
<variablelist>
<varlistentry>
<term>Ressources utilisées</term>
<listitem>
<para>Règles d'analyse syntaxique</para>
</listitem>
</varlistentry>
<varlistentry>
<term>Description de la tâche</term>
<listitem>
<para>L'analyse des dépendances syntaxiques s'appuie sur des
règles qui permettent la reconnaissance des dépendances
syntaxiques en fonctions des catégories grammaticales des termes.
Ces règles sont encore une fois décrites à l'aide de la syntaxe
décrite dans le document <ulink url="specif_regles.html">Spécifications du format des règles pour la construction d'automates de reconnaissance d'expressions</ulink>. On y utilise particulièrement le mécanisme
d'expression de contraintes, pour vérifier des choses comme la non
préexistance d'une relation de dépendance entre les noeuds
concernés (pour éviter des bouclages infinis), les accords en
nombre et en genre entre éléments, etc.</para>
<para>Les relations de dépendances sont stockées dans une
structure de données dédiée (nommée DepGraph dans l'AnalysisData)
qui est un graphe Boost contenant un noeud pour chaque noeud du
graphe PosGraph et un arc pour chaque relation de dépendance
trouvée. Les arcs ont pour unique propriété le nom de la relation
de dépendance qu'ils portent.</para>
<para><programlisting>@PrepComp:(@NomCommun|@Inc) (@AdverbePositifDansChaineNominale|@AdjPost|@DetNum|@PrepComp|@NomPropre){0-3}
(@NomPropre)?:((@DetIndef)? @Determinant)? (@AdverbePositifDansChaineNominale|@AdjPren|@Prefixe){0-n}
((@Prenom){0-n} (de (la)?)?)? (@NomCommun|@NomPropre|@Inc|$L_ADJ-L_ADJ_QUALIFICATIF_EPITHETE_DETACHEE)
:COMPDUNOM:
+!GovernorOf(left.1,"SUBSUBJUX")
+SecondUngovernedBy(right.4,left.1,"ANY")
+SecondUngovernedBy(trigger.1,right.4,"ANY")
+CreateRelationBetween(right.4,left.1,"COMPDUNOM")
+CreateRelationBetween(trigger.1,right.4,"PREPSUB")
=>AddRelationInGraph()
=<ClearStoredRelations()</programlisting>Le listing ci-dessus montre une
règle utilisée pour repérer les compléments du nom, comme dans
<code>chat vraiment bête de la très gentille voisine</code>. Dans
ce cas, cette règle permettra de créer la relation COMPDUNOM de
voisine vers chat comme on peut le voir sur la <xref linkend="figdepgraph"/>.</para>
<para>On remarquera l'utilisation de la contraine
<code>!GovernorOf</code> qui vérifie que le nom qui sera la cible
de la relation n'est pas source d'une relation entre noms
juxtaposés (car dans ce cas c'est le nom cible de cette dernière
qui doit être cible de la complémetation). On voit aussi
l'utilisation de deux fois la contrainte
<code>CreateRelationBetween</code>. Celle-ci crée la relation
indiquée dès que les deux noeuds concernés sont trouvés durant la
recherche et la stocke dans une structure temporaire. Si la règle
est finalement validée, les relations stockées sont finalement
ajoutées au graphe (action de succès
<code>AddRelationInGraph</code>); sinon, elles sont oubliées
(action d'échec <code>ClearStoredRelations</code>).</para>
<para>Les règles d'analyse syntaxique ne sont pas toutes dans un
seul fichier de règles. En fait, elles ne sont même pas toutes
dans un unique ProcessUnit (élément du pipeline). Les règles sont
réparties en plusieurs ProcessUnit et plusieurs actions dans
chacun d'eux pour des raisons de clarté ou parce que certaines
dépendances doivent obligatoirement être trouvées avant d'autre
pour servir de support à l'analyse.</para>
</listitem>
</varlistentry>
</variablelist>
<figure id="figdepgraph">
<title>Exemple de graphe de dépendances</title>
<mediaobject>
<imageobject>
<imagedata fileref="resources/test6.sa.png" contentdepth="100%" width="100%" scalefit="1"/>
</imageobject>
</mediaobject>
</figure>
</section>
<section>
<title>Extraction de mots composés</title>
<variablelist>
<varlistentry>
<term>Ressources utilisées</term>
<listitem>
<para>Les relations de dépendance trouvées par l'analyse
syntaxique à exploiter.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>Description de la tâche</term>
<listitem>
<para>Il s'agit d'extraire les termes complexes présents dans les
textes, en général des noms composés, comme <emphasis>ressources en eau</emphasis> ou <emphasis>la table des caractères de la langue en UTF8</emphasis>. Cette extraction dépend des relations
de dépendance entre les termes. Une liste de type de relations à
utiliser est fixée. Il s'agit des relations liant les mots dits
pleins<footnote>
<para>Un mot plein est un mot qui porte une information
sémantique en lui-même. On classe en général comme mots pleins
le noms, les verbes et les adjectifs. Par contraste, les mots
vides sont ceux qui ne réfèrent pas directement un concept,
comme les articles ou les prépositions, par exemple.</para>
</footnote> dans les syntagmes nominaux. Les éléments trouvés
aux extrémités de ces relations sont notés comme des parties du
mot composé. Le résultat de l'extraction est stocké dans le graphe
d'annotation. La figure <xref linkend="figannotgraph"/> plus haut
montre un extrait de graphe d'annotation représentant un mot
composé (ou <foreignphrase>compound</foreignphrase>).</para>
<para>Lors d'une analyse avec production des données pour
l'indexation (réglage par défaut des outils analyzeText et
analyzeXmlDoxument), ces mots composés sont convertis en BoWTerms
récursif ayant, à chaque niveau, pour tête la cible des relations
de ce niveau et pour extensions les sources de ces relations,
sources qui peuvent elles-même être têtes de termes complexes si
elles sont cibles de relations dans le graphe. Avec l'exemple
ci-dessus, on obtient le BoWTerm suivant (les étoiles représentent
les têtes) : <code>(table* (caractère* langue UTF8) )</code>,
en supposant que <emphasis>langue</emphasis> et
<emphasis>UTF8</emphasis> sont compléments de
<emphasis>caractère</emphasis> et <emphasis>caractère</emphasis>
complément de <emphasis>table</emphasis>.</para>
</listitem>
</varlistentry>
</variablelist>
</section>
</section>
<section>
<title>Autres traitements linguistiques</title>
<section>
<title>Desagglutination (allemand)</title>
<variablelist>
<varlistentry>
<term>Ressources utilisées</term>
<listitem>
<itemizedlist>
<listitem>
<para><foreignphrase>desagglutination categories</foreignphrase> : liste des correspondances de
catégories pour la désagglutination</para>
</listitem>
<listitem>
<para><foreignphrase>desagglutination delimiters</foreignphrase> : liste des délimiteurs possibles
entres les agglutinations</para>
</listitem>
</itemizedlist>
</listitem>
</varlistentry>
<varlistentry>
<term>Description de la tâche</term>
<listitem>
<para>Ce traitement consiste à chercher si un token est une
agglutination de plusieurs tokens, éventuellement séparés par un
délimiteur. Les tokens sont cherchés dans le dictionnaire de
langue, les délimiteurs possibles sont spécifiés dans une
ressource. Les mots agglutinés sont des mots pleins. Concrètement,
le mot global prend les catégories possibles du dernier composant
agglutiné. Ces catégories sont exploitées par le désambiguiseur,
puis un second traitement (DesagglutionExpander) permet de séparer
les composant afin d'extraire les parties.</para>
</listitem>
</varlistentry>
</variablelist>
<blockquote>
<para>ex : Vorlesungsbetrieb => Vorlesung + (s) + betrieb</para>
<para>'Vorlesung' et 'betrieb' sont 2 mots pleins du dictionnaire.
'betrieb' peut être V ou NC, le mot agglutiné prend les catégories
possible du dernier composant, donc V ou NC.</para>
</blockquote>
</section>
<section>
<title>HyperwordStemmer (arabe)</title>
<variablelist>
<varlistentry>
<term>Ressources utilisées</term>
<listitem>
<para>Dictionnaires de proclitiques, d'enclitiques et de radicaux
(dictionnaire de langue).</para>
</listitem>
</varlistentry>
<varlistentry>
<term>Description de la tâche</term>
<listitem>
<para>Ce traitement est utilisé pour décomposer les mots formés
avec un proclitique, un enclitique et un radical. Les proclitiques
et enclitiques sont extraits de dictionnaires spécifiques.</para>
</listitem>
</varlistentry>
</variablelist>
</section>
<section>
<title>ChineseSegmenter (chinois)</title>
<variablelist>
<varlistentry>
<term>Ressources utilisées</term>
<listitem>
<para>Dictionnaire de langue</para>
</listitem>
</varlistentry>
<varlistentry>
<term>Description de la tâche</term>
<listitem>
<para>Ce traitement est utilisé pour proposer des découpages des
phrases en chinois. Le principe est de découper la phrase au fur
et à mesure avec des mots trouvés dans le dictionnaire. On ne
retient que les découpages contenant un nombre minimal de mots,
avec une tolérance paramétrable (par exemple pour une tolérance de
1 si le chemin minimal contient 5 mots, on retient les chemins de
longueur 5 et 6). Les segmentations extraires sont ensuite
filtrées par la désambiguisation. Une variante est utilisée pour
le japonais.</para>
</listitem>
</varlistentry>
</variablelist>
</section>
</section>
<section>
<title>Les Ressources</title>
<section>
<title>Table de caractères et automate de découpage</title>
<para>Il s'agit du fichier 'tokenizerAutomaton-fre.xml'. Ce fichier
contient la table des caractères de la langue en UTF8, et pour chaque
caractère sa désaccentuation.</para>
<para>On y trouve également la définition de l'automate de découpage, au
format XML. Sa structure est assez complexe. Un refactoring est
prévu.</para>
</section>
<section>
<title>Dictionnaire de langue</title>
<para>Le dictionnaire de langue contient pour chaque mot de la langue,
l'ensemble des informations linguistiques possible pour ce mot. Les
informations linguistiques peuvent être :</para>
<itemizedlist>
<listitem>
<para>lemme, forme normalisée, propriétés linguistiques (genre,
nombre, catégories grammaticales)</para>
<programlisting>intérogation du dictionnaire pour le mot : "cours" :
foundLingInfos : l="cour" n="cour"
foundProperties : GENDER=L_FEM, MACRO=L_NC, MICRO=L_NC_GEN, NUMBER=L_PLUR,
foundProperties : GENDER=L_FEM, MACRO=L_NC, MICRO=L_NC_ATT_COD, NUMBER=L_PLUR,
foundProperties : GENDER=L_FEM, MACRO=L_NC, MICRO=L_NC_ANNONCEUR_SOCIETE, NUMBER=L_PLUR,
foundProperties : GENDER=L_FEM, MACRO=L_NC, MICRO=L_NC_ANNONCEUR_NOM, NUMBER=L_PLUR,
endLingInfos
foundLingInfos : l="courir" n="courir"
foundProperties : MACRO=L_V, MICRO=L_VERBE_PRINCIPAL_INDICATIF, NUMBER=L_SING, PERSON=L_1, SYNTAX=L_TRANS, TIME=L_PRES,
foundProperties : MACRO=L_V, MICRO=L_VERBE_PRINCIPAL_INDICATIF, NUMBER=L_SING, PERSON=L_2, SYNTAX=L_TRANS, TIME=L_PRES,
foundProperties : MACRO=L_V, MICRO=L_VERBE_PRINCIPAL_INDICATIF, NUMBER=L_SING, PERSON=L_1, SYNTAX=L_INTRANS, TIME=L_PRES,
foundProperties : MACRO=L_V, MICRO=L_VERBE_PRINCIPAL_INDICATIF, NUMBER=L_SING, PERSON=L_2, SYNTAX=L_INTRANS, TIME=L_PRES,
foundProperties : MACRO=L_V, MICRO=L_VERBE_PRINCIPAL_IMPERATIF, NUMBER=L_SING, PERSON=L_2, SYNTAX=L_TRANS, TIME=L_PRES,
foundProperties : MACRO=L_V, MICRO=L_VERBE_PRINCIPAL_IMPERATIF, NUMBER=L_SING, PERSON=L_2, SYNTAX=L_INTRANS, TIME=L_PRES,
endLingInfos
foundLingInfos : l="cours" n="cours"
foundProperties : GENDER=L_MASC, MACRO=L_NC, MICRO=L_NC_GEN, NUMBER=L_SING,
foundProperties : GENDER=L_MASC, MACRO=L_NC, MICRO=L_NC_GEN, NUMBER=L_PLUR,
foundProperties : GENDER=L_MASC, MACRO=L_NC, MICRO=L_NC_ATT_COD, NUMBER=L_SING,
foundProperties : GENDER=L_MASC, MACRO=L_NC, MICRO=L_NC_ATT_COD, NUMBER=L_PLUR,
foundProperties : GENDER=L_FEM, MACRO=L_NC, MICRO=L_NC_ANNONCEUR_LIEU, NUMBER=L_SING,
foundProperties : GENDER=L_FEM, MACRO=L_NC, MICRO=L_NC_ANNONCEUR_SOCIETE, NUMBER=L_SING,
foundProperties : GENDER=L_FEM, MACRO=L_NC, MICRO=L_NC_ANNONCEUR_SOCIETE, NUMBER=L_PLUR,
foundProperties : GENDER=L_FEM, MACRO=L_NC, MICRO=L_NC_ANNONCEUR_NOM, NUMBER=L_SING,
foundProperties : GENDER=L_FEM, MACRO=L_NC, MICRO=L_NC_ANNONCEUR_NOM, NUMBER=L_PLUR,
endLingInfos
</programlisting>
</listitem>
<listitem>
<para>forme concaténée, dans ce cas chaque composant est
décrit</para>
<programlisting>foundConcatenated
foundComponent : form="it" pos="0" len="2"
foundLingInfos : l="it" n="it"
foundProperties : MACRO=L_PRON, MICRO=L_PRONOM_PERSONNEL_IT,
endLingInfos
endComponent
foundComponent : form="'s" pos="2" len="2"
foundLingInfos : l="be" n="be"
foundProperties : MACRO=L_V, MICRO=L_IS,
endLingInfos
foundLingInfos : l="have" n="have"
foundProperties : MACRO=L_V, MICRO=L_HAS,
endLingInfos
endComponent
endConcatenated
</programlisting>
</listitem>
<listitem>
<para>lien vers une forme réaccentuée du mot.</para>
<programlisting>foundAccentedForm : form="évite"
foundLingInfos : l="éviter" n="éviter"
foundProperties : MACRO=L_V, MICRO=L_VERBE_PRINCIPAL_INDICATIF, NUMBER=L_SING, PERSON=L_1, SYNTAX=L_TRANS, TIME=L_PRES,
foundProperties : MACRO=L_V, MICRO=L_VERBE_PRINCIPAL_INDICATIF, NUMBER=L_SING, PERSON=L_3, SYNTAX=L_TRANS, TIME=L_PRES,
foundProperties : MACRO=L_V, MICRO=L_VERBE_PRINCIPAL_INDICATIF, NUMBER=L_SING, PERSON=L_1, SYNTAX=L_INTRANS, TIME=L_PRES,
foundProperties : MACRO=L_V, MICRO=L_VERBE_PRINCIPAL_INDICATIF, NUMBER=L_SING, PERSON=L_3, SYNTAX=L_INTRANS, TIME=L_PRES,
foundProperties : MACRO=L_V, MICRO=L_VERBE_PRINCIPAL_INDICATIF, NUMBER=L_SING, PERSON=L_1, SYNTAX=L_PRONOMINAL, TIME=L_PRES,
foundProperties : MACRO=L_V, MICRO=L_VERBE_PRINCIPAL_INDICATIF, NUMBER=L_SING, PERSON=L_3, SYNTAX=L_PRONOMINAL, TIME=L_PRES,
foundProperties : MACRO=L_V, MICRO=L_VERBE_PRINCIPAL_SUBJONCTIF, NUMBER=L_SING, PERSON=L_1, SYNTAX=L_TRANS, TIME=L_PRES,
foundProperties : MACRO=L_V, MICRO=L_VERBE_PRINCIPAL_SUBJONCTIF, NUMBER=L_SING, PERSON=L_3, SYNTAX=L_TRANS, TIME=L_PRES,
foundProperties : MACRO=L_V, MICRO=L_VERBE_PRINCIPAL_SUBJONCTIF, NUMBER=L_SING, PERSON=L_1, SYNTAX=L_INTRANS, TIME=L_PRES,
foundProperties : MACRO=L_V, MICRO=L_VERBE_PRINCIPAL_SUBJONCTIF, NUMBER=L_SING, PERSON=L_3, SYNTAX=L_INTRANS, TIME=L_PRES,
foundProperties : MACRO=L_V, MICRO=L_VERBE_PRINCIPAL_SUBJONCTIF, NUMBER=L_SING, PERSON=L_1, SYNTAX=L_PRONOMINAL, TIME=L_PRES,
foundProperties : MACRO=L_V, MICRO=L_VERBE_PRINCIPAL_SUBJONCTIF, NUMBER=L_SING, PERSON=L_3, SYNTAX=L_PRONOMINAL, TIME=L_PRES,
foundProperties : MACRO=L_V, MICRO=L_VERBE_PRINCIPAL_IMPERATIF, NUMBER=L_SING, PERSON=L_2, SYNTAX=L_TRANS, TIME=L_PRES,
foundProperties : MACRO=L_V, MICRO=L_VERBE_PRINCIPAL_IMPERATIF, NUMBER=L_SING, PERSON=L_2, SYNTAX=L_INTRANS, TIME=L_PRES,
foundProperties : MACRO=L_V, MICRO=L_VERBE_PRINCIPAL_IMPERATIF, NUMBER=L_SING, PERSON=L_2, SYNTAX=L_PRONOMINAL, TIME=L_PRES,
endLingInfos
endAccentedForm
foundAccentedForm : form="évité"
foundLingInfos : l="éviter" n="éviter"
foundProperties : GENDER=L_MASC, MACRO=L_V, MICRO=L_VERBE_PRINCIPAL_PARTICIPE_PASSE, NUMBER=L_SING, SYNTAX=L_TRANS, TIME=L_PASS,
foundProperties : GENDER=L_MASC, MACRO=L_V, MICRO=L_VERBE_PRINCIPAL_PARTICIPE_PASSE, NUMBER=L_SING, SYNTAX=L_INTRANS, TIME=L_PASS,
foundProperties : GENDER=L_MASC, MACRO=L_V, MICRO=L_VERBE_PRINCIPAL_PARTICIPE_PASSE, NUMBER=L_SING, SYNTAX=L_PRONOMINAL, TIME=L_PASS,
foundProperties : GENDER=L_MASC, MACRO=L_V, MICRO=L_VERBE_PRINCIPAL_PARTICIPE_ATTRIBUT, NUMBER=L_SING, SYNTAX=L_TRANS, TIME=L_PASS,
foundProperties : GENDER=L_MASC, MACRO=L_V, MICRO=L_VERBE_PRINCIPAL_PARTICIPE_ATTRIBUT, NUMBER=L_SING, SYNTAX=L_PRONOMINAL, TIME=L_PASS,
endLingInfos
foundLingInfos : l="évité" n="évité"
foundProperties : GENDER=L_MASC, MACRO=L_ADJ, MICRO=L_ADJ_QUALIFICATIF_EPITHETE_POSTN, NUMBER=L_SING,
foundProperties : GENDER=L_MASC, MACRO=L_ADJ, MICRO=L_ADJ_QUALIFICATIF_EPITHETE_DETACHEE, NUMBER=L_SING,
foundProperties : GENDER=L_MASC, MACRO=L_ADJ, MICRO=L_ADJ_QUALIFICATIF_ATT_DU_S, NUMBER=L_SING,
foundProperties : GENDER=L_MASC, MACRO=L_ADJ, MICRO=L_ADJ_QUALIFICATIF_ATT_DU_COD, NUMBER=L_SING,
endLingInfos
endAccentedForm</programlisting>
</listitem>
</itemizedlist>
<para>Le dictionnaire binaire utilisé pendant l'analyse est généré à
partir d'une liste de mots simples qui sont fléchis de façon à produire
l'ensemble des formes possibles de la langue. Cette liste de forme est
ensuite enrichie de diverses informations puis compilée. L'ensemble de
cette procédure fera l'objet d'un document séparé, encore à
écrire...</para>
</section>
<section>
<title>Expressions idiomatiques</title>
<para>Les expressions idiomatiques sont des automates, au même titre que
les règles de reconnaissance des entitées nommées et de l'analyse
syntaxique ci-après. Seulement, nous disposons d'un format d'entrée
simplifié :</para>
<programlisting>D;;A;Porto;Porto Rico;nom propre féminin;
D;;A;[S]&Ministre;[J]Premier [S]&Ministre;nom masculin;Premier Ministre
D;;;beau;[V]&avoir (D) beau faire;verbe intransitif;avoir beau faire
</programlisting>
<para>Dans ce format, on trouve plusieurs champs séparés par des
';'.</para>
<itemizedlist>
<listitem>
<para>1er champ : un identifiant indiquant la
provenance ;</para>
</listitem>
<listitem>
<para>2ème champ : non utilisé ;</para>
</listitem>
<listitem>
<para>3ème champ : A indique une expression idiomatique
absolue ;</para>
</listitem>
<listitem>
<para>4ème champ : le déclencheur : token de l'expression
déclencheur de la règle ;</para>
</listitem>
<listitem>
<para>5ème champ : l'expression idiomatique ;</para>
</listitem>
<listitem>
<para>6ème champ : la catégorie grammaticale ;</para>
</listitem>
<listitem>
<para>7ème champ : la normalisation.</para>
</listitem>
</itemizedlist>
</section>
<section id="secdisambmatrices">
<title>Matrices de désambiguisation</title>
<para>Les matrices de désambiguisation sont un ensemble de trigrammes
(ou de bigrammes) accompagnés de leur fréquence. Un trigramme est une
succession possible de 3 catégories grammaticales. Pour construire ces
ressources linguistiques nous utilisont des corpus annotés et
désambiguisés, c'est à dire où pour chaque token on précise la bonne
catégorie grammaticale.</para>
<para>Exemple : extrait de corpus annoté</para>
<programlisting>le Dad
plan Ncg
de Ss
fermeture Ncg
de Sg
l' Dad
usine Ncg
</programlisting>
<para>De ce texte annoté sont extraits les successions de catégories,
qui seront ensuite regroupées et comptabilisés dans les matrices de
trigrammes et bigrammes. La correspondance entre les noms de catégories
utilisés dans ces corpus et les noms de catégories internes sont
indiquées dans un fichier nommé <code>code_symbolic2lic2m.txt</code>
présent dans le même répertoire que le fichier du corpus.</para>