Gestion du texte : annotations, langue, recherche
Introduction
Dans ce chapitre, nous verrons comment manipuler les annotations en Python avec Owlready. Nous verrons également comment manipuler des textes multilingues, souvent utilisés dans les annotations, et comment optimiser les recherches textuelles.
Annoter les entités
Les annotations permettent d’ajouter des métadonnées sur les entités et les relations d’une ontologie. Elles peuvent décrire les auteurs, les dates de modification, ainsi que la description des entités, avec la possibilité d’insérer des textes dans différentes langues. Les annotations diffèrent des propriétés en ce qu’elles n’interviennent pas dans le raisonnement. En particulier, lorsqu’elles sont définies sur des classes, les annotations ne sont pas héritées.
Les propriétés d’annotation suivantes sont définies par OWL :
-
label (le libellé de l’entité)
-
comment (commentaire)
-
seeAlso (voir aussi)
-
versionInfo (information de version)
-
priorVersion (version précédente)
-
deprecated (déprécié, utilisé pour indiquer une entité qui ne devrait plus exister et qui n’est conservée que pour des raisons de compatibilité)
-
incompatibleWith (incompatible avec)
-
backwardCompatibleWith (compatible avec une entité d’une version antérieure)
-
isDefinedBy (défini par)
Les annotations peuvent être accédées avec la notation pointée, comme n’importe quelle relation. Notez qu’elles ne sont jamais fonctionnelles, leur valeur est donc toujours une liste....
Textes multilingues
Les chaînes de caractères peuvent être associées à une langue (français, anglais...). L’objet locstr (localized string, chaîne de caractères localisée) permet d’associer une chaîne de caractères à sa langue (identifiée par son code à deux lettres : « fr » pour le français, « en » pour l’anglais...) :
>>> s = locstr("An unknown bacteria", "en")
>>> s.lang
'en'
Les objets locstr peuvent être utilisés comme des chaînes de caractères Python. Ils sont souvent utilisés dans les annotations (mais peuvent aussi être utilisés avec les propriétés de données) :
>>> onto.bactérie_inconnue.label = [
... locstr("Une bactérie inconnue", "fr"),
... locstr("An unknown bacteria", "en") ]
De plus, il est possible de filtrer une liste d’annotations par langue, de la manière suivante :
>>> onto.bactérie_inconnue.label.fr
['Une bactérie inconnue']
>>> onto.bactérie_inconnue.label.en
['An unknown bacteria']
Comme sur les autres listes d’Owlready, la méthode first() retourne le premier...
Annoter les constructeurs
Les constructeurs peuvent également être annotés, en utilisant la syntaxe alternative « annotation[constructeur] ». L’exemple suivant crée une nouvelle sous-classe de Bactérie avec une restriction, puis annote cette dernière.
>>> with onto:
... class BactérieGramPlus(onto.Bactérie):
... is_a = [onto.gram_positif.value(True)]
>>> comment[BactérieGramPlus.is_a[-1]].append(
... "Commentaire sur la restriction de type VALUE.")
Annoter les propriétés et les relations
Les propriétés peuvent être annotées comme les autres entités :
>>> onto.a_pour_forme.comment = ["Un commentaire sur a_pour_forme."]
OWL permet également d’annoter les relations, c’est-à-dire les triplets RDF reliant un sujet à un objet via une propriété (ou prédicat). Cela est utile si l’on souhaite apporter des précisions supplémentaires sur une relation, sous forme de métadonnées, par exemple pour indiquer l’auteur ou la date de création. Nous pouvons le faire avec Owlready en utilisant la syntaxe spéciale « annotation[sujet, propriété, objet] », par exemple :
>>> forme = onto.bactérie_inconnue.a_pour_forme
>>> comment[onto.bactérie_inconnue, onto.a_pour_forme, forme] = \
["Un commentaire sur le fait que cette bactérie ait cette forme."]
Pour les relations impliquant les propriétés de OWL, les valeurs spéciales rdf_type, rdfs_subclassof, owl_equivalentclass,... peuvent être utilisées :
>>> comment[onto.bactérie_inconnue, rdf_type, onto.Bactérie] = \
["Un commentaire sur l'appartenance à la classe Bactérie."]
Créer de nouvelles classes d’annotations
De nouvelles propriétés d’annotation peuvent être créées de la même manière que les autres propriétés, en héritant de la classe AnnotationProperty. Par exemple :
>>> with onto:
... class observateur(AnnotationProperty): pass
... onto.bactérie_inconnue.observateur = ["observé par JB Lamy."]
... observateur[onto.bactérie_inconnue, rdf_type, onto.Bactérie] = [
... "observé par JB Lamy."
... ]
Métadonnées de l’ontologie
Les métadonnées de l’ontologie sont des annotations placées directement sur celle-ci (que l’on peut ajouter dans Protégé dans la liste Annotations de l’onglet Active ontology). Elles décrivent le numéro de version, l’historique de l’ontologie, les noms des auteurs... Dans Owlready, ces annotations sont disponibles via l’attribut metadata de l’ontologie. Par exemple, l’annotation comment de Gene Ontology (GO) est obtenue ainsi :
>>> go = get_ontology("http://purl.obolibrary.org/obo/go.owl").load()
>>> go.metadata.comment
['cvs version: $Revision: 38972 $',
'Includes Ontology(OntologyID(OntologyIRI(<http://purl.obolibrary.org/
obo/go/never_in_taxon.owl>))) [Axioms: 18 Logical Axioms: 0]']
Les métadonnées peuvent aussi être modifiées :
>>> go.metadata.comment.append("Voici un nouveau commentaire !")
Recherche plein texte
La recherche plein texte permet d’optimiser les recherches textuelles dans une ontologie. Le gain de vitesse peut atteindre un facteur 1000 lorsque leur taille est importante.
Par défaut, la recherche plein texte n’est pas activée, car elle augmente la taille du quadstore. Il est nécessaire de l’activer pour chaque propriété sur laquelle elle sera utilisée. La liste default_world.full_text_search_properties contient la liste des propriétés pour lesquelles la recherche plein texte est activée. Elle est vide par défaut. Pour activer la recherche plein texte sur une propriété, il suffit de l’ajouter dans la liste.
Par exemple pour activer la recherche plein texte sur la propriété comment d’OWL :
>>> default_world.full_text_search_properties.append(comment)
Nous pouvons à présent effectuer des recherches plein texte avec la méthode search(), en utilisant des objets FTS (abréviation pour full-text search, recherche plein texte en anglais) contenant les chaînes de caractères à rechercher. Contrairement à la recherche normale, la recherche plein texte se fait à partir d’une liste de mots-clefs (et non la valeur exacte recherchée) et ignore la casse (c’est-à-dire qu’elle ne distingue pas les majuscules et les minuscules). Par exemple...
Exemple : utiliser DBpedia en Python
DBpedia est une extraction automatique de données structurées, dérivées de l’encyclopédie libre et ouverte Wikipédia. DBpedia contient notamment les relations entre les pages Wikipedia, mais aussi des données plus spécifiques, comme la date de naissance des personnes figurant dans Wikipédia. Une ontologie OWL structure l’ensemble des données. Il s’agit donc d’un jeu de données généraliste orienté « culture générale ». La version la plus récente date d’octobre 2016 et peut être téléchargée à l’adresse suivante : https://wiki.dbpedia.org/develop/datasets/downloads-2016-10. DBpedia est composé de plusieurs fichiers (voir copie d’écran du site web ci-dessous) : la partie ontologie proprement dite, à télécharger au format OWL (fichier dbpedia_2016-10.owl) et les données, à télécharger au format TTL (équivalent à NTriples) dans leur version canonisée (canonicalized, noté « ttl* » sur le site de DBpedia). Plusieurs langues sont disponibles, nous allons travailler avec la version anglaise.
[...]
1. Charger DBpedia
DBpedia étant très volumineux, tous les fichiers ne sont pas utilisés d’ordinaire. Le tableau suivant en liste les principaux, que vous pouvez télécharger (attention, les données sont volumineuses : environ 20 Go seront nécessaires) :
Nom sur DBpedia |
Nom du fichier et description |
Ontology OWL |
dbpedia_2016-10.owl L’ontologie. |
Instance Types |
instance_types_wkd_uris_en.ttl.bz2 Les relations « est instance de » entre individus et classes. |
Article Categories |
article_categories_wkd_uris_en.ttl.bz2 La relation entre articles Wikipedia et catégories (propriété subject). |
Mappingbased Literals |
mappingbased_literals_wkd_uris_en.ttl.bz2 Propriété de type « DataProperty » présente dans la boîte d’information Wikipédia. |
Mappingbased Objects |
mappingbased_objects_wkd_uris_en.ttl.bz2 Propriété de type « ObjectProperty » présente dans la boîte d’information Wikipédia. |
Category Labels |
category_labels_wkd_uris_en.ttl.bz2... |