Les rôles grammaticaux

Tous les mots n'ont pas la même fonction dans la phrase, chaque mot a un rôle grammatical propre qui indique la façon dont il participe à la construction du sens. Ainsi les déterminants (le, la, les, ...) ne jouent pas un rôle aussi crucial que les noms communs ("champion", "médaille", "concours", ...). Ils font parti de l'outillage grammatical qui permet de faire collaborer les mots afin de produire du sens.

Dans le cadre de cette séance de TP, je propose de travailler sur les catégories grammaticales suivantes :

  • l'article, le déterminant : le, la, les, l', un, une, des, ...
  • le nom : médaille, champion, podium, éléphant, ...
  • l'adjectif : grande, téméraire, puissant, ordonnée, ...
  • le pronom : je, me, moi, se, ...
  • le verbe : manger, courir, être, penser, ...
  • l'adverbe : lentement, doucement, rapidement, ...
  • la préposition : à, en, sur, sous, sans, avec, ...
  • la conjonction : mais, ou, et, donc, ...

Les mots de chacune de ces catégories ont une fonction propre dans la phrase : qualifier le nom, faire référence à une personne ou un objet, décrire l'action ou l'état, coordonner des propositions... Si vous voulez en savoir plus, vous pouvez aller lire ceci.

Il est possible de lister de manière exhaustive (ou suffisamment exhaustive) les mots de certaines catégories grammaticales : les déterminants, les pronoms, les conjonctions et dans une certaine mesure les prépositions. Toutefois, il est très difficile de lister les noms, les verbes, les adjectifs ou encore les adverbes ; et ce pour deux raisons : les mots pouvant prendre ces rôles sont très nombreux et il est possible d'en générer une quasi-infinité de nouveaux, par composition notamment.

Lister les mots des catégories déterminant, pronom, conjonction et préposition

Même si l'ont peut donner une liste quasi-exhaustive des mots qui appartiennent aux catégories grammaticales déterminant, pronom, conjonction et préposition ; il peut être difficile de réaliser ces listes de tête.

Encore une fois, le corpus peut-être d'un grand secours. En effet, du fait de la combinaison de leur nombre réduit (par comparaison aux noms et verbes par exemple) et de leur rôle primordial dans la phrase, ces mots sont sont parmi les mots les plus fréquents. Un simple comptage d'occurrence permet donc d'en découvrir un certain nombre :

import codecs
# Chargement du corpus prétraité (découpé en mots)
fh = codecs.open("Discours-Sarkozy-v20111025.preproc.txt", "r", "utf-8")
words   = fh.read().split()
fh.close()
# Comptage des mots
from nltk import FreqDist
fd = FreqDist()
for w in words:
	fd.inc(w.lower())
# Affichage du Top 50 avec leur nombre d'occurrence
fd.items()[:50]
 
[(u',', 111161), (u'de', 83656), (u'.', 76146), (u'la', 57608), 
(u"l'", 41454), (u'et', 38519), (u'le', 37246), (u'les', 35018),
(u'que', 33457), (u'\xe0', 31767), (u'est', 29416), (u'des', 27233),
(u"d'", 26458), (u'je', 21483), (u'qui', 21432), (u'en', 21317),
(u'pas', 20128), (u'un', 19782), (u'pour', 18374), (u'il', 17286),
(u'une', 16512), (u'nous', 16031), (u"c'", 15082), (u'a', 14891),
(u'dans', 13862), (u'on', 13849), (u'vous', 13799), (u'du', 13605),
(u'ne', 13502), (u'ce', 13231), (u"qu'", 12629), (u"n'", 12400),
(u'au', 9723), (u'plus', 9494), (u'y', 7980), (u'sur', 7845), 
(u'france', 7687), (u'mais', 7638), (u'avec', 6869), (u':', 6556),
(u"j'", 6408), (u'se', 5870), (u"s'", 5809), (u'sont', 5791), 
(u'par', 5724), (u'cela', 5536), (u'cette', 5430), (u'ont', 5230),
(u'aux', 5145), (u'si', 5009)]

Cette approche combinée à notre connaissance de la grammaire française nous permet de constituer assez rapidement la liste des mots de chacune des catégories déterminant, pronom, conjonction et préposition.

Cette approche n'est toutefois pas satisfaisant pour les "puristes", notamment car le corpus est loin d'être représentatif de la langue mais également car nous nous limitons ici aux mots et négligeons les locutions.

Voici néanmoins une proposition de liste construite de cette manière :

# Proposition de liste non exhaustive de mots pour les rôles grammaticaux
# déterminants, pronoms, conjonctions et prépositions
dico = {
	# ARTICLES / DETERMINANTS
	"DET": ["le", "la", "les", "l'", "un", "une", "des", "d'",
		"du", "de", "au", "aux", "ce", "cet", "cette", "ces",
		"mon", "son", "ma", "ta", "sa", "mes", "ses",
		"notre", "votre", "leur", "nos", "vos", "leurs",
		"aucun", "aucune", "aucuns", 
		"tel", "telle", "tels", "telles",
		"tout", "toute", "tous", "toutes",
		"chaque"],
	# PRONOM
	"PRO": ["je", "tu", "il", "elle", "on", "nous", "vous", "ils", "elles",
		"me", "m'", "moi", "te", "t'", "toi",
		"se", "y", "le", "lui", "soi", "leur", "eux", "lui",
		"qui", "que", "quoi", "dont" "où"],
	# CONJONCTION
	"CONJ": ["mais", "ou", "et", "donc", "or", "ni", "car",
		"que", "quand", "comme", "si",
		"lorsque", "quoique", "puisque"],
	# PREPOSITION
	"PREP": ["à", "derrière", "malgré", "sauf",
		"selon", "avant", "devant", "sous", "avec", 
		"en", "par", "sur", "entre", "parmi", 
		"envers", "pendant", "vers", "dans", "pour", "de", 
		"près", "depuis", "sans"]
}

