9. Ontologies Combinantes - naver/lispe GitHub Wiki

Ontologies Combinantes

Dans les années 95, je travaillais pour Ingenia, une société qui disposait d'un logiciel d'analyse syntaxique en dépendance, plutôt performant pour l'époque: Sylex. Dans le cadre d'un projet avec le LIRM de Montpellier, nous avions récupéré une bibliothèque en C++: COGITO développé par l'équipe de Michel Chein, qui offrait une boite à outil très riche pour manipuler des graphes conceptuels, tels que décrit par John F. Sowa en 1984.

Nous avions tenté alors, de construire une passerelle pour transformer nos dépendances en graphes conceptuels.

Echec

Le résultat ne fut évidemment pas à la hauteur de nos espérances, c'est le moins que l'on puisse dire. Nous avions abordé le problème avec une certaine naïveté, et la polysémie du français se chargea rapidement de nous ramener dans le monde réel. Il y eu d'ailleurs une réunion de projet en 1997 dont le constat fut sans équivoque: ça ne marchait pas. Pierre Zweigenbaum donna en particulier une présentation sur l'utilisation des graphes dans un projet sur des données médicales qui montrait les limites et les rigidités de ce modèle de représentation sémantique.

RDF

Les graphes conceptuels n'ont pas totalement disparu, ils ont resurgi sous la forme du Web Sémantique et ses représentations RDF, mais là encore les espoirs initiaux ont été sérieusement douchés.

Rigidité

L'idée sous-jacente des graphes conceptuels est l'utilisation conjointe de deux ontologies hiérarchiques pour les concepts et les relations. Les concepts sont reliés les uns aux autres via des relations sous la forme d'un graphe. La projection est l'opération de base, qui permet de mettre en relation deux graphes. Deux concepts sont compatibles, s'ils sont égaux ou si l'un subsume l'autre. Ainsi, si l'on définit chien comme un animal dans l'ontologie, on considère que le concept animal subsume le concept chien.

On voit immédiatement comment une telle représentation pose problème. Comme doit-on représenter un dauphin par exemple? C'est un mammifère, certes, mais aquatique. Doit-on créer une branche particulière sous mammifère pour différencier les animaux aquatiques des animaux terrestres?

               mammifère
              /         \
         terrestre    aquatique

Mais dans ce cas, où placer les loutres? En effet, dans la théorie de Sowa, les branches ne peuvent se croiser.

Platon

Dans une vidéo récente, Paul Jorion expliquait la différence entre les modèles conceptuels Européens et Chinois. Platon, et les Grecs en particulier, ont eu une influence particulièrement forte sur notre représentation du monde.

Pour Platon, les concepts ont une existence intrinsèque, tandis que dans la philosophie chinoise, les concepts n'ont de sens qu'en contexte.

Ainsi dans la tradition européenne, que ce soit Linnée ou Sowa, l'idée d'une ontologie qui définit des rapports de hiérarchie entre les concepts s'impose d'elle-même. Elle est dans la continuité même d'une représentation d'un monde de concepts pré-existants. Dans la réalité, cette démarche est vouée à l'échec, car la langue et le monde ne se projette pas aisément dans une ontologie rigide de relations obvies.

La démarche chinoise, influencée certainement par son écriture, pose le problème différemment. Un concept ne se définit qu'en contexte. Prenons le mot chien qui en français désigne à la fois un animal et une pièce d'arme. En chinois, lorsqu'un concept présente une ambiguïté à l'écriture, on le fait précéder d'un caractère qui définira le champ sémantique dans lequel l'interpréter.

Au lieu d'une ontologie rigide ex cathedra, la philosophie chinoise propose au contraire une ontologie dynamique qui se construit par enrichissements successifs, ex reis.

Une ontologie combinante.

La solution que nous proposons ici, et qui a été intégré dans LispE est de considérer les concepts comme des ensembles. Plus exactement, nous représentons chaque concept sous la forme d'un vecteur de bits, où chaque position dans ce vecteur correspond à un concept. On utilise les opérateurs ~ & &~ | ^ pour effectuer des comparaisons entre les différents concepts.

  • &: permet de calculer l'intersection entre deux concepts
  • |: permet de calculer l'union de deux concepts
  • ^: permet de calculer un ou exclusif entre deux concepts
  • ~: rend la contraposée d'un concept

Un exemple pas à pas

Nous allons illustrer la façon dont fonctionne cette ontologie sur un exemple simple.

Tout d'abord, nous allons créer une ontologie de façon à pouvoir conserver et manipuler nos concepts.

; notre ontologie sur les couleurs
(setq onto (ontology "couleurs"))

Puis nous allons placer quelques concepts dans celles-ci:

; Le premier concept est la couleur elle-même
(setq couleur (ontology_create onto "couleur"))

; Nous rajoutons quelques couleurs.
; Tous reçoivent aussi le concept couleur dans leur définition
(setq rouge (ontology_create onto "rouge" couleur))
(setq vert (ontology_create onto "vert" couleur))
(setq bleu (ontology_create onto "bleu" couleur))
(setq violet (ontology_create onto "violet" couleur))
(setq indigo (ontology_create onto "indigo" couleur))
(setq jaune (ontology_create onto "jaune" couleur))
(setq orange (ontology_create onto "orange" couleur))

Si nous comparons nos concepts, nous verrons qu'ils partagent tous la notion de couleur:

(ontology_list (& rouge vert bleu violet indigo jaune orange)) ; donne couleur

Par défaut notre ontologie contient le concept _absurd, lequel est un concept vide.

(ontology_list (ontology_absurd onto))

Lorsque deux concepts n'ont aucune intersection, on renvoie _absurd comme valeur.

LispE offre aussi quelques fonctions pour vérifier ou modifier des concepts:

(ontology_absurdp (& rouge vert)) ; permet de vérifier un concept vaut _absurd
(ontology_intesect rouge vert) ; permet de vérifier si deux concepts partagent de l'information
(ontology_