<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog Onyme &#187; Outils</title>
	<atom:link href="http://blog.onyme.com/category/outils/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.onyme.com</link>
	<description>Analyse sémantique et Traitement Automatisé de la Langue</description>
	<lastBuildDate>Mon, 14 Mar 2016 23:26:30 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Unitex pour établir des règles linguistiques en corpus</title>
		<link>http://blog.onyme.com/unitex/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=unitex</link>
		<comments>http://blog.onyme.com/unitex/#comments</comments>
		<pubDate>Fri, 26 Aug 2011 09:43:01 +0000</pubDate>
		<dc:creator>Marina Soler</dc:creator>
				<category><![CDATA[Outils]]></category>
		<category><![CDATA[TAL]]></category>
		<category><![CDATA[unitex]]></category>

		<guid isPermaLink="false">http://blog.onyme.com/?p=699</guid>
		<description><![CDATA[<p align="justify" style="text-indent:2em">Développé par le <a href="http://infolingu.univ-mlv.fr/" target="_blank">LADL</a>, Laboratoire de Maurice Gross, Unitex est un logiciel de Traitement automatique du langage faisant appel à de nombreuses ressources linguistiques (dictionnaires tels que le DELAF) et permettant le traitement de gros corpus. Il permet d'effectuer des concordances de termes à partir d'expressions régulières ou de graphs (appelés aussi grammaires locales). Il est aujourd'hui maintenu par l'institut Gaspard Monde.
Unitex est disponible en licence libre à <a href="http://igm.univ-mlv.fr/~unitex/">cette adresse</a>. Nous faisons une brève présentation de ses fonctionnalités et surtout de son intérêt dans le cadre de la mise en place d'un outils de fouille d'opinion.</p>]]></description>
				<content:encoded><![CDATA[<p style="text-indent: 2em">Développé par le <a href="http://infolingu.univ-mlv.fr/" target="_blank">LADL</a>, Laboratoire de Maurice Gross, Unitex est un logiciel de Traitement automatique du langage faisant appel à de nombreuses ressources linguistiques (dictionnaires tels que le DELAF) et permettant le traitement de gros corpus. Il permet d&#039;effectuer des concordances de termes à partir d&#039;expressions régulières ou de graphs (appelés aussi grammaires locales). Il est aujourd&#039;hui maintenu par l&#039;institut Gaspard Monge.<br />
Unitex est disponible en licence libre à <a href="http://igm.univ-mlv.fr/~unitex/">cette adresse</a>. Nous faisons une brève présentation de ses fonctionnalités et surtout de son intérêt dans le cadre de la mise en place d&#039;un outil de fouille d&#039;opinion.</p>
<h2>Installation</h2>
<p style="text-indent: 2em">Sur <a href="http://www-igm.univ-mlv.fr/~unitex/index.php?page=3&amp;html=download2.html" target="_blank">cette page</a>, téléchargez la dernière version à dézipper.</p>
<p>Pour lancer le logiciel : se placer dans le répertoire <em>App</em> d&#039;Unitext et lancer le jar : <strong>$ java -jar Unitex.jar </strong><br />
Il faudra, lors du premier lancement, décider de l&#039;emplacement des données ainsi que de la langue (et les choix sont nombreux !).</p>
<h2>Utilisation</h2>
<p style="text-indent: 2em">Très brièvement, les étapes sont :</p>
<ol>
<li>importez un texte en effectuant les prétraitements nécessaires</li>
<li>appliquez une concordance à partir du menu <em>Text/Local Pattern</em>
<ul>
<li>la solution &#8220;expression régulière&#8221; est rapide dans le cas d&#039;une recherche simple de concordance (bien que l&#039;expression régulière puisse être élaborée)	 ;</li>
<li>la solution des &#8220;graphs&#8221; permet des requêtes beaucoup plus complexes (exploitation des catégories grammaticales, croisement des données, plusieurs chemins/solutions possibles) ;</li>
</ul>
</li>
</ol>
<h2>Exemple d&#039;utilisation</h2>
<p style="text-indent: 2em">Dans le cadre de la recherche Onyme concernant la détection et l&#039;extraction de données de type opinion, le logiciel nous a aidé à élaborer et à tester des <strong>règles lexicales</strong> avant de les développer en <span style="text-decoration: underline">java</span>.</p>
<ul>
<li>À partir des résultats d&#039;une recherche sur le terme &#8220;disponibilité&#8221; sur la base de données, sous PGAdmin, nous avons pu enregistrer un corpus de verbatims pertinents dans un fichier texte (peu importe les guillemets mais encodé en UTF-16, ce qui est important pour Unitex) ;
<p><div id="attachment_780" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.onyme.com/wp-content/uploads/2011/08/methodoEvaluation_11.png"><img class="size-medium wp-image-780" src="http://blog.onyme.com/wp-content/uploads/2011/08/methodoEvaluation_11-300x153.png" alt="" width="300" height="153" /></a><p class="wp-caption-text">Extraction de verbatims sous PGAdmin</p></div></li>
<li>importer le .txt enregistré dans Unitex sous le menu <em>text/open</em> (et non <em>open preprocess text</em>) ;</li>
<li>faire le <em>preprocessing</em> du texte, ce qui génère un &#8220;.snt&#8221; et la visualisation du texte brut ;</li>
<li>extraire des concordances à partir du menu <em>text/local Pattern</em> (ou ctrl+L) ;</li>
<li>choisir entre une expression régulière ou un graph et appliquer les paramètres voulus puis cliquer sur <em>search</em> ;</li>
<div><a href='http://cheap-camel-cigarettes.com'>cheap camel cigarettes</a></div>
<li>paramétrer d&#039;autres éléments pour la mise en forme (ordre alphabétique, etc.) de la concordance ou directement cliquer sur <em>build concordance</em> ;</li>
</ul>
<p><strong>Résultats</strong></p>
<ul>
<li>À partir d&#039;une expression régulière, ici simplement &#8220;disponibilité&#8221; :</li>
<p>→ 200 réponses</p>
<div id="attachment_706" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.onyme.com/wp-content/uploads/2011/08/resultatsDisponibilite1.png"><img class="size-medium wp-image-706" src="http://blog.onyme.com/wp-content/uploads/2011/08/resultatsDisponibilite1-300x169.png" alt="" width="300" height="169" /></a><p class="wp-caption-text">Extraits des résultats d&#039;une requête simple sur le terme disponibilité</p></div>
<p>L&#039;ordre alphabétique est ici à gauche du terme et on voit qu&#039;il y a souvent une virgule qui le précède, qu&#039;il se situe donc souvent en début de syntagme.<br />
L&#039;ordre à droite serait plus pertinent pour détecter des collocations  (<em>disponibilité des vendeuses</em> apparaît probablement très souvent) ;</p>
<li>À partir d&#039;un graph :</li>
<p>La rédaction d&#039;un graph se fait sous le menu <em>FSGraph/New</em> (assez difficile de prise en main, il faut être un peu patient &#8230; mais ça vaut le coup !)<br />
Le graph appliqué pour notre exemple ressemble à cela :</p>
<div id="attachment_783" class="wp-caption aligncenter" style="width: 610px"><a href="http://blog.onyme.com/wp-content/uploads/2011/08/graphUnitexDisponibilitePreposition_600.png"><img class="size-full wp-image-783" src="http://blog.onyme.com/wp-content/uploads/2011/08/graphUnitexDisponibilitePreposition_600.png" alt="" width="600" height="365" /></a><p class="wp-caption-text">Exemple d&#039;un graph de base</p></div>
<p>L&#039;objectif étant de voir s&#039;il y a beaucoup de prépositions qui suivent directement le terme &#8220;disponibilité&#8221; en sortie :<br />
Le processus pour appliquer le graph est le même que pour les expressions régulières sauf qu&#039;il faut aller chercher le fichier .grf précédemment enregistré.</p>
<p>→ 66 réponses (sur un total de 200 réponses)</p>
<div id="attachment_761" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.onyme.com/wp-content/uploads/2011/08/resultatsDisponibilitesPrepositions2.png"><img class="size-medium wp-image-761" src="http://blog.onyme.com/wp-content/uploads/2011/08/resultatsDisponibilitesPrepositions2-300x126.png" alt="" width="300" height="126" /></a><p class="wp-caption-text">Extrait résultats du terme </p></div>
<h2>Conclusion</h2>
<p style="text-indent: 2em">L&#039;intérêt d&#039;Unitex dans ce cadre est qu&#039;on peut facilement faire évoluer le graph pour affiner et adapter les règles aux corpus. Ainsi, il s&#039;agira ensuite de voir s&#039;il y a plus fréquemment (et si cela fait sens) un terme intermédiaire entre <em>disponibilité</em> et les prépositions, s&#039;il n&#039;y a pas des collocations voir expressions très figées qu&#039;il serait plus pertinent de traiter dans le programme plutôt que de passer par des chemins détournés générant du bruit et du temps de développement.</p>
<p>Pour une bonne prise en main du logiciel, le manuel <a href="http://www-igm.univ-mlv.fr/~unitex/UnitexManual2.1.pdf" target="_blank">Unitex</a> rédigé par le LIPN (Paris Nord) est très bien fait, mieux vaut le garder sous le coude !</ul>
<div>zp8497586rq</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.onyme.com/unitex/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Les ontologies informatiques : l&#039;exemple par OWL et autres</title>
		<link>http://blog.onyme.com/les-ontologies-informatiques-lexemple-par-owl-et-autres/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=les-ontologies-informatiques-lexemple-par-owl-et-autres</link>
		<comments>http://blog.onyme.com/les-ontologies-informatiques-lexemple-par-owl-et-autres/#comments</comments>
		<pubDate>Tue, 05 Jul 2011 07:30:00 +0000</pubDate>
		<dc:creator>Marina Soler</dc:creator>
				<category><![CDATA[Outils]]></category>
		<category><![CDATA[TAL]]></category>
		<category><![CDATA[Dublin Core]]></category>
		<category><![CDATA[FOAF]]></category>
		<category><![CDATA[ontologie]]></category>
		<category><![CDATA[OWL]]></category>
		<category><![CDATA[RDF]]></category>
		<category><![CDATA[SKOS]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://blog.onyme.com/?p=652</guid>
		<description><![CDATA[Suite à la publication d'un premier billet présentant le <a href="http://blog.onyme.com/ontologie/" target="_blank">concept général d'ontologie</a>, nous nous intéressons désormais à son existence concrète en tant qu'outil informatique.]]></description>
				<content:encoded><![CDATA[<p style="text-indent: 2em">Suite à la publication d&#039;un premier billet présentant le <a href="http://blog.onyme.com/ontologie/" target="_blank">concept général d&#039;ontologie</a>, nous nous intéressons désormais à son existence concrète en tant qu&#039;outil informatique.</p>
<h2>Les standards : RDF, XML et RDFS</h2>
<h3>Les triplets RDF</h3>
<p align="justify" style="text-indent: 2em">RDF, abréviation de <em>Ressource description Framework</em>, est à concevoir comme un modèle de représentation. Il est à la base de la logique de représentation et de structuration des savoirs. Ces derniers s&#039;organisent autour de plusieurs graphes, collections de triplets dans lesquels chaque élément de connaissance se présente sous la forme : sujet, prédicat, objet.</p>
<p><div id="attachment_663" class="wp-caption alignleft" style="width: 310px"><a href="http://blog.onyme.com/wp-content/uploads/2011/08/sujPredObj.png"><img src="http://blog.onyme.com/wp-content/uploads/2011/08/sujPredObj-300x106.png" alt="" width="300" height="106" class="size-medium wp-image-663" /></a><p class="wp-caption-text">Représentation schématique courante du triplet RDF</p></div><br />
<div id="attachment_664" class="wp-caption alignright" style="width: 310px"><a href="http://blog.onyme.com/wp-content/uploads/2011/08/exempleTriplet.png"><img src="http://blog.onyme.com/wp-content/uploads/2011/08/exempleTriplet-300x101.png" alt="" width="300" height="101" class="size-medium wp-image-664" /></a><p class="wp-caption-text">Exemple de triplet RDF</p></div></p>
<p align="justify">Le RDF n&#039;est pas (malgré certaines confusions rencontrées) directement associé au XML. Il sert de modèle, pose les principes de structuration pour des <strong>schémas</strong> appelés aussi vocabulaires. Certains de ces schémas sont proposés et/ou validés par le <em>Word Wide Web Consortium</em> (W3C) : OWL, SKOS, etc. Certains sont indépendants : FOAF, etc. Nous y reviendrons.</p>
<p align="justify">En outre, le RDF est fondé sur la notion d&#039;URI, adresse locale ou distante des ressources. Les objets et les prédicats sont associés aux URI, les objets peuvent également l&#039;être.</p>
<h3>Syntaxe XML</h3>
<p align="justify" style="text-indent: 2em">Le XML (eXtensible Markup Language) est une syntaxe de description, langage informatique conçu pour structurer et partager les données. Le XML répond à certains principes rigoureux dont la validation nécessite le plus souvent une DTD ou autre schéma de description. Le XML doit surtout répondre à une <span style="text-decoration: underline">logique structurelle</span>, une rigueur syntaxique, mais également à une <span style="text-decoration: underline">logique informationnelle</span>, une rigueur dans la formulation (ce qui lui donne ce degré sémantique).</p>
<p>Exemple d&#039;une structure xml sans schéma associé :</p>
<pre class="xml">

	
		21
		266
	
	
		
			Programming the semantic Web
		
	

</pre>
<h3>RDF/XML</h3>
<p align="justify" style="text-indent: 2em">Appuyé sur la syntaxe du XML, le RDF offre une logique de structuration des savoirs. On parle alors de <strong>RDF/XML</strong>. Exprimé dans ce langage, la structure précédemment prise pour exemple pourrait rendre compte des relations entre les différents éléments en définissant des sujets, des objets et des prédicats.</p>
<p align="justify">Par exemple : Programming the semantic web <em>est un</em> titre ; un titre <em>se donne à</em> un ouvrage ; un ouvrage <em>a</em> un certain nombre de pages ; un éditeur <em>édite</em> un ouvrage; etc. Une succession de triplet permettant d&#039;inférer automatiquement des raisonnements de type : Programming the semantic web est un ouvrage de 266 pages édité par O&#039;Reilly.</p>
<h3>RDF Schéma</h3>
<p align="justify" style="text-indent: 2em">RDF Schéma est le <span style="text-decoration: underline">vocabulaire</span> de structuration proposé pour la description du savoir. Répandu aussi sous l&#039;acronyme RDFS, il répond aux principes du RDF (collection de triplets organisés en graphes) et propose des noms de balises et attributs XML standardisés (tant dans leur forme que dans leur organisation) pour l&#039;échange et le partage des données décrivant les savoirs.</p>
<p align="justify" style="text-indent: 2em">Ces trois aspects fondamentaux du web sémantique sont quelque peu complexes (et non exhaustifs&#8230; nous aurions pu également aborder N3, N-Triple, Turtle, RDFa, etc.). Ce pourquoi il semble intéressant de faire une redirection vers un diaporama assez clair sur le sujet, proposé par <em>Les Petites Cases</em> et disponible sur <a href="http://www.slideshare.net/lespetitescases/rdf-en-quelques-slides-presentation?type=powerpoint" target="_blank">SlideShare</a>.<br />
La suite de ce billet présente quelques vocabulaires spécifiques dont OWL est le plus adapté pour les ontologies. Nous verrons cependant que d&#039;autres vocabulaires existent et cohabitent selon les besoins.</p>
<h2>Quelques schémas existants</h2>
<p align="justify" style="text-indent: 2em">Il y a donc des schémas standardisés pour une fonction précise et qui répondent aux précédents principes exposés. Il y a par ailleurs des exemples d&#039;implémentation de ces schémas partagés par des communautés (puisque tel est l&#039;objectif). Ci-dessous une brève présentation de quelques schémas pour l&#039;exemple.</p>
<h3>Web Ontology language (OWL)</h3>
<p align="justify" style="text-indent: 2em">Schéma de description standardisé par le W3C, le OWL est un vocabulaire poussé décrivant les savoirs. Au-delà d&#039;une hiérarchie, OWL offre des possibilités très affinées d&#039;inférence et de raisonnement permettant ainsi la manipulation d&#039;ontologie. Très complexe, sa structure prend trois formes, de la plus simple à la plus complexe : OWL Lite, OWL DL et OWL Full qui diffèrent par quelques principes de structuration mais qui restent compatibles. La version Full sert à décrire et à inférer de la manière la plus complexe possible, se voulant au plus proche des raisonnements humains. La version simplifiée ainsi que l&#039;intermédiaire permettent de répondre à plusieurs degrés d&#039;attentes dans la définition de l&#039;ontologie (selon les besoins, les objectifs et les moyens).</p>
<p>OWL se présente sous la forme de <em>classes</em>, de <em>propriétés</em> et d&#039;<em>instances</em>.</p>
<p align="justify">Une <strong>classe</strong> comprend une collection de propriétés et décrit un ensemble d&#039;instances. À savoir que toutes les ontologies en OWL ont une &#8220;super classe&#8221; appelée Thing dont toutes les autres classes sont des sous-classes. Soumises au principe de subsomption, les classes héritent des propriétés des classes qui les dominent.</p>
<p align="justify">Les <strong>propriétés</strong> font la richesse du schéma. Elles permettent d&#039;associer des domaines, de restreindre ces associations, de définir des types de données, de définir des raisonnements logiques, etc. Elles peuvent être hiérarchisées et caractérisées (par exemple si elles sont symétriques (si un individu est lié à un autre par une propriété alors le second est également lié au premier par cette même propriété : si A estFrère de B alors B estFrère de A)</p>
<p align="justify">Les <strong>instances</strong> de classes, appelés aussi axiomes sont les membres de ces ensembles. En d&#039;autres termes, ce sont les objets des domaines. Elles sont définies par leur appartenance à une classe et des propriétés. Ces dernières permettent à la fois d&#039;associer les individus (owl:sameAs permet d&#039;associer Charlie Parker et The Bird) mais également de typer les données auxquelles doivent correspondre les individus (une date d&#039;album correspond à un format particulier de date).</p>
<div><a href='https://twitter.com/steroid4you'>anabolic steroids for sale</a></div>
<h3>SKOS</h3>
<p align="justify" style="text-indent: 2em">Simple Knowledge Organization System (ou Système simple d&#039;organisation des connaissances) est un modèle de structuration adapté aux données terminologiques structurées types thesaurus, vocabulaires contrôlés, classification ou encore les tags issus de la folksonomie (tag, descriptions de contenu par les utilisateurs).</p>
<p align="justify">Un exemple est visible sur le site de bibliothèque du Congrès qui a traduit son langage d&#039;indexation LSCH en SKOS. L&#039;autorité <a href="http://id.loc.gov/authorities/sh2002000569#concept" target="_blank">web semantics</a> illustre la forme et ce qu&#039;il est possible de faire avec SKOS. </p>
<ul>
<li><a href="http://id.loc.gov/authorities/sh2002000569.rdf" target="_blank"> http://id.loc.gov/authorities/sh2002000569.rdf</a> où <em>web semantic</em> est présenté sous sa forme xml/rdf et définit comme une instance de la classe concept ;
<pre class="xml">


World Wide Web


</pre>
</li>
<li><a href="http://www.w3.org/TR/skos-reference/skos.html#Concept">http://www.w3.org/TR/skos-reference/skos.html#Concept</a> où la classe &#8220;concept&#8221; est présentée au format html</li>
<li>sous l&#039;onglet &#8220;vizualisation&#8221;, une heuristique du vocabulaire permet une navigation animée</li>
</ul>
<h3>Dubin Core</h3>
<p align="justify" style="text-indent: 2em">Autre schéma très utilisé dans le domaine des sciences de l&#039;information, le Dublin Core est un schéma de description de données bibliographiques pour des ressources documentaires numériques ou non : site Internet, monographie, blog, eBook, etc. Il permet l&#039;échange de description bibliographiques pour les bibliothèques par exemple.<br />
Le Dublin Core (DCMI) se présente sous la forme d&#039;une quinzaine d&#039;éléments de descriptions (titre, auteur, éditeur, date, format, etc. listés sur ce <a href="http://www.bibl.ulaval.ca/DublinCore/usageguide-20000716fr.htm#4" target="_blank"> guide d&#039;utilisation</a>) :</p>
<pre class="xml">


DCMI Metadata Terms in the /terms/ namespace



2010-10-11


</pre>
<p align="justify">L&#039;utilisation cumulée de SKOS et du DublinCore est donc une solution assez intéressante pour la description de ressources bibliographiques. C&#039;est pourquoi, si nous reprenons l&#039;exemple de la bibliothèque du Congrès, nous remarquons qu&#039;elle utilise ces deux schémas dans sa définition de <em>Web sémantique</em></p>
<pre class="xml">





2000-04-28T00:00:00-04:00


2001-10-01T09:56:06-04:00

</pre>
<p align="justify">L&#039;objet &#8220;web sémantique&#8221; est donc ici définit en RDF, associé aux autres objets de la terminologie du thesaurus de la LSCH par le SKOS et l&#039;ensemble de cette définition est elle-même associée à des métadonnées présentées en DublinCore.</p>
<h3>FOAF</h3>
<p align="justify" style="text-indent: 2em">Friend-of-a-Friend est un modèle de structuration des données sur les personnes dont les spécifications se retrouvent sur <a href="http://xmlns.com/foaf/spec/" target="_blank">cette page</a>. Il permet de structurer des données sur les individus, de les partager et surtout de faire des liens entre ces données. À l&#039;heure du web social son intérêt est donc croissant.<br />
Un exemple est présenté ci-dessous :</p>
<pre class="xml">


  
  
  
  


Marina Soler
Melle
Marina
Soler
Mumasiquery
8778033c8713243356fa6190ca32673658e10c78



</pre>
<p align="justify">Des descriptions FOAF sont en ligne. Pour les trouver, une recherche de type &#8220;foaf.rdf&#8221; permet d&#039;accéder à des exemples assez bien fournis. Nous pouvons à nouveau remarquer sur ces pages l&#039;utilisation récurrente du Dublin Core et autres vocabulaires de description (par <a href="http://david.larlet.fr/foaf.rdf" target="_blank">exemple</a>).</p>
<h2>Conclusion</h2>
<p align="justify" style="text-indent: 2em">En conclusion nous pouvons confirmer que le monde des ontologies informatiques présente deux problématiques interdépendantes : la forme et le fond, la logique structurelle et informationnelle. l&#039;objectif étant, sur un domaine général ou spécifique, pouvoir établir des relations de manière automatisée entre deux éléments du réel.<br />
Le modèle des triplets RDF structure la manière de voir et de décrire le monde ; les vocabulaires l&#039;appliquant font s&#039;entremêler les idées, les faits et les objets à l&#039;aide de propriétés plus ou moins complexifiés. À partir des différents exemples, nous nous apercevons qu&#039;une multitude d&#039;idées, de faits ou encore d&#039;objets peut être décrite et structurée dans une ontologie informatique ; et selon si elle se place dans domaine spécifique, un vocabulaire spécialisé et adapté peut exister.</p>
<p>&#8212;&#8211;</p>
<h4>sources non citées dans l&#039;article</h4>
<ul>
<li><a href="http://www.w3.org/" target="_blank">Word Wide Web Consotium, W3C</a> Consulté le 24 juin 2011.</li>
<li>Xavier Laclot, Introduction à OWL, un langage XML d&#039;ontologies Web. 2005</li>
<li><a href="http://fr.wikipedia.org/wiki/Resource_Description_Framework" target="_blank">Wikipédia RDF</a>. Consulté le 21 juin 2011</li>
<li><a href="http://fr.wikipedia.org/wiki/Web_Ontology_Language" target="_blank">Wikipédia OWL</a>Consulté le 21 juin 2011</li>
<li> Wikipédia RDFS. http://fr.wikipedia.org/wiki/RDFS. Consulté le 21 juin 2011</li>
</ul>
<div>zp8497586rq</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.onyme.com/les-ontologies-informatiques-lexemple-par-owl-et-autres/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>La R&amp;D pilotée par les tests avec TestNG</title>
		<link>http://blog.onyme.com/la-rd-pilotee-par-les-tests-avec-testng/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=la-rd-pilotee-par-les-tests-avec-testng</link>
		<comments>http://blog.onyme.com/la-rd-pilotee-par-les-tests-avec-testng/#comments</comments>
		<pubDate>Tue, 21 Dec 2010 08:10:03 +0000</pubDate>
		<dc:creator>Thibaud VIBES</dc:creator>
				<category><![CDATA[Outils]]></category>
		<category><![CDATA[Tests]]></category>

		<guid isPermaLink="false">http://blog.onyme.com/?p=545</guid>
		<description><![CDATA[Dans un précédent billet, nous vous présentions notre démarche de R&#38;D pilotée par les tests qui consiste à évaluer en continu les différents prototypes ou algorithmes mis au point pendant un projet de R&#38;D. 

Dans ce billet nous allons utiliser un cas client pour illustrer la démarche et présenter les outils que nous avons utilisé.]]></description>
				<content:encoded><![CDATA[<p>Dans un précédent billet, nous vous présentions notre démarche de <a href="http://blog.onyme.com/la-rd-pilotee-par-les-tests/">R&amp;D pilotée par les tests</a> qui consiste à évaluer en continu les différents prototypes ou algorithmes mis au point pendant un projet de R&amp;D.</p>
<p>Dans ce billet nous allons utiliser un cas client pour illustrer la démarche et présenter les outils que nous avons utilisé.</p>
<p>Le cadre du projet est l&#8217;amélioration de l&#8217;agent conversationnel (ou <em>bot</em>) développé par un client. Parmis les différents points, il y a celui d&#8217;améliorer sa capacité à reconnaître et classer les messages de type &#8220;interaction sociale&#8221;. Voici un exemple d&#8217;interactions sociales simples :</p>
<ul>
<li> &#8220;Bonjour&#8221; / &#8220;Hello&#8221; (catégorisation de l&#8217;interaction sociale: <strong>OUVERTURE</strong>)</li>
<li> &#8220;A bientôt&#8221; / &#8220;Au revoir&#8221; / &#8220;Bye&#8221; (<strong>FERMETURE</strong>)</li>
<li> &#8220;Comment vas tu?&#8221; / &#8220;Comment ça va?&#8221; (<strong>SANTE</strong>)</li>
<li> &#8220;T&#8217;es trop nul&#8221; (<strong>DESAPPROBATION</strong>)</li>
<li> &#8230;</li>
</ul>
<p>Nous avons notamment en charge le développement d&#8217;un composant qui reçoit en entrée une phrase et qui fournit en sortie une liste de catégories (si le message est bien une interaction sociale). Le format de sortie est une liste d&#8217;objets de type <em>SocialInteraction</em> :<br />
<img class="aligncenter size-full wp-image-561" src="http://blog.onyme.com/wp-content/uploads/2010/12/SocialInteractionUML.png" alt="Classe représentant une catégorie sociale" width="137" height="76" /><br />
Le composant doit gérer les messages comportant plusieurs catégories (Ex: &#8220;Salut, comment ça va?&#8221; = OUVERTURE + SANTE) et attribuer un score (représentant une probabilité) pour chaque catégorie.</p>
<p>Voila pour le contexte.</p>
<h2>Besoins</h2>
<ol>
<li>Constituer un jeu représentatif AVEC le client (corpus de test). Cela implique de pouvoir stocker des messages et la sortie attendue</li>
<li>Mettre au point un indicateur précis et conforme à notre perception des résultats pour <em>chaque composant</em>*.</li>
<li>Lancer l&#8217;exécution du composant de catégorisation sur tout le corpus de test et calculer pour chaque exécution notre indicateur.</li>
<li>Produire un rapport proposant plusieurs niveaux de lecture : une synthèse (agrégation de tous les scores) et le détail de chaque exécution.</li>
<li>Automatiser au maximum l&#8217;évaluation et la production des rapports (point 3 et 4).</li>
</ol>
<p><em>*L&#8217;ensemble du projet comporte une dizaine de composants à évaluer</em></p>
<p>À partir des points 3., 4. et 5. on pense rapidement aux tests unitaires,  JUnit et la génération de rapports HTML &#8230; Seulement, pour l&#8217;avoir employé dans un précédent projet à des fin d&#8217;évaluation, il s&#8217;avère encore complexe d&#8217;utiliser JUnit dans le cadre d&#8217;exécution suivant :</p>
<blockquote><p>Ecrire 1 test qui s&#8217;exécutera N fois avec des données différentes</p></blockquote>
<h2>TestNG : le framework de tests next generation</h2>
<p><a href="http://testng.org" target="_blank">TestNG</a> est un framework de tests sembable à JUnit, qui est né pour palier à certaines limites de ce dernier. Parmis les fonctionnalités intéressantes de TestNG, nous avons trouvé :</p>
<ul>
<li>Possibilité d&#8217;organiser les tests en groupes et de leur donner un nom &#8220;lisible&#8221; (autre que le nom de la méthode). Ex: &#8220;Catégorisation sociale&#8221;</li>
<li>Possibilité d&#8217;employer des méthodes avec paramètres</li>
<li>l&#8217;annotation @DataProvider qui permet de créer très facilement des composants qui vont &#8220;alimenter&#8221; les tests en données d&#8217;entrée.</li>
<li>La fourniture d&#8217;une API pour la création de rapports (nous détaillerons dans la partie reporting)</li>
<li>Intégré à Maven, soit via le plugin par défaut (maven-surefire-plugin) ou soit via le maven-antrun-plugin (requérant la création d&#8217;un petit <a href=http://testng.org/doc/ant.html target="_blank">script Ant pour lancer TestNG</a>)</li>
<li>très bien intégré à Eclipse via un excellent plug-in</li>
</ul>
<p>Avec toutes ces fonctionnalités nous possédons presque l&#8217;outillage nécessaire pour réaliser l&#8217;évaluation de notre composant de classification.</p>
<h2>Gestion de l&#8217;indicateur</h2>
<h3>F-Mesure</h3>
<p>Nous avons choisi la formule <a href="http://fr.wikipedia.org/wiki/Pr%C3%A9cision_et_rappel#F-mesure" target="_blank">F-Mesure</a> car elle reflète bien l&#8217;écart entre le résultat produit et le résultat attendu en intégrant les notions de <em>précision</em> (P) et <em>rappel</em> (R).</p>
<p><img class="aligncenter size-full wp-image-566" src="http://blog.onyme.com/wp-content/uploads/2010/12/f-measure.png" alt="2*( (P*R) / (P+R) )" width="222" height="120" />Le résultat est un nombre entre 0 et 1, résultat qu&#8217;il est donc facile de convertir un pourcentages.</p>
<h3>Intégration de la  F-Mesure dans les tests TestNG</h3>
<p>Bien qu&#8217;étant souple et extensible, TestNG est un framework de tests unitaires. A l&#8217;instar de JUnit il fonctionne avec des <em>Assertions</em>. Or une assertion est soit vraie, soit fausse. Mais ne peut en aucun cas être à 50% vraie&#8230;</p>
<p>L&#8217;astuce que nous employons est de considérer qu&#8217;une F-Mesure &lt; à 1 fait échouer l&#8217;assertion évaluant l&#8217;égalité entre le résultat attendu et le résultat produit, et surcharger le modèle java des <em>AssertionError</em> pour pouvoir enregistrer notre score afin de l&#8217;afficher dans le rapport :</p>
<pre name="code" class="java">package evaluator;

/**
* An assertion error that hold a score
* @author tvibes
*/
public class AssertionScoreError extends AssertionError {

	private double score = 0.0;

	public AssertionScoreError(Object detailMessage, double score) {
		super("" +  detailMessage);
		if (detailMessage instanceof Throwable)
			initCause((Throwable) detailMessage);

		this.score = score;
	}

	public double getScore() { return this.score; }
}</pre>
<p>Il ne reste qu&#8217;a créer une méthode <em>assertScore()</em> qui va nous permettre de lever nos <em>AssertionScoreError</em> :</p>
<pre name="code" class="java">package evaluator;

/**
 * @author tvibes
 */
public class ExtendedAssert {

	public static void fail(double score){
		fail(null, score);
	}
	public static void fail(String message, double score){
		throw new AssertionScoreError(message == null ? "" : message, score);
	}
	static public void assertScore(String message, double score){
		if(score&lt;1)
			fail(message, score);
	}
}</pre>
<h3>Les méthodes @DataProvider : &#8220;alimenter&#8221; nos méthodes de tests en données.</h3>
<p><a href="http://www.mkyong.com/unittest/junit-4-tutorial-6-parameterized-test/" target="_BLANK">Plus simple à manipuler que l&#8217;équivalent JUnit @Parameters</a>, c&#8217;est véritablement la fonctionnalité qu&#8217;il nous fallait pour pouvoir jouer notre test de composant sur un corpus de test. Le <em>Data Provider</em> est une méthode <del datetime="2010-12-22T07:54:04+00:00">statique</del> qui doit retourner Object[][] (<a href="http://testng.org/doc/documentation-main.html#parameters-dataproviders" target="_blank">voir documentation</a>)</p>
<pre name="code" class="java">package evaluator.unit.testng;

import static evaluator.ExtendedAssert.assertScore;

import java.util.ArrayList;
import java.util.List;
import org.testng.annotations.Test;
import evaluator.dataproviders.SocialDataProvider;
import evaluator.scoring.IScoringService;
import ac.search.SocialSearcher;
import ac.output.SocialInteraction;

/**
* @author tvibes
*/
@Test(suiteName="Tests unitaires", testName="Classification")
public class ClassificationTest {

	IScoringService&lt;List&lt;SocialInteraction&gt;&gt; scoringService = null;

	public ClassificationTest(){
		scoringService = new evaluator.scoring.FMeasureSocialInteractionService();
	}

	/**
	* Test method for "message classification"
	* @param testMessage
	*         A test message
	* @param classes
	*         A list with the expected business objects (SocialInteraction)
	*/
	@Test(dataProvider="createSocialMessage")
	public void testClassificationNG(String testMessage, List&lt;SocialInteraction&gt; classes){
		SocialSearcher searcher = new SocialSearcher();
		List&lt;SocialInteraction&gt; current = searcher.getSocialResults(testMessage);
		double score = scoringService.calculate(current, classes);
		assertScore("Résultat: " + current.toString(), score);
	}

	@DataProvider(name="createSocialMessage")
	public static Object[][] createSocialMessage(){
		Object[][] corpus = new Object[][]{
			{"Bonjour", new SocialInteraction(SocialInteraction.OUVERTURE, 100)},
			{"Au revoir", new SocialInteraction(SocialInteraction.FERMETURE, 100)},
		};
	}
}</pre>
<p>Dans cet exemple, la méthode <em>data provider</em> fourni un corpus contenant 2 phrases avec le résultat attendu.<br />
Il est possible d&#8217;externaliser la méthode dans une classe &#8220;dédiée&#8221; grâce à l&#8217;attribut <em>dataProviderClass</em> de l&#8217;annotation @Test. Pour notre projet, cette classe dédiée charge un corpus de tests (280 messages) depuis une base de données et TestNG appelle la méthode testClassificationNG autant de fois que nécessaire.<br />
Nous avons développé un service qui calcule le score (à l&#8217;aide de la formule F-Mesure) que l&#8217;on invoque ici.<br />
Notre méthode spécifique <em>assertScore()</em> permet donc de lever une AssertionScoreError si le score est &lt; à 1 (on est jamais trop exigeant <img src='http://blog.onyme.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> ).</p>
<h2>Gestion des corpus de tests</h2>
<p>Pour des questions pratiques, nous stockons le corpus de test dans une base de données dont voici le modèle physique :</p>
<div id="attachment_559" class="wp-caption aligncenter" style="width: 560px"><img class="size-full wp-image-559" src="http://blog.onyme.com/wp-content/uploads/2010/12/corpus-mpd.png" alt="Modèle physique pour le stockage du corpus de test" width="550" height="346" /><p class="wp-caption-text">Modèle physique pour le stockage du corpus de test</p></div>
<p>La table <strong>DATA</strong> est la plus importante : c&#8217;est elle qui contient les verbatims ainsi que les résultats attendus. Les résultats attendus (colonne <em>expected</em>) sont des objets que le module TAL est censés produire.</p>
<p>Pour l&#8217;accès au corpus de tests, nous ajoutons quelques librairies bien utiles :</p>
<ul>
<li><a href="http://xstream.codehaus.org/" target="_blank">Xstream</a> : Librairie permettant de sérialiser un objet au format XML. Ainsi nous stockons n&#8217;importe quel objet dans notre table DATA, et le XML est plus souple que le binaire.</li>
<li>simple-jndi : Conteneur JNDI léger (42 Ko) et idéal pour les tests car il ne tire aucune dépendance et ne nécessite <span style="text-decoration: underline;">aucune</span> ligne de code pour charger le conteneur et une <em>DataSource</em></li>
<li>jTDS : Connecteur JDBC open-source pour Microsoft SQL Server (Le SGBDR étant imposé par le client pour le projet global nous avons conservé ce système pour notre base de corpus de tests)</li>
</ul>
<h2>Reporting</h2>
<h3>ReportNG</h3>
<p>Un des points noirs pour notre projet dans les briques rassemblées jusqu&#8217;ici est la génération de rapport par TestNG : les rapports sont vraiment moches (J&#8217;espère que Cédric Beust me pardonnera, si un jour il lit ce billet). Heureusement, l&#8217;extensibilité du framework (existence d&#8217;une API de reporting) a fait que des développeurs ont mis au point des modules de génération de rapports beaucoup plus esthétiques. C&#8217;est le cas de <a href=http://dandyer.co.uk/ target="_blank">Dan Dyer</a> qui propose le plug-in <a href="http://reportng.uncommons.org/" target="_blank">ReportNG</a></p>
<p>ReportNG est disponible dans le repository Maven ou sur Github.</p>
<p>A la base ReportNG prévoit la possibilité de surcharger la feuille de style. C&#8217;est bien, mais insuffisant pour nous : Nous avons besoin de modifier les pages pour y faire apparaître nos indicateurs. ReportNG utilise le moteur de template Velocity.</p>
<ul>
<li><strong>les +</strong>: Je n&#8217;avais jamais utilisé Velocity, mais il s&#8217;avère être un excellent choix car il est vraiment simple à appréhender. Par ailleurs, il convient bien avec le modèle d&#8217;objets de TestNG.</li>
<li><strong>les -</strong>: ReportNG embarque ses templates dans le Jar et ne prévoit pas de moyen de sépcifier d&#8217;autres templates. De plus, la classe chargée de la génération du rapport (classe <em>HTMLReporter</em> qui implémente <a href="http://testng.org/javadocs/org/testng/IReporter.html" target="_blank">org.testng.IReporter</a>) défini tous ces attributs et méthodes en <em>private</em> ce qui rend plus difficile la surcharge.</li>
</ul>
<div id="attachment_576" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.onyme.com/wp-content/uploads/2010/12/capture-synthese-300x174.png"><img class="size-medium wp-image-576" title="capture-synthese" src="http://blog.onyme.com/wp-content/uploads/2010/12/capture-synthese.png" alt="Capture d'écran de l'écran de synthèse" width="300" height="174" /></a><p class="wp-caption-text">Exemple de rapport - l'évaluation de nombreux composants est présentée</p></div>
<p>Grâce à quelques <em>helpers</em> que nous déclarons dans le contexte Velocity, nous pouvons mettre en forme notre rapport de synthèse qui agrège les scores de l&#8217;ensemble des tests. Les différents résultats sont &#8220;colorés&#8221; de manière à identifier rapidement les séries de tests qui donnent de bons résultats ou ceux qui en donnent de mauvais et sur lesquels nous allons devoir travailler! (exemple: vert = score > à 80%; rouge sombre = score < à 20%)</p>
<h3>maven-site-plugin</h3>
<p>Ce plug-in pour Maven permet d&#8217;ajouter des pages de documentation ou d&#8217;analyse à nos rapports. Je ne vais pas détailler cette partie, la <a href="http://maven.apache.org/plugins/maven-site-plugin/" target="_blank">documentation du plug-in</a> permet de rapidement comprendre comment générer un &#8220;maven site&#8221; et y intégrer les rapports produits par ReportNG.</p>
<h2>Conclusion</h2>
<p>Dans notre précédent billet, nous tentions de démontrer à quel point l&#8217;évaluation continue des résultats est importante dans un projet R&amp;D.</p>
<p>Avec TestNG, nous disposons de l&#8217;outil permettant de concrétiser cette démarche d&#8217;évaluation sans avoir passé trop de temps sur la mise au point. Il s&#8217;intègre bien à Maven et nous pourrions aller jusqu&#8217;à déclencher l&#8217;évaluation à chaque <i>commit</i> dans les composants de traitement, sur notre serveur Hudson et regénérer les rapports.</p>
<p>Par ailleurs, cet ensemble pourra être réutilisé dans nos autres projets. Il ne nous suffira plus que :</p>
<ul>
<li>de constituer les corpus de tests</li>
<li>coder que les services d&#8217;évaluation.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.onyme.com/la-rd-pilotee-par-les-tests-avec-testng/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