Le contexte syntaxique en renfort

Les différents mots extraits précédemment vont nous être utiles pour capturer les mots des autres catégories.

Nous allons fouiller le contexte des mots listés précédemment afin d'identifier des règles qui nous permettraient de trouver automatiquement les catégories grammaticales des autres mots. Pour ce faire nous allons utiliser un outil bien connu des linguistes : le concordancier.

Nltk fournit un concordancier qui est certes un peu limité mais bien suffisant pour notre étude :

t = nltk.Text(words, name="discours_sarkozy")
t.concordance("je", width=50, lines=10)

ce qui nous donne le résultat :

Displaying 10 of 21483 matches:
re avec vous ce matin . Je sais qu' il y a plus de
onsulat dans le monde . Je salue tous ces Français
 , c' est sympathique ! Je suis donc venu vous voi
France-Syrie du Sénat . Je suis également venu ave
la Syrie et la France . Je n' oublie pas Bernard B
des parents d' élèves . Je voudrais vous féliciter
État sera à vos côtés . Je trouve cela formidable 
aissera pas tomber . Et je trouve que c' est merve
nt engagés à ce point . Je veux saluer également l
nsi que les autorités . Je salue ici la présence 

L'utilisation du concordancier nous permet de lister un certain nombre de règles qui semblent généralisables :

  • le "or" en début de phrase est une conjonction alors que le "or" précédé d'un déterminant est un nom ;
  • les déterminants semblent précéder des noms ;
  • les pronoms sont en général suivis d'un verbe ou d'un autre pronom
  • les adjectifs sont en général précédés d'un verbe ou d'un nom
  • ...

Outre ces quelques règles auxquelles il est très certainement possible de trouver des contre-exemples, on peut surtout noter que les mots ne s'acoquinent pas avec n'importe qui. Chaque mot a des accointances privilégiées avec certaines catégories grammaticales (le déterminant avec le nom par exemple, ...). En d'autres termes, il semble exister une structure syntaxique propre à la langue... sa compréhension nous permettrait de faire un pas de plus dans la compréhension du langage par la machine.

Algorithme de Brill

Intuition

Prenons une phrase du corpus :

[u'Je', u'sais', u"qu'", u'il', u'y', u'a', u'plus',
 u'de', u'3 000', u'Fran\xe7ais', u'en', u'Syrie', u',', 
 u'\xe0', u'Damas', u',', u'\xe0', u'Alep', u',', u'o\xf9', 
 u'nous', u'avons', u'notre', u'plus', u'ancien', u'consulat', 
 u'dans', u'le', u'monde', u'.']

Un certain nombre des mots qui composent cette phrase sont connus car ils appartiennent aux catégories grammaticales déterminant, pronom, préposition ou conjonction. C'est le cas notamment de Je, qu', il, y, de, en, à, à, , nous, notre, dans et le. L'idée est donc d'affecter à ces mots leur étiquette la plus probable et aux autres l'étiquette ?, soit :

[('Je', 'PRO'), ('sais', '?'), ("qu'", 'PRO'), ('il', 'PRO'),
 ('y', 'PRO'),  ('a', '?'), ('plus', '?'), ('de', 'PREP'), 
 ('3 000', '?'), ('Fran\xe7ais', '?'), ('en', 'PREP'), 
 ('Syrie', '?'), (',', 'PUN'), ('\xe0', 'PREP'), ('Damas', '?'), 
 (',', 'PUN'), ('\xe0', 'PREP'), ('Alep', '?'), (',', 'PUN') , 
 ('o\xf9', 'PREP'), ('nous', 'PRO'), ('avons', '?'), 
 ('notre', 'DET'), ('plus', '?'), ('ancien', '?'), ('consulat', '?'), 
 ('dans', 'PREP'), ('le', 'DET'), ('monde', '?'), ('.', 'PUN')]

L'application de règles simples naïves telles que :

  • Un pronom est suivi d'un pronom ou d'un verbe ;
  • Un déterminant est suivi d'un adjectif ou d'un nom ;
  • Une préposition est suivie d'un nom propre, d'un pronom ou d'un déterminant ;
  • Un adjectif est suivi d'un adjectif, d'un nom ou d'une ponctuation ;
  • ...

permettent de deviner les catégories grammaticales qui peuvent s'appliquer aux mots inconnus de nos dictionnaires. Nous pourrons ensuite compléter notre dictionnaire de ces nouveaux et ainsi enrichir notre connaissance itérativement.

C'est grosso modo le concept de l'algorithme de Brill...

Fonctionnement

L'algorithme de Brill parcourt les mots du texte. Si la forme textuelle est présente dans son dictionnaire, il lui associe la catégorie grammaticale la plus probable, c-à-d celle la plus communément rencontrée pour ce mot. Lorsque la forme textuelle n'est pas présente dans le dictionnaire, il lui associe l'étiquette NOM ou NOM PROPRE si elle commence par une majuscule. Une fois cette première passe opérée, l'algorithme applique des règles de transformation des étiquettes telles que vues précédemment.

On dit que l'algorithme est guidé par l'erreur (error-driven) car il fait appel à de l'apprentissage supervisé (sélection des règles).

Pour en savoir plus, vous pouvez lire cet article écrit par Brill lui-même.

Brill dans nltk

Nltk intègre une implémentation de l'algorithme de Brill, ainsi que l'outillage nécessaire à l'entraînement d'un nouvel étiqueteur.