<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://www.fabienpoulard.info/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Blog d'un jeune (chercheur) entrepreneur en TAL</title>
  <link>http://www.fabienpoulard.info/</link>
  <atom:link href="http://www.fabienpoulard.info/feed/rss2" rel="self" type="application/rss+xml"/>
  <description></description>
  <language>fr</language>
  <pubDate>Wed, 22 Feb 2012 21:40:05 +0100</pubDate>
  <copyright>© Fabien Poulard</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Premiers pas avec UIMA AS</title>
    <link>http://www.fabienpoulard.info/post/2012/01/06/Premiers-pas-avec-UIMA-AS</link>
    <guid isPermaLink="false">urn:md5:e53f6060b6b75ffc541bc73c456a8ffa</guid>
    <pubDate>Mon, 09 Jan 2012 10:00:00 +0100</pubDate>
    <dc:creator>Fabien Poulard</dc:creator>
        <category>Geek &amp; Technique</category>
        <category>uima</category><category>uima as</category>    
    <description>&lt;p&gt;&lt;a href=&quot;http://uima.apache.org&quot; hreflang=&quot;en&quot; title=&quot;Apache UIMA&quot;&gt;UIMA&lt;/a&gt; offre un cadre de développement structurant pour la mise au point de chaînes de traitement de l'information non structurée. S'il permet simplement de déployer des chaînes complexes et tirer parti de la puissance de calcul des processeurs multicœurs, l'ordonnanceur -- le &lt;a href=&quot;http://uima.apache.org/d/uimaj-2.4.0/references.html#ugr.ref.xml.cpe_descriptor&quot; hreflang=&quot;en&quot;&gt;CPM&lt;/a&gt; -- a plusieurs limites :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Il n'est pas aisé de déployer une chaîne sur plusieurs machines ;&lt;/li&gt;
&lt;li&gt;L'affectation de ressources se fait au niveau de la chaîne (CPE) et non au niveau des composants alors que le coût d'exécution de ces derniers est fortement variable ;&lt;/li&gt;
&lt;li&gt;Les chaînes ne peuvent pas directement traiter un flux continu de données.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le développement d'&lt;a href=&quot;http://uima.apache.org/doc-uimaas-what.html&quot; hreflang=&quot;en&quot;&gt;UIMA AS&lt;/a&gt; cherche à répondre à ces limitations.&lt;/p&gt;    &lt;h2&gt;Principe général&lt;/h2&gt;


&lt;p&gt;UIMA AS est développé en remplacement du &lt;em&gt;Collection Processing Manager&lt;/em&gt; (&lt;em&gt;CPM&lt;/em&gt;) dans le but d'offrir de meilleures capacités de flexibilités et montée en charge. UIMA AS ne remplace nullement UIMA, et les composants développés pour UIMA peuvent aussi bien fonctionner dans une chaîne UIMA AS. AS profite du système d&lt;em&gt;'&lt;a href=&quot;http://uima.apache.org/d/uimaj-2.4.0/tutorials_and_users_guides.html#ugr.tug.aae.building_aggregates&quot; hreflang=&quot;en&quot;&gt;Aggregate&lt;/a&gt;&lt;/em&gt; pour organiser les composants en chaînes de traitement, tirant parti au passage des capacités des &lt;em&gt;&lt;a href=&quot;http://uima.apache.org/d/uimaj-2.4.0/tutorials_and_users_guides.html#ugr.tug.fc&quot; hreflang=&quot;en&quot;&gt;flow controllers&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;


&lt;h3&gt;L'approche CPM (UIMA classique)&lt;/h3&gt;


&lt;p&gt;Lorsqu'une chaîne de traitement UIMA est déployée par le CPM, la configuration suivante se met en place :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le CPM instancie autant de &lt;em&gt;processing pipelines&lt;/em&gt; (PP, combinaison séquentielle de composants) que nécessaire, chaque PP contenant une seule et unique instance de chaque composant ;&lt;/li&gt;
&lt;li&gt;le &lt;em&gt;Collection Reader&lt;/em&gt; (CR) est instancié dans un seul thread (pas de parallélisation possible) ;&lt;/li&gt;
&lt;li&gt;les CAS produits par le CR sont stockés dans une queue tampon avant d'être distribués vers les différents PP qui ne peuvent qu'en traiter un à la fois : un CAS en sortie d'un composant est directement passé en entrée du composant suivant.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ce fonctionnement est décrit par le schéma suivant tiré de la documentation d'Apache UIMA si ce n'est que les &lt;em&gt;cas consumers&lt;/em&gt; n'existent plus en tant qu'entités particulières mais sont des composants comme les autres (et donc instanciés dans les PP) :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.fabienpoulard.info/public/UIMA/cpe-detail.png&quot; title=&quot;cpe-detail.png&quot;&gt;&lt;img src=&quot;http://www.fabienpoulard.info/public/UIMA/.cpe-detail_m.jpg&quot; alt=&quot;cpe-detail.png&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;cpe-detail.png, juil. 2010&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;L'approche UIMA AS&lt;/h3&gt;


&lt;p&gt;Les chaînes dans UIMA AS sont déployées sous forme de &lt;em&gt;services&lt;/em&gt; auxquels peuvent se connecter des clients. Les clients envoient des requêtes au service puis attendent le résultat du traitement. L'interface entre les clients et les services se fait au travers d'un &lt;a href=&quot;http://fr.wikipedia.org/wiki/Message-Oriented_Middleware&quot; hreflang=&quot;fr&quot;&gt;système de messagerie asynchrone&lt;/a&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;les requêtes des clients sont stockées dans une queue tampon en entrée du service similaire à la queue du PP pour le CPM ;&lt;/li&gt;
&lt;li&gt;les résultats des traitements sont renvoyées dans une queue tampon propre à chaque client.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ce fonctionnement est décrit par le schéma ci-dessous tiré de la documentation d'Apache UIMA AS. Il permet d'instancier une seule fois une chaîne de traitement et de lui soumettre un flux continu de données à traiter en provenance potentiellement de plusieurs sources.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.fabienpoulard.info/public/UIMA/uima-as-arch.png&quot; title=&quot;uima-as-arch.png&quot;&gt;&lt;img src=&quot;http://www.fabienpoulard.info/public/UIMA/.uima-as-arch_m.jpg&quot; alt=&quot;uima-as-arch.png&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;uima-as-arch.png, janv. 2012&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Le système de messagerie asynchrone prend en charge la distribution des requêtes entre différentes instances potentielles du service permettant ainsi une montée en charge à chaud. Il suffit de déployer une nouvelle instance du service et lui indiquer de se connecter à la queue tampon d'entrée pour augmenter les capacités de traitement. Le système de messagerie utilisé par défaut, &lt;a href=&quot;http://en.wikipedia.org/wiki/Apache_ActiveMQ&quot; hreflang=&quot;en&quot;&gt;ActiveMQ&lt;/a&gt;, ayant la capacité de communiquer au travers du réseau, ledit service peut tout à fait être déployé sur une machine distante.&lt;/p&gt;


&lt;p&gt;Une autre force de UIMA AS est que ce système de queue tampons et de routage des CAS au travers d'un système de messagerie asynchrone &lt;a href=&quot;http://uima.apache.org/d/uima-as-2.3.1/uima_async_scaleout.html#ugr.async.ov.concepts.deploying&quot; hreflang=&quot;en&quot;&gt;peut être mis en place au sein même du service entre les différents composants&lt;/a&gt;. Pour cette première prise en main évitons tout de même de compliquer les choses...&lt;/p&gt;


&lt;h2&gt;Mise en place de l'environnement&lt;/h2&gt;


&lt;p&gt;La mise en place d'une chaîne de traitement UIMA AS comparable à un CPE nécessite trois éléments : le service UIMA AS en charge du traitement, le client qui soumet les données et récupère les résultats du traitement et le système de messagerie coordonne la communication entre ces deux premiers.&lt;/p&gt;


&lt;p&gt;La mise en place d'un service UIMA AS nécessite, outre le développement des composants, un descripteur de déploiement (&lt;em&gt;deployment descriptor&lt;/em&gt;). Afin de simplifier son écriture dans la prochaine section de ce billet, il est préférable d'&lt;a href=&quot;http://www.fabienpoulard.info/post/2012/01/05/Installation-des-plugins-UIMA-AS-sous-Eclipse-Indigo&quot;&gt;installer les plugins Eclipse dédiés&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Un certain nombre de dépendances sont nécessaires pour la compilation et l'exécution d'un service et d'un client UIMA AS, &lt;em&gt;a minima&lt;/em&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://uima.apache.org/downloads.cgi#Latest%20Official%20Releases&quot; hreflang=&quot;en&quot;&gt;les bibliothèques UIMA AS&lt;/a&gt; ; par simplicité les bibliothèques classiques UIMA (hors &lt;em&gt;addons&lt;/em&gt;) sont également packagées dans l'archive UIMA AS. La suite du billet repose sur la version 2.3.1.&lt;/li&gt;
&lt;li&gt;un certain nombre de bibliothèques &lt;a href=&quot;http://www.springsource.org/&quot; hreflang=&quot;en&quot;&gt;Spring&lt;/a&gt; :
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://repo1.maven.org/maven2/org/springframework/spring-aop/3.0.3.RELEASE/spring-aop-3.0.3.RELEASE.jar&quot;&gt;spring-aop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://repo1.maven.org/maven2/org/springframework/spring-asm/3.0.3.RELEASE/spring-asm-3.0.3.RELEASE.jar&quot;&gt;spring-asm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://repo1.maven.org/maven2/org/springframework/spring-beans/3.0.3.RELEASE/spring-beans-3.0.3.RELEASE.jar&quot;&gt;spring-beans&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://repo1.maven.org/maven2/org/springframework/spring-context/3.0.3.RELEASE/spring-context-3.0.3.RELEASE.jar&quot;&gt;spring-context&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://repo1.maven.org/maven2/org/springframework/spring-context-support/3.0.3.RELEASE/spring-context-support-3.0.3.RELEASE.jar&quot;&gt;spring-context-support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://repo1.maven.org/maven2/org/springframework/spring-core/3.0.3.RELEASE/spring-core-3.0.3.RELEASE.jar&quot;&gt;spring-core&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://repo1.maven.org/maven2/org/springframework/spring-expression/3.0.3.RELEASE/spring-expression-3.0.3.RELEASE.jar&quot;&gt;spring-expression&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://repo1.maven.org/maven2/org/springframework/spring-jms/3.0.3.RELEASE/spring-jms-3.0.3.RELEASE.jar&quot;&gt;spring-jms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://repo1.maven.org/maven2/org/springframework/spring-tx/3.0.3.RELEASE/spring-tx-3.0.3.RELEASE.jar&quot;&gt;spring-tx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://repo1.maven.org/maven2/org/springframework/spring-web/3.0.3.RELEASE/spring-web-3.0.3.RELEASE.jar&quot;&gt;spring-web&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://repo1.maven.org/maven2/org/springframework/spring-webmvc/3.0.3.RELEASE/spring-webmvc-3.0.3.RELEASE.jar&quot;&gt;spring-webmvc&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finalement, il est nécessaire d'installer un système de messagerie de type &lt;a href=&quot;http://fr.wikipedia.org/wiki/Java_Message_Service&quot; hreflang=&quot;fr&quot;&gt;JMS&lt;/a&gt;. Le plus simple est d'utiliser celui proposé par défaut : &lt;a href=&quot;http://activemq.apache.org/&quot; hreflang=&quot;en&quot;&gt;Apache ActiveMQ&lt;/a&gt;. Une version est distribuée dans l'archive UIMA AS. Toutefois, si vous êtes sous un environnement Linux, il sera plus aisé et pérenne du paquetage de votre distribution.&lt;/p&gt;


&lt;p&gt;Ainsi pour Debian Wheezy, installez le paquet :&lt;/p&gt;

&lt;pre&gt;
sudo apt-get install activemq
&lt;/pre&gt;


&lt;p&gt;puis activez l'instance par défaut :&lt;/p&gt;

&lt;pre&gt;
cd /etc/activemq/instances-enabled/
sudo ln -s ../instances-available/main/
&lt;/pre&gt;


&lt;p&gt;et lancez enfin le système :&lt;/p&gt;

&lt;pre&gt;
sudo /etc/init.d/activemq start
&lt;/pre&gt;


&lt;h2&gt;Création et déploiement d'un service&lt;/h2&gt;


&lt;h3&gt;Descripteur de déploiement&lt;/h3&gt;


&lt;p&gt;Le déploiement d'un service UIMA AS nécessite deux descripteurs :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un descripteur de composant qui définit l&lt;em&gt;'aggregate&lt;/em&gt; qui sera déployé ;&lt;/li&gt;
&lt;li&gt;Un descripteur de déploiement qui décrit comment l&lt;em&gt;'aggregate&lt;/em&gt; sera déployé.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour l'exercice nous déploierons un composant de prétraitement : découpage en phrases, en mots et étiquetage des rôles grammaticaux. Nous utiliserons pour cela les composants &lt;em&gt;addons&lt;/em&gt; distribués avec UIMA : le WhitespaceTokenizer et le HMMTagger. L'écriture de l&lt;em&gt;'aggregate&lt;/em&gt; ne pose pas de difficulté particulière, il s'agit d'&lt;a href=&quot;http://uima.apache.org/d/uimaj-2.3.1/references.html#ugr.ref.xml.component_descriptor.aes.aggregate&quot; hreflang=&quot;en&quot;&gt;un composant UIMA classique sans aucune spécificité&lt;/a&gt; que nous nommerons &lt;code&gt;POSTagger.xml&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;Le descripteur de déploiement est une nouveauté de UIMA AS. Il est disponible dans l'assistant de création d'un nouveau fichier sous la catégorie UIMA aux côtés des autres descripteurs, si tant est que &lt;a href=&quot;http://www.fabienpoulard.info/post/2012/01/05/Installation-des-plugins-UIMA-AS-sous-Eclipse-Indigo&quot;&gt;vous avez correctement installé les plugins UIMA AS&lt;/a&gt;. Nous le nommerons &lt;code&gt;POSTagger-Service.xml&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.fabienpoulard.info/public/2012/UIMA/uima-deployment-descriptor.png&quot; title=&quot;Création d'un nouveau descripteur de déploiement UIMA AS&quot;&gt;&lt;img src=&quot;http://www.fabienpoulard.info/public/2012/UIMA/.uima-deployment-descriptor_m.jpg&quot; alt=&quot;Création d'un nouveau descripteur de déploiement UIMA AS&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;Création d'un nouveau descripteur de déploiement UIMA AS, janv. 2012&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Le descripteur de déploiement se compose de deux onglets : un onglet de configuration générale (&lt;em&gt;Overview&lt;/em&gt;) et un onglet de configuration du déploiement (&lt;em&gt;Deployment Configurations&lt;/em&gt;). Il faut préciser dans l'onglet de configuration générale le nom de la queue de messagerie sur laquelle le service sera joignable (&lt;em&gt;Name for input queue&lt;/em&gt;) et le nom de l&lt;em&gt;'aggregate&lt;/em&gt; à déployer comme service (&lt;em&gt;Top analysis engine descriptor&lt;/em&gt;). Ces deux champs sont mis en valeur dans la capture d'écran ci-dessous.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.fabienpoulard.info/public/2012/UIMA/uima-deployment-descriptor-page1.png&quot; title=&quot;Complétion de la configuration générale du déploiement&quot;&gt;&lt;img src=&quot;http://www.fabienpoulard.info/public/2012/UIMA/.uima-deployment-descriptor-page1_m.jpg&quot; alt=&quot;Complétion de la configuration générale du déploiement&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;Complétion de la configuration générale du déploiement, janv. 2012&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Par défaut il n'est pas nécessaire d'intervenir sur la configuration du déploiement. Le service sera alors déployé tel qu'il l'aurait été sous forme d'un CPE, c-à-d sans contrôle particulier sur les composants qui composent l&lt;em&gt;'aggregate&lt;/em&gt;. Pour l'exercice, nous allons le déployé comme un &lt;em&gt;aggregate UIMA AS&lt;/em&gt;, c-à-d que chaque composant de l&lt;em&gt;'aggregate&lt;/em&gt; est lui-même déployé comme un service connecté aux autres composants par le système de messageries et de queues.&lt;/p&gt;


&lt;p&gt;Ce déploiement nécessite simplement de cocher la case &lt;em&gt;Run as AS aggregate&lt;/em&gt;. Une fois coché, les différents composants qui constituent l&lt;em&gt;'aggregate&lt;/em&gt; sont accessibles pour une configuration propre.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.fabienpoulard.info/public/2012/UIMA/uima-deployment-descriptor-page2-ASaggregate.png&quot; title=&quot;Configuration du déploiement comme un AS Aggregate&quot;&gt;&lt;img src=&quot;http://www.fabienpoulard.info/public/2012/UIMA/.uima-deployment-descriptor-page2-ASaggregate_m.jpg&quot; alt=&quot;Configuration du déploiement comme un AS Aggregate&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;Configuration du déploiement comme un AS Aggregate, janv. 2012&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Pour simplifier nous considérerons qu'ils sont tous déployés en local et dans la même JVM. Nous allons simplement demander de déployer trois instances du HMMTagger étant donné que c'est le composant le plus coûteux. Il suffit pour ce faire de sélectionner le composant HMMTagger dans la liste puis de positionner  le paramètre &lt;em&gt;Number of replicated instances&lt;/em&gt; sur 3.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.fabienpoulard.info/public/2012/UIMA/uima-deployment-descriptor-page2-AEinstances.png&quot; title=&quot;Configuration du nombre d'instances déployées pour chaque service&quot;&gt;&lt;img src=&quot;http://www.fabienpoulard.info/public/2012/UIMA/.uima-deployment-descriptor-page2-AEinstances_m.jpg&quot; alt=&quot;Configuration du nombre d'instances déployées pour chaque service&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;Configuration du nombre d'instances déployées pour chaque service, janv. 2012&quot; /&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h3&gt;Écriture du client asynchrone&lt;/h3&gt;


&lt;p&gt;Une fois le descripteur de déploiement écrit, il ne reste plus qu'à écrire le code du client asynchrone qui va s'y connecter. La documentation d'UIMA AS décrit en détail &lt;a href=&quot;http://uima.apache.org/d/uima-as-2.3.1/uima_async_scaleout.html#ugr.ref.async.api.usage&quot; hreflang=&quot;en&quot;&gt;un cas d'utilisation&lt;/a&gt; duquel ce billet s'inspire.&lt;/p&gt;


&lt;p&gt;Tout d'abord, toujours dans le cadre de l'exercice, nous faisons le choix que le service soit déployé par l'application elle-même :&lt;/p&gt;

&lt;pre class=&quot;java java&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;final&lt;/span&gt; &lt;span style=&quot;color: #003399;&quot;&gt;String&lt;/span&gt; DD2SPRINGXSLTFILEPATH &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; 
	&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;quot;/LIBS-APPS/UIMA/apache-uima-as-2.3.1/bin/dd2spring.xsl&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;final&lt;/span&gt; &lt;span style=&quot;color: #003399;&quot;&gt;String&lt;/span&gt; SAXONCLASSPATH &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; 
	&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;quot;file:/LIBS-APPS/UIMA/apache-uima-as-2.3.1/saxon/saxon8.jar&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;final&lt;/span&gt; &lt;span style=&quot;color: #003399;&quot;&gt;String&lt;/span&gt; DEPLOYMENTDESCRIPTOR &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt;
	&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;quot;desc/POSTagger-Service.xml&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
...
&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;// Create Asynchronous Client API&lt;/span&gt;
BaseUIMAAsynchronousEngine_impl uimaAsEngine &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; 
		&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; BaseUIMAAsynchronousEngine_impl&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
 
&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;///////////////////////////////////////////////////// SERVICE DEPLOYING&lt;/span&gt;
&lt;span style=&quot;color: #003399;&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color: #006633;&quot;&gt;out&lt;/span&gt;.&lt;span style=&quot;color: #006633;&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;quot;Deploying service&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;// Create a Map to hold required parameters&lt;/span&gt;
Map&lt;span style=&quot;color: #339933;&quot;&gt;&amp;lt;&lt;/span&gt;String, Object&lt;span style=&quot;color: #339933;&quot;&gt;&amp;gt;&lt;/span&gt; servCtxt &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; HashMap&lt;span style=&quot;color: #339933;&quot;&gt;&amp;lt;&lt;/span&gt;String, Object&lt;span style=&quot;color: #339933;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
servCtxt.&lt;span style=&quot;color: #006633;&quot;&gt;put&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;UimaAsynchronousEngine.&lt;span style=&quot;color: #006633;&quot;&gt;DD2SpringXsltFilePath&lt;/span&gt;, 
		DD2SPRINGXSLTFILEPATH&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
servCtxt.&lt;span style=&quot;color: #006633;&quot;&gt;put&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;UimaAsynchronousEngine.&lt;span style=&quot;color: #006633;&quot;&gt;SaxonClasspath&lt;/span&gt;,
		SAXONCLASSPATH&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #003399;&quot;&gt;String&lt;/span&gt; serviceId &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; uimaAsEngine.&lt;span style=&quot;color: #006633;&quot;&gt;deploy&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;DEPLOYMENTDESCRIPTOR, servCtxt&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #003399;&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color: #006633;&quot;&gt;out&lt;/span&gt;.&lt;span style=&quot;color: #006633;&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\t&lt;/span&gt;...Service deployed !&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Une fois le service déployé, nous allons configurer un client asynchrone pour s'y connecter et soumettre des requêtes. Il est important ici que :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le paramètre &lt;code&gt;UimaAsynchronousEngine.ServerUri&lt;/code&gt; corresponde à l'adresse du gestionnaire de messagerie (&lt;em&gt;broker&lt;/em&gt;) spécifié auparavant dans le descripteur de déploiement (nous avons laissé la valeur par défaut &lt;code&gt;${defaultBrokerURL}&lt;/code&gt;, nous verrons après comment la spécifier à l'exécution) ;&lt;/li&gt;
&lt;li&gt;le paramètre &lt;code&gt;UimaAsynchronousEngine.Endpoint&lt;/code&gt; doit correspondre au nom de la queue sur laquelle le service est joignable.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;java java&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;///////////////////////////////////////////////////// SERVICE EXECUTION&lt;/span&gt;
&lt;span style=&quot;color: #003399;&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color: #006633;&quot;&gt;out&lt;/span&gt;.&lt;span style=&quot;color: #006633;&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;quot;Preparing for execution&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;// Create map to pass server URI and Endpoint parameters&lt;/span&gt;
Map&lt;span style=&quot;color: #339933;&quot;&gt;&amp;lt;&lt;/span&gt;String, Object&lt;span style=&quot;color: #339933;&quot;&gt;&amp;gt;&lt;/span&gt; appCtxt &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; HashMap&lt;span style=&quot;color: #339933;&quot;&gt;&amp;lt;&lt;/span&gt;String, Object&lt;span style=&quot;color: #339933;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
appCtxt.&lt;span style=&quot;color: #006633;&quot;&gt;put&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;UimaAsynchronousEngine.&lt;span style=&quot;color: #006633;&quot;&gt;ServerUri&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;quot;tcp://localhost:61616&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
appCtxt.&lt;span style=&quot;color: #006633;&quot;&gt;put&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;UimaAsynchronousEngine.&lt;span style=&quot;color: #006633;&quot;&gt;Endpoint&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;quot;POSTaggerQueue&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
appCtxt.&lt;span style=&quot;color: #006633;&quot;&gt;put&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;UimaAsynchronousEngine.&lt;span style=&quot;color: #006633;&quot;&gt;CasPoolSize&lt;/span&gt;, &lt;span style=&quot;color: #cc66cc;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;// Initialize&lt;/span&gt;
uimaAsEngine.&lt;span style=&quot;color: #006633;&quot;&gt;initialize&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;appCtxt&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
uimaAsEngine.&lt;span style=&quot;color: #006633;&quot;&gt;addStatusCallbackListener&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; MyStatusCallbackListener&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;// Get an empty CAS from the Cas pool&lt;/span&gt;
CAS cas &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; uimaAsEngine.&lt;span style=&quot;color: #006633;&quot;&gt;getCAS&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #003399;&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color: #006633;&quot;&gt;out&lt;/span&gt;.&lt;span style=&quot;color: #006633;&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\t&lt;/span&gt;...CAS retrieved&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;// Initialize it with input data&lt;/span&gt;
cas.&lt;span style=&quot;color: #006633;&quot;&gt;setDocumentText&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;quot;Un exemple de texte...&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
cas.&lt;span style=&quot;color: #006633;&quot;&gt;setDocumentLanguage&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;quot;fr&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;// Send CAS to service for processing&lt;/span&gt;
uimaAsEngine.&lt;span style=&quot;color: #006633;&quot;&gt;sendCAS&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;cas&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #003399;&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color: #006633;&quot;&gt;out&lt;/span&gt;.&lt;span style=&quot;color: #006633;&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\t&lt;/span&gt;...CAS sent&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Il est intéressant d'observer le fonctionnement du client :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;L'initialisation consiste, outre la configuration des différents paramètres précités, à définir l'instance &lt;em&gt;StatusCallbackListener&lt;/em&gt; qui sera chargée de consommer les résultats du traitement par le service (toute l'asynchronicité du client réside dans ce fonctionnement) ;&lt;/li&gt;
&lt;li&gt;L'envoi d'une demande de traitement passe d'abord par la demande d'un CAS disponible par la méthode &lt;code&gt;getCAS()&lt;/code&gt;. Une fois le CAS obtenu, il est initialisé comme le ferait un &lt;em&gt;Collection Reader&lt;/em&gt;, puis soumis au système par la méthode &lt;code&gt;sendCAS()&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Il ne reste alors plus qu'à implémenter le &lt;em&gt;StatusCallbackListener&lt;/em&gt; et plus particulièrement la méthode &lt;code&gt;entityProcessComplete&lt;/code&gt; appelée lorsque le traitement d'un CAS est terminé :&lt;/p&gt;

&lt;pre class=&quot;java java&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt; MyStatusCallbackListener &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;extends&lt;/span&gt; UimaAsBaseCallbackListener &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
 
	@Override
	&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;void&lt;/span&gt; entityProcessComplete&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;CAS aCas, EntityProcessStatus aStatus&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
		&lt;span style=&quot;color: #003399;&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color: #006633;&quot;&gt;out&lt;/span&gt;.&lt;span style=&quot;color: #006633;&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;quot;Entity process complete.&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
		&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;// Handle errors&lt;/span&gt;
		&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;aStatus &lt;span style=&quot;color: #339933;&quot;&gt;!=&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; aStatus.&lt;span style=&quot;color: #006633;&quot;&gt;isException&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
			List&lt;span style=&quot;color: #339933;&quot;&gt;&amp;lt;&lt;/span&gt;Exception&lt;span style=&quot;color: #339933;&quot;&gt;&amp;gt;&lt;/span&gt; exceptions &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; aStatus.&lt;span style=&quot;color: #006633;&quot;&gt;getExceptions&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
			&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #003399;&quot;&gt;Exception&lt;/span&gt; e&lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; exceptions&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
				e.&lt;span style=&quot;color: #006633;&quot;&gt;printStackTrace&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
			&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
			&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
		&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
		&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;// Process CAS&lt;/span&gt;
		&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;try&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
			&lt;span style=&quot;color: #003399;&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color: #006633;&quot;&gt;out&lt;/span&gt;.&lt;span style=&quot;color: #006633;&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;quot;Concepts identified:&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
			JCas jcas &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; aCas.&lt;span style=&quot;color: #006633;&quot;&gt;getJCas&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
			FSIterator&lt;span style=&quot;color: #339933;&quot;&gt;&amp;lt;&lt;/span&gt;Annotation&lt;span style=&quot;color: #339933;&quot;&gt;&amp;gt;&lt;/span&gt; it &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; 
					jcas.&lt;span style=&quot;color: #006633;&quot;&gt;getAnnotationIndex&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;T_Token.&lt;span style=&quot;color: #006633;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;.&lt;span style=&quot;color: #006633;&quot;&gt;iterator&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
			&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;while&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt; it.&lt;span style=&quot;color: #006633;&quot;&gt;hasNext&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
				T_Token token &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;T_Token&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; it.&lt;span style=&quot;color: #006633;&quot;&gt;next&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
				&lt;span style=&quot;color: #003399;&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color: #006633;&quot;&gt;out&lt;/span&gt;.&lt;span style=&quot;color: #006633;&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\t&lt;/span&gt;+ POS:&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;+&lt;/span&gt; token.&lt;span style=&quot;color: #006633;&quot;&gt;getPos&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
			&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
		&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;catch&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;CASException e&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
			&lt;span style=&quot;color: #003399;&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color: #006633;&quot;&gt;out&lt;/span&gt;.&lt;span style=&quot;color: #006633;&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;quot;Problem getting a JCas !&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
		&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
	&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
 
&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;&lt;/pre&gt;


&lt;h3&gt;Exécution&lt;/h3&gt;


&lt;p&gt;Une fois tout ce travail réalisé, il ne reste plus qu'à exécuter le tout. Il est nécessaire d'ajouter toutes les dépendances nécessaires à l'exécution soit toutes les bibliothèques UIMA et UIMA AS ainsi que les nombreuses dépendances Spring.&lt;/p&gt;


&lt;p&gt;Il est également nécessaire de spécifier, par le biais d'une variable de JVM l'adresse du gestionnaire de messagerie que nous avons positionné jusqu'alors à &lt;code&gt;${defaultBrokerURL}&lt;/code&gt;. Pour l'exercice, nous utilisons un &lt;em&gt;broker&lt;/em&gt; ActiveMQ local. Le paramètre de la JVM est donc le suivant :&lt;/p&gt;

&lt;pre&gt;
-DdefaultBrokerURL=tcp://localhost:61616
&lt;/pre&gt;


&lt;p&gt;À partir d'ici le service devrait se déployer et le client asynchrone s'y connecter sans accroc. Si vous rencontrez des erreurs du type &lt;em&gt;Connection refused&lt;/em&gt; c'est très probablement que votre système de messagerie ne tourne pas ou bien que les noms de queues précisés dans le descripteur et pour le client sont différents.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.fabienpoulard.info/post/2012/01/06/Premiers-pas-avec-UIMA-AS#comment-form</comments>
      <wfw:comment>http://www.fabienpoulard.info/post/2012/01/06/Premiers-pas-avec-UIMA-AS#comment-form</wfw:comment>
      <wfw:commentRss>http://www.fabienpoulard.info/feed/atom/comments/736</wfw:commentRss>
      </item>
    
  <item>
    <title>Installation des plugins UIMA-AS sous Eclipse Indigo</title>
    <link>http://www.fabienpoulard.info/post/2012/01/05/Installation-des-plugins-UIMA-AS-sous-Eclipse-Indigo</link>
    <guid isPermaLink="false">urn:md5:5056afd25a197ffde36db0f78cdfa953</guid>
    <pubDate>Thu, 05 Jan 2012 11:28:00 +0100</pubDate>
    <dc:creator>Fabien Poulard</dc:creator>
        <category>Geek &amp; Technique</category>
        <category>eclipse</category><category>uima</category>    
    <description>&lt;p&gt;Au sein de &lt;a href=&quot;http://www.dictanova-blog.com&quot; hreflang=&quot;fr&quot; title=&quot;Blog de Dictanova&quot;&gt;Dictanova&lt;/a&gt;, nous avons des besoins importants en  termes de distribution de la charge de calcul. Le &lt;em&gt;CPM&lt;/em&gt; classique d'UIMA (l'organe chargé de l'ordonnancement des traitements) ne répond pas suffisamment à nos besoins et nous nous tournons donc vers UIMA AS (pour &lt;em&gt;UIMA Asynchronous Scaleout&lt;/em&gt;) qui &lt;a href=&quot;http://uima.apache.org/d/uima-as-2.3.1/uima_async_scaleout.html#ugr.async.ov.as_vs_cpm&quot; hreflang=&quot;en&quot; title=&quot;Comparaison entre UIMA et UIMA AS&quot;&gt;offre des possibilités de montées en charge beaucoup plus importantes&lt;/a&gt; en permettant notamment de déployer les &lt;em&gt;Analysis Engine&lt;/em&gt; dans plusieurs JVM et sur plusieurs machines.&lt;/p&gt;


&lt;p&gt;Je décris dans ce billet la procédure que j'ai mise en oeuvre pour installer les plugins UIMA AS sous Eclipse Indigo.&lt;/p&gt;    &lt;h2&gt;Le problème&lt;/h2&gt;


&lt;p&gt;Dans le meilleur des mondes, l'installation des plugins UIMA AS devrait se dérouler sans encombre en utilisant le gestionnaire de plugins d'Eclipse. Cependant, si comme moi vous n'aviez jusqu'à présent que les plugins UIMA classiques d'installés et que vous souhaitez installer les plugins UIMA AS, Eclipse vous informera que c'est impossible car une dépendance n'a pas été trouvée.&lt;/p&gt;


&lt;p&gt;L'origine de ce problème est la &lt;a href=&quot;http://uima.apache.org/d/uimaj-2.4.0/RELEASE_NOTES.html&quot; hreflang=&quot;en&quot; title=&quot;Note de release UIMA 2.4.0&quot;&gt;récente release de UIMA 2.4.0&lt;/a&gt;, et la mise à jour dans cette version 2.4.0 des plugins alors que les plugins UIMA AS dépendent d'une version 2.3.x. Il est donc nécessaire de revenir à une version 2.3.1 des plugins UIMA avant d'installer les plugins UIMA AS.&lt;/p&gt;


&lt;h2&gt;Rétrograder les plugins Eclipse Apache UIMA en version 2.3.1 (&lt;em&gt;downgrade&lt;/em&gt;) pour installer le plugin UIMA AS&lt;/h2&gt;


&lt;p&gt;Il n'est pas directement possible de revenir à une version antérieure d'un plugin. Il est nécessaire dans un premier temps de désinstaller le plugin, puis d'installer la version antérieure.&lt;/p&gt;


&lt;p&gt;Pour désinstaller le plugin, il faut se rendre dans  le menu &lt;strong&gt;Aide &amp;gt; À propos d'Eclipse &amp;gt; Détails de l'installation&lt;/strong&gt; (Help &amp;gt; About Eclipse &amp;gt; Installation Details) comme le montrent les captures d'écran ci-dessous :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.fabienpoulard.info/public/2012/UIMA/eclipse-about-install.png&quot; title=&quot;eclipse-about-install.png&quot;&gt;&lt;img src=&quot;http://www.fabienpoulard.info/public/2012/UIMA/.eclipse-about-install_s.jpg&quot; alt=&quot;eclipse-about-install.png&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;eclipse-about-install.png, janv. 2012&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.fabienpoulard.info/public/2012/UIMA/eclipse-installation-details.png&quot; title=&quot;eclipse-installation-details.png&quot;&gt;&lt;img src=&quot;http://www.fabienpoulard.info/public/2012/UIMA/.eclipse-installation-details_s.jpg&quot; alt=&quot;eclipse-installation-details.png&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;eclipse-installation-details.png, janv. 2012&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;La fenêtre liste les &lt;em&gt;features&lt;/em&gt; actuellement installées. Sélectionnez celles qui correspondent à UIMA puis cliquez sur &lt;em&gt;Désinstaller&lt;/em&gt; (&lt;em&gt;Uninstall&lt;/em&gt;).&lt;/p&gt;


&lt;p&gt;Une fois la désinstallation effectuée et après avoir redémarrer Eclipse, il est possible d'installer la version 2.3.1 des plugins UIMA classiques et dans le même temps le plugin UIMA AS.&lt;/p&gt;


&lt;p&gt;Rendez-vous dans le menu &lt;strong&gt;Aide &amp;gt; Ajout de nouveaux logiciels&lt;/strong&gt; (&lt;strong&gt;Help &amp;gt; Install new software&lt;/strong&gt;), indiquez à l'assistant d'utiliser tous les sites à sa disposition et décochez la case indiquant de ne montrer que les dernières versions comme l'illustre la capture d'écran ci-dessous :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.fabienpoulard.info/public/2012/UIMA/eclipse-install-plugins.png&quot; title=&quot;eclipse-install-plugins.png&quot;&gt;&lt;img src=&quot;http://www.fabienpoulard.info/public/2012/UIMA/.eclipse-install-plugins_s.jpg&quot; alt=&quot;eclipse-install-plugins.png&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;eclipse-install-plugins.png, janv. 2012&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Il suffit ensuite de sélectionner les versions 2.3.1 des différents plugins : UIMA Runtime, UIMA tools et UIMA AS. L'installation devrait alors se dérouler sans accrocs.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.fabienpoulard.info/post/2012/01/05/Installation-des-plugins-UIMA-AS-sous-Eclipse-Indigo#comment-form</comments>
      <wfw:comment>http://www.fabienpoulard.info/post/2012/01/05/Installation-des-plugins-UIMA-AS-sous-Eclipse-Indigo#comment-form</wfw:comment>
      <wfw:commentRss>http://www.fabienpoulard.info/feed/atom/comments/733</wfw:commentRss>
      </item>
    
  <item>
    <title>Ouverture des données publiques à Nantes</title>
    <link>http://www.fabienpoulard.info/post/2011/11/22/Ouverture-des-donn%C3%A9es-publiques-%C3%A0-Nantes</link>
    <guid isPermaLink="false">urn:md5:83e3c61ade305a2cc6f3473e38a3a74c</guid>
    <pubDate>Tue, 22 Nov 2011 22:37:00 +0100</pubDate>
    <dc:creator>Fabien Poulard</dc:creator>
        <category>Geek &amp; Technique</category>
        <category>opendata</category><category>openstreetmap</category><category>python</category>    
    <description>&lt;p&gt;Ça y est c'est officiel, Nantes a lancée sa plateforme OpenData. Ça s'est passé ce lundi 21 novembre 2011 à &lt;a href=&quot;http://cantine-nantes.org/&quot; hreflang=&quot;fr&quot;&gt;la Cantine&lt;/a&gt; --- comme tous les évènements cools qui ont lieu sur Nantes, et je ne dis pas ça que parce que je suis fan de la Cantine Nantaise, d'Atlantic 2 et du quatuor de choc Adrien/Magali/Florent/Lucie !&lt;/p&gt;


&lt;p&gt;Le nombre de jeu de données est pour l'instant restreint, mais &lt;a href=&quot;http://data.nantes.fr/donnees/detail/?tx_icsoddatastore_pi1[uid]=14&quot; hreflang=&quot;fr&quot;&gt;un jeu&lt;/a&gt; en particulier a attiré les contributeurs &lt;a href=&quot;http://www.openstreetmap.org/&quot; hreflang=&quot;en&quot;&gt;OSM&lt;/a&gt;.&lt;/p&gt;    &lt;p&gt;Avant toute chose, merci à Nantes/Nantes-Métropole et surtout aux équipes qui en ont bavé pour tenir les promesses de J.M. Ayrault (c'est bien beau de faire des promesses politiques, mais s'il n'y a pas derrière des équipes qui tiennent la route pour mener les projets à bien, on ne va nul part). Merci bien entendu aussi à &lt;a href=&quot;http://libertic.wordpress.com/&quot; hreflang=&quot;fr&quot;&gt;LiberTIC&lt;/a&gt; et en particulier à Claire pour le formidable boulot accompli ;)&lt;/p&gt;


&lt;p&gt;Je crois que j'ai fait le tour des remerciements (non ce billet n'est pas sponsorisé...).&lt;/p&gt;


&lt;p&gt;Je disais donc qu'un jeu de données avait immédiatement attiré l'attention des contributeur : &lt;a href=&quot;http://data.nantes.fr/donnees/detail/?tx_icsoddatastore_pi1[uid]=14&quot; hreflang=&quot;fr&quot;&gt;le fichier des adresses postales de Nantes Métropole&lt;/a&gt;. Un fichier de 12 Mo pour des adresses postales... on s'est demandé ce qu'il pouvait bien pouvoir y avoir à l'intérieur. C'est somme tout assez simple et évident : les coordonnées GPS de toutes les boîtes aux lettres de l'agglomération Nantaise et les adresses associées.&lt;/p&gt;


&lt;p&gt;Outre &lt;a href=&quot;http://fr.wikipedia.org/wiki/Probl%C3%A8me_du_voyageur_de_commerce&quot; hreflang=&quot;fr&quot;&gt;optimiser la tournée des facteurs&lt;/a&gt;, ces données vont permettre aux contributeurs OSM de vérifier la couverture de Nantes Métropole en croisant les données de ce fichier et celles déjà sur OSM (&lt;a href=&quot;http://www.openstreetmap.org/&quot; hreflang=&quot;en&quot;&gt;Open Street Map&lt;/a&gt; pour ceux qui se demandent bien la signification de cet acronyme depuis le début du billet... et si vous voulez en savoir plus sur ce super projet, c'est par &lt;a href=&quot;http://www.scribd.com/doc/52277248/Internet-et-la-geomatique-l-autre-revolution&quot; hreflang=&quot;fr&quot;&gt;ici&lt;/a&gt;).&lt;/p&gt;


&lt;h2&gt;Une histoire de bbox&lt;/h2&gt;


&lt;p&gt;Le fichier &lt;em&gt;Adresses_nm.csv&lt;/em&gt; contient donc les coordonnées GPS de toutes les boîtes aux lettres de la métropole nantaise et plus précisément :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;l'adresse (ex : &lt;em&gt;3 Rue des Quinze Sillons&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;la commune associée (ex : &lt;em&gt;ST-SEBASTIEN&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;le mot directeur, c-à-d le mot le plus différenciateur de l'adresse (ex : &lt;em&gt;Quinze&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;le numéro seul (ex : &lt;em&gt;3&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;le &lt;a href=&quot;http://www.guichetdusavoir.org/viewtopic.php?f=163&amp;amp;t=10868&amp;amp;sid=8482badfe3b98228722d9338c88e4ec7&amp;amp;classement=&quot; hreflang=&quot;fr&quot;&gt;code rivoli&lt;/a&gt; de la voie (ex : &lt;em&gt;1176&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;le code postal (ex : &lt;em&gt;44230&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;et la longitude et latitude.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dans un premier temps, nous allons utiliser ces données pour définir une &lt;em&gt;bounding box&lt;/em&gt; (boîte contenante) pour chacune des communes de l'agglomération. L'idée est très simple : on parcourt toutes les entrées du fichier CSV en distribuant les coordonnées GPS par commune et en ne conservant que le min et le max des latitudes et longitudes.&lt;/p&gt;


&lt;p&gt;Quelques lignes de python :&lt;/p&gt;

&lt;pre class=&quot;python python&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #dc143c;&quot;&gt;csv&lt;/span&gt;
reader = &lt;span style=&quot;color: #dc143c;&quot;&gt;csv&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;DictReader&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;open&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'Adresses_nm.csv'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'rb'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;, delimiter=&lt;span style=&quot;color: #483d8b;&quot;&gt;';'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
bbox_communes = &lt;span style=&quot;color: black;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; row &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; reader:
	commune   = row&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;NOMCOM&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;
	latitude  = &lt;span style=&quot;color: #008000;&quot;&gt;float&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;row&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;LAT_WGS84&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;,&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
	longitude = &lt;span style=&quot;color: #008000;&quot;&gt;float&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;row&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;LON_WGS84&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;,&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
	&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;not&lt;/span&gt; bbox_communes.&lt;span style=&quot;color: black;&quot;&gt;has_key&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;commune&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;:
		bbox_communes&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;commune&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt; = &lt;span style=&quot;color: black;&quot;&gt;{&lt;/span&gt;
			&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;minlat&amp;quot;&lt;/span&gt;: latitude,
			&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;maxlat&amp;quot;&lt;/span&gt;: latitude,
			&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;maxlon&amp;quot;&lt;/span&gt;: latitude,
			&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;minlon&amp;quot;&lt;/span&gt;: latitude&lt;span style=&quot;color: black;&quot;&gt;}&lt;/span&gt;
	&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;else&lt;/span&gt;:
		&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;if&lt;/span&gt; latitude &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;gt;&lt;/span&gt; bbox_communes&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;commune&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;maxlat&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;:
			bbox_communes&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;commune&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;maxlat&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt; = latitude
		&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;if&lt;/span&gt; latitude &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;lt;&lt;/span&gt; bbox_communes&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;commune&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;minlat&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;:
			bbox_communes&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;commune&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;minlat&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt; = latitude
		&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;if&lt;/span&gt; latitude &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;gt;&lt;/span&gt; bbox_communes&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;commune&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;maxlon&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;:
			bbox_communes&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;commune&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;maxlon&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt; = longitude
		&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;if&lt;/span&gt; latitude &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;lt;&lt;/span&gt; bbox_communes&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;commune&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;minlon&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;:
			bbox_communes&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;commune&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;minlon&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt; = longitude&lt;/pre&gt;


&lt;p&gt;... et voici les bbox :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openstreetmap.org/?minlon=-1.585649046124&amp;amp;minlat=47.152330025829&amp;amp;maxlon=-1.521063232296&amp;amp;maxlat=47.196722167190&amp;amp;box=yes&quot;&gt;REZE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openstreetmap.org/?minlon=-1.651992789605&amp;amp;minlat=47.239693676891&amp;amp;maxlon=-1.576387158752&amp;amp;maxlat=47.279800229513&amp;amp;box=yes&quot;&gt;ORVAULT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openstreetmap.org/?minlon=-1.676880520138&amp;amp;minlat=47.151441154398&amp;amp;maxlon=-1.559910201792&amp;amp;maxlat=47.192263770449&amp;amp;box=yes&quot;&gt;BOUGUENAIS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openstreetmap.org/?minlon=-1.653299104524&amp;amp;minlat=47.118538914480&amp;amp;maxlon=-1.599066677115&amp;amp;maxlat=47.154062214676&amp;amp;box=yes&quot;&gt;SAINT-AIGNAN-GRANDLIEU&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openstreetmap.org/?minlon=-1.748775548153&amp;amp;minlat=47.176109239146&amp;amp;maxlon=-1.690568009886&amp;amp;maxlat=47.200723677452&amp;amp;box=yes&quot;&gt;SAINT-JEAN-DE-BOISEAU&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openstreetmap.org/?minlon=-1.686242840846&amp;amp;minlat=47.193270174205&amp;amp;maxlon=-1.645435812205&amp;amp;maxlat=47.203184453523&amp;amp;box=yes&quot;&gt;INDRE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openstreetmap.org/?minlon=-1.671545728682&amp;amp;minlat=47.193842435908&amp;amp;maxlon=-1.583974032268&amp;amp;maxlat=47.257424078084&amp;amp;box=yes&quot;&gt;ST-HERBLAIN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openstreetmap.org/?minlon=-1.757175289676&amp;amp;minlat=47.209003896778&amp;amp;maxlon=-1.655495154513&amp;amp;maxlat=47.249141405230&amp;amp;box=yes&quot;&gt;COUERON&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openstreetmap.org/?minlon=-1.700069114327&amp;amp;minlat=47.251792677595&amp;amp;maxlon=-1.652322344488&amp;amp;maxlat=47.281906717874&amp;amp;box=yes&quot;&gt;SAUTRON&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openstreetmap.org/?minlon=-1.496846780890&amp;amp;minlat=47.231489362873&amp;amp;maxlon=-1.454698492843&amp;amp;maxlat=47.275435494941&amp;amp;box=yes&quot;&gt;SAINTE-LUCE-SUR-LOIRE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openstreetmap.org/?minlon=-1.521348132493&amp;amp;minlat=47.121105093343&amp;amp;maxlon=-1.413317781972&amp;amp;maxlat=47.189242229043&amp;amp;box=yes&quot;&gt;VERTOU&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openstreetmap.org/?minlon=-1.695740074116&amp;amp;minlat=47.174322151693&amp;amp;maxlon=-1.666884850359&amp;amp;maxlat=47.194564684663&amp;amp;box=yes&quot;&gt;LA-MONTAGNE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openstreetmap.org/?minlon=-1.758652670186&amp;amp;minlat=47.156643735726&amp;amp;maxlon=-1.706537257701&amp;amp;maxlat=47.179103217200&amp;amp;box=yes&quot;&gt;BRAINS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openstreetmap.org/?minlon=-1.699236695519&amp;amp;minlat=47.129832891381&amp;amp;maxlon=-1.632493495181&amp;amp;maxlat=47.167055659057&amp;amp;box=yes&quot;&gt;BOUAYE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openstreetmap.org/?minlon=-1.544337734958&amp;amp;minlat=47.121803821827&amp;amp;maxlon=-1.493163927514&amp;amp;maxlat=47.161111559692&amp;amp;box=yes&quot;&gt;LES-SORINIERES&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openstreetmap.org/?minlon=-1.618947150251&amp;amp;minlat=47.182947044335&amp;amp;maxlon=-1.486834518040&amp;amp;maxlat=47.293748970354&amp;amp;box=yes&quot;&gt;NANTES&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openstreetmap.org/?minlon=-1.530932673050&amp;amp;minlat=47.186842835435&amp;amp;maxlon=-1.473918224821&amp;amp;maxlat=47.211764079344&amp;amp;box=yes&quot;&gt;ST-SEBASTIEN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openstreetmap.org/?minlon=-1.402914264654&amp;amp;minlat=47.292406689859&amp;amp;maxlon=-1.373174975846&amp;amp;maxlat=47.309494672635&amp;amp;box=yes&quot;&gt;MAUVES-SUR-LOIRE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openstreetmap.org/?minlon=-1.737366241697&amp;amp;minlat=47.129766611762&amp;amp;maxlon=-1.700617467027&amp;amp;maxlat=47.151533740364&amp;amp;box=yes&quot;&gt;SAINT-LEGER-LES-VIGNES&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openstreetmap.org/?minlon=-1.587088897473&amp;amp;minlat=47.255576859339&amp;amp;maxlon=-1.530608199564&amp;amp;maxlat=47.343045812508&amp;amp;box=yes&quot;&gt;LA-CHAPELLE-SUR-ERDRE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openstreetmap.org/?minlon=-1.461657426618&amp;amp;minlat=47.258432097695&amp;amp;maxlon=-1.416763966840&amp;amp;maxlat=47.291656739664&amp;amp;box=yes&quot;&gt;THOUARE-SUR-LOIRE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openstreetmap.org/?minlon=-1.481011288885&amp;amp;minlat=47.185947513933&amp;amp;maxlon=-1.444906838475&amp;amp;maxlat=47.238392171199&amp;amp;box=yes&quot;&gt;BASSE-GOULAINE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openstreetmap.org/?minlon=-1.526603878006&amp;amp;minlat=47.258197186383&amp;amp;maxlon=-1.429405594474&amp;amp;maxlat=47.330886996183&amp;amp;box=yes&quot;&gt;CARQUEFOU&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openstreetmap.org/?minlon=-1.818359889087&amp;amp;minlat=47.189667756692&amp;amp;maxlon=-1.748281676985&amp;amp;maxlat=47.206220313061&amp;amp;box=yes&quot;&gt;LE-PELLERIN&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Compter les communes&lt;/h2&gt;


&lt;p&gt;Dans un second temps nous allons vérifier que toutes les communes qui sont présentes dans le fichier sont bien déclarées dans OSM, et plus précisément déclarées dans les bbox calculées. Le plus simple pour ce faire est d'utiliser l'&lt;a href=&quot;http://www.fabienpoulard.info/post/2011/01/25/OpenStreetMap-%3A-requ%C3%AAtes-avanc%C3%A9es-avec-l-XAPI&quot;&gt;XAPI&lt;/a&gt;, soit pour Rezé par exemple, une requête de ce style : &lt;a href=&quot;http://open.mapquestapi.com/xapi/api/0.6/*%5Bplace=*%5D%5Bbbox=-1.585649046124,47.152330025829,-1.521063232296,47.196722167190%5D&quot;&gt;http://open.mapquestapi.com/xapi/api/0.6/*%5Bplace=*%5D%5Bbbox=-1.585649046124,47.152330025829,-1.521063232296,47.196722167190%5D&lt;/a&gt;. Ceci nous permet de nous rendre compte qu'OSM est très précise puisqu'en plus de Rezé la base de données contient de nombreux lieux-dits (ou quartiers) : &lt;a href=&quot;http://www.openstreetmap.org/?lat=47.19422&amp;amp;lon=-1.58215&amp;amp;zoom=17&quot;&gt;Trentemoult&lt;/a&gt;, &lt;a href=&quot;http://www.openstreetmap.org/?lat=47.1903277&amp;amp;lon=-1.5568526&amp;amp;zoom=17&amp;amp;layers=M&quot;&gt;Le Port Au Blé&lt;/a&gt;, &lt;a href=&quot;http://www.openstreetmap.org/?lat=47.1855101&amp;amp;lon=-1.5473082&amp;amp;zoom=17&amp;amp;layers=M&quot;&gt;Saint Paul&lt;/a&gt;, &lt;a href=&quot;http://www.openstreetmap.org/?lat=47.1758749&amp;amp;lon=-1.5521105&amp;amp;zoom=17&amp;amp;layers=M&quot;&gt;La Houssais&lt;/a&gt;...&lt;/p&gt;


&lt;p&gt;Encore une fois OSM est plus précis que les données officielles ;)&lt;/p&gt;


&lt;p&gt;Trêve de digression, nous allons nous concentrer sur les communes uniquement et bien sûr automatiser le processus :&lt;/p&gt;

&lt;pre class=&quot;python python&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #dc143c;&quot;&gt;urllib2&lt;/span&gt;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;from&lt;/span&gt; lxml &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; etree
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #dc143c;&quot;&gt;sys&lt;/span&gt;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; k &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; bbox_communes.&lt;span style=&quot;color: black;&quot;&gt;keys&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;:
	&lt;span style=&quot;color: #dc143c;&quot;&gt;sys&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;stdout&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;write&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;u&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;%s...&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;%&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;unicode&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;k, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;ISO8859&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
	maxlon = bbox_communes&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;k&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;maxlon&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;
	minlon = bbox_communes&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;k&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;minlon&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;
	maxlat = bbox_communes&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;k&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;maxlat&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;
	minlat = bbox_communes&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;k&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;minlat&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;
	xapiurl = &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;http://open.mapquestapi.com/xapi/api/0.6/node[place=*][bbox=%f,%f,%f,%f]&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;%&lt;/span&gt; &lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;minlon,minlat,maxlon,maxlat&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
	&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;try&lt;/span&gt;:
		&lt;span style=&quot;color: #dc143c;&quot;&gt;xml&lt;/span&gt; = &lt;span style=&quot;color: #dc143c;&quot;&gt;urllib2&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;urlopen&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;xapiurl&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;read&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
		dom = etree.&lt;span style=&quot;color: black;&quot;&gt;XML&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #dc143c;&quot;&gt;xml&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
		&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; node &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; dom.&lt;span style=&quot;color: #008000;&quot;&gt;iter&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;tag=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;node&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;:
			values = &lt;span style=&quot;color: #008000;&quot;&gt;unicode&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;/&amp;quot;&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;join&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;t.&lt;span style=&quot;color: black;&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;v&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; t &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; node.&lt;span style=&quot;color: #008000;&quot;&gt;iter&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;tag=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;tag&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
			&lt;span style=&quot;color: #dc143c;&quot;&gt;sys&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;stdout&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;write&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;u&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;%s=%s&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;%&lt;/span&gt; &lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;node.&lt;span style=&quot;color: black;&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;uid&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;, values&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
	&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;except&lt;/span&gt; &lt;span style=&quot;color: #dc143c;&quot;&gt;urllib2&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;HTTPError&lt;/span&gt;:
		&lt;span style=&quot;color: #dc143c;&quot;&gt;sys&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;stdout&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;write&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;error querying (%s)&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;%&lt;/span&gt; &lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;xapiurl&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
	&lt;span style=&quot;color: #dc143c;&quot;&gt;sys&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;stdout&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;write&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Résultat, il va falloir homogénéiser un peu les tags utilisés pour les communes :)&lt;/p&gt;

&lt;table&gt;
  &lt;tr&gt;&lt;th&gt;Commune&lt;/th&gt;&lt;th&gt;place ?&lt;/th&gt;&lt;th&gt;uid&lt;/th&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;REZE&lt;/td&gt;&lt;td&gt;town&lt;/td&gt;&lt;td&gt;58255&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;ORVAULT&lt;/td&gt;&lt;td&gt; # &lt;/td&gt;&lt;td&gt; # &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;BOUGUENAIS&lt;/td&gt;&lt;td&gt; # &lt;/td&gt;&lt;td&gt; # &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;SAINT-AIGNAN-GRANDLIEU&lt;/td&gt;&lt;td&gt; # &lt;/td&gt; &lt;td&gt; # &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;SAINT-JEAN-DE-BOISEAU&lt;/td&gt;&lt;td&gt;village&lt;/td&gt;&lt;td&gt;58255&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;INDRE&lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;ST-HERBLAIN&lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;COUERON&lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;SAUTRON&lt;/td&gt;&lt;td&gt;village&lt;/td&gt;&lt;td&gt;58255&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;SAINTE-LUCE-SUR-LOIRE&lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;VERTOU&lt;/td&gt;&lt;td&gt; # &lt;/td&gt;&lt;td&gt; # &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;LA-MONTAGNE&lt;/td&gt;&lt;td&gt; # &lt;/td&gt;&lt;td&gt; # &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;BRAINS&lt;/td&gt;&lt;td&gt;village&lt;/td&gt;&lt;td&gt;58255&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;BOUAYE&lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;LES-SORINIERES&lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;NANTES&lt;/td&gt;&lt;td&gt;city&lt;/td&gt;&lt;td&gt;212207&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;ST-SEBASTIEN&lt;/td&gt;&lt;td&gt; # &lt;/td&gt;&lt;td&gt; # &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;MAUVES-SUR-LOIRE&lt;/td&gt;&lt;td&gt;village&lt;/td&gt;&lt;td&gt;58255&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;SAINT-LEGER-LES-VIGNES&lt;/td&gt;&lt;td&gt;village&lt;/td&gt;&lt;td&gt;58255&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;LA-CHAPELLE-SUR-ERDRE&lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;THOUARE-SUR-LOIRE&lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;BASSE-GOULAINE&lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;CARQUEFOU&lt;/td&gt;&lt;td&gt;town&lt;/td&gt;&lt;td&gt;58255&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;LE-PELLERIN&lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;



&lt;p&gt;Prochaine étape, vérifier les noms des rues... et ensuite insertion des adresses dans la base ;)&lt;/p&gt;</description>
    
    
    
          <comments>http://www.fabienpoulard.info/post/2011/11/22/Ouverture-des-donn%C3%A9es-publiques-%C3%A0-Nantes#comment-form</comments>
      <wfw:comment>http://www.fabienpoulard.info/post/2011/11/22/Ouverture-des-donn%C3%A9es-publiques-%C3%A0-Nantes#comment-form</wfw:comment>
      <wfw:commentRss>http://www.fabienpoulard.info/feed/atom/comments/723</wfw:commentRss>
      </item>
    
  <item>
    <title>Travaux Pratique TALN - Contexte syntaxique</title>
    <link>http://www.fabienpoulard.info/post/2011/11/21/Travaux-Pratique-TALN-Contexte-syntaxique</link>
    <guid isPermaLink="false">urn:md5:873c6e23876b60ed0ccbe0581901327f</guid>
    <pubDate>Mon, 21 Nov 2011 23:42:00 +0100</pubDate>
    <dc:creator>Fabien Poulard</dc:creator>
        <category>Sciences &amp; Recherche</category>
        <category>corpus</category><category>enseignement</category><category>nltk</category><category>POS tagging</category><category>python</category><category>syntax</category>    
    <description>&lt;p&gt;Les séances précédentes ont été consacrées à l'analyse lexicale et morphologique. Il est temps de se détacher de la dimension lexicale des textes pour tendre vers la dimension syntaxique.&lt;/p&gt;    &lt;h2&gt;Les rôles grammaticaux&lt;/h2&gt;


&lt;p&gt;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 (&lt;em&gt;le&lt;/em&gt;, &lt;em&gt;la&lt;/em&gt;, &lt;em&gt;les&lt;/em&gt;, ...) ne jouent pas un rôle aussi crucial que les noms communs (&amp;quot;champion&amp;quot;, &amp;quot;médaille&amp;quot;, &amp;quot;concours&amp;quot;, ...). Ils font parti de l'outillage grammatical qui permet de faire &lt;em&gt;collaborer&lt;/em&gt; les mots afin de produire du sens.&lt;/p&gt;


&lt;p&gt;Dans le cadre de cette séance de TP, je propose de travailler sur les catégories grammaticales suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;l'article, le déterminant : &lt;em&gt;le&lt;/em&gt;, &lt;em&gt;la&lt;/em&gt;, &lt;em&gt;les&lt;/em&gt;, &lt;em&gt;l&lt;/em&gt;', &lt;em&gt;un&lt;/em&gt;, &lt;em&gt;une&lt;/em&gt;, &lt;em&gt;des&lt;/em&gt;, ...&lt;/li&gt;
&lt;li&gt;le nom : &lt;em&gt;médaille&lt;/em&gt;, &lt;em&gt;champion&lt;/em&gt;, &lt;em&gt;podium&lt;/em&gt;, &lt;em&gt;éléphant&lt;/em&gt;, ...&lt;/li&gt;
&lt;li&gt;l'adjectif : &lt;em&gt;grande&lt;/em&gt;, &lt;em&gt;téméraire&lt;/em&gt;, &lt;em&gt;puissant&lt;/em&gt;, &lt;em&gt;ordonnée&lt;/em&gt;, ...&lt;/li&gt;
&lt;li&gt;le pronom : &lt;em&gt;je&lt;/em&gt;, &lt;em&gt;me&lt;/em&gt;, &lt;em&gt;moi&lt;/em&gt;, &lt;em&gt;se&lt;/em&gt;, ...&lt;/li&gt;
&lt;li&gt;le verbe : &lt;em&gt;manger&lt;/em&gt;, &lt;em&gt;courir&lt;/em&gt;, &lt;em&gt;être&lt;/em&gt;, &lt;em&gt;penser&lt;/em&gt;, ...&lt;/li&gt;
&lt;li&gt;l'adverbe : &lt;em&gt;lentement&lt;/em&gt;, &lt;em&gt;doucement&lt;/em&gt;, &lt;em&gt;rapidement&lt;/em&gt;, ...&lt;/li&gt;
&lt;li&gt;la préposition : &lt;em&gt;à&lt;/em&gt;, &lt;em&gt;en&lt;/em&gt;, &lt;em&gt;sur&lt;/em&gt;, &lt;em&gt;sous&lt;/em&gt;, &lt;em&gt;sans&lt;/em&gt;, &lt;em&gt;avec&lt;/em&gt;, ...&lt;/li&gt;
&lt;li&gt;la conjonction : &lt;em&gt;mais&lt;/em&gt;, &lt;em&gt;ou&lt;/em&gt;, &lt;em&gt;et&lt;/em&gt;, &lt;em&gt;donc&lt;/em&gt;, ...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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 &lt;a href=&quot;http://www.scribd.com/doc/2260156/analyse-grammaticale&quot; hreflang=&quot;fr&quot;&gt;lire ceci&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;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.&lt;/p&gt;


&lt;h2&gt;Lister les mots des catégories déterminant, pronom, conjonction et préposition&lt;/h2&gt;


&lt;p&gt;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.&lt;/p&gt;


&lt;p&gt;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 :&lt;/p&gt;

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


&lt;p&gt;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.&lt;/p&gt;


&lt;p&gt;Cette approche n'est toutefois pas satisfaisant pour les &amp;quot;puristes&amp;quot;, 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.&lt;/p&gt;


&lt;p&gt;Voici néanmoins une proposition de liste construite de cette manière :&lt;/p&gt;

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


&lt;h2&gt;Le contexte syntaxique en renfort&lt;/h2&gt;


&lt;p&gt;Les différents mots extraits précédemment vont nous être utiles pour capturer les mots des autres catégories.&lt;/p&gt;


&lt;p&gt;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 &lt;a href=&quot;http://fr.wikipedia.org/wiki/Concordancier&quot; hreflang=&quot;fr&quot;&gt;concordancier&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Nltk fournit un concordancier qui est certes un peu limité mais bien suffisant pour notre étude :&lt;/p&gt;

&lt;pre class=&quot;python python&quot; style=&quot;font-family:inherit&quot;&gt;t = nltk.&lt;span style=&quot;color: black;&quot;&gt;Text&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;words, name=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;discours_sarkozy&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
t.&lt;span style=&quot;color: black;&quot;&gt;concordance&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;je&amp;quot;&lt;/span&gt;, width=&lt;span style=&quot;color: #ff4500;&quot;&gt;50&lt;/span&gt;, lines=&lt;span style=&quot;color: #ff4500;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;ce qui nous donne le résultat :&lt;/p&gt;

&lt;pre&gt;
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 
&lt;/pre&gt;


&lt;p&gt;L'utilisation du concordancier nous permet de lister un certain nombre de règles qui semblent généralisables :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le &amp;quot;or&amp;quot; en début de phrase est une conjonction alors que le &amp;quot;or&amp;quot; précédé d'un déterminant est un nom ;&lt;/li&gt;
&lt;li&gt;les déterminants semblent précéder des noms ;&lt;/li&gt;
&lt;li&gt;les pronoms sont en général suivis d'un verbe ou d'un autre pronom&lt;/li&gt;
&lt;li&gt;les adjectifs sont en général précédés d'un verbe ou d'un nom&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;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.&lt;/p&gt;


&lt;h2&gt;Algorithme de Brill&lt;/h2&gt;


&lt;h3&gt;Intuition&lt;/h3&gt;


&lt;p&gt;Prenons une phrase du corpus :&lt;/p&gt;

&lt;pre class=&quot;python python&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;u&lt;span style=&quot;color: #483d8b;&quot;&gt;'Je'&lt;/span&gt;, u&lt;span style=&quot;color: #483d8b;&quot;&gt;'sais'&lt;/span&gt;, u&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;qu'&amp;quot;&lt;/span&gt;, u&lt;span style=&quot;color: #483d8b;&quot;&gt;'il'&lt;/span&gt;, u&lt;span style=&quot;color: #483d8b;&quot;&gt;'y'&lt;/span&gt;, u&lt;span style=&quot;color: #483d8b;&quot;&gt;'a'&lt;/span&gt;, u&lt;span style=&quot;color: #483d8b;&quot;&gt;'plus'&lt;/span&gt;,
 u&lt;span style=&quot;color: #483d8b;&quot;&gt;'de'&lt;/span&gt;, u&lt;span style=&quot;color: #483d8b;&quot;&gt;'3 000'&lt;/span&gt;, u&lt;span style=&quot;color: #483d8b;&quot;&gt;'Fran&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\x&lt;/span&gt;e7ais'&lt;/span&gt;, u&lt;span style=&quot;color: #483d8b;&quot;&gt;'en'&lt;/span&gt;, u&lt;span style=&quot;color: #483d8b;&quot;&gt;'Syrie'&lt;/span&gt;, u&lt;span style=&quot;color: #483d8b;&quot;&gt;','&lt;/span&gt;, 
 u&lt;span style=&quot;color: #483d8b;&quot;&gt;'&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\x&lt;/span&gt;e0'&lt;/span&gt;, u&lt;span style=&quot;color: #483d8b;&quot;&gt;'Damas'&lt;/span&gt;, u&lt;span style=&quot;color: #483d8b;&quot;&gt;','&lt;/span&gt;, u&lt;span style=&quot;color: #483d8b;&quot;&gt;'&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\x&lt;/span&gt;e0'&lt;/span&gt;, u&lt;span style=&quot;color: #483d8b;&quot;&gt;'Alep'&lt;/span&gt;, u&lt;span style=&quot;color: #483d8b;&quot;&gt;','&lt;/span&gt;, u&lt;span style=&quot;color: #483d8b;&quot;&gt;'o&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\x&lt;/span&gt;f9'&lt;/span&gt;, 
 u&lt;span style=&quot;color: #483d8b;&quot;&gt;'nous'&lt;/span&gt;, u&lt;span style=&quot;color: #483d8b;&quot;&gt;'avons'&lt;/span&gt;, u&lt;span style=&quot;color: #483d8b;&quot;&gt;'notre'&lt;/span&gt;, u&lt;span style=&quot;color: #483d8b;&quot;&gt;'plus'&lt;/span&gt;, u&lt;span style=&quot;color: #483d8b;&quot;&gt;'ancien'&lt;/span&gt;, u&lt;span style=&quot;color: #483d8b;&quot;&gt;'consulat'&lt;/span&gt;, 
 u&lt;span style=&quot;color: #483d8b;&quot;&gt;'dans'&lt;/span&gt;, u&lt;span style=&quot;color: #483d8b;&quot;&gt;'le'&lt;/span&gt;, u&lt;span style=&quot;color: #483d8b;&quot;&gt;'monde'&lt;/span&gt;, u&lt;span style=&quot;color: #483d8b;&quot;&gt;'.'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;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 &lt;em&gt;Je&lt;/em&gt;, &lt;em&gt;qu&lt;/em&gt;', &lt;em&gt;il&lt;/em&gt;, &lt;em&gt;y&lt;/em&gt;, &lt;em&gt;de&lt;/em&gt;, &lt;em&gt;en&lt;/em&gt;, &lt;em&gt;à&lt;/em&gt;, &lt;em&gt;à&lt;/em&gt;, &lt;em&gt;où&lt;/em&gt;, &lt;em&gt;nous&lt;/em&gt;, &lt;em&gt;notre&lt;/em&gt;, &lt;em&gt;dans&lt;/em&gt; et &lt;em&gt;le&lt;/em&gt;. L'idée est donc d'affecter à ces mots leur étiquette la plus probable et aux autres l'étiquette &lt;em&gt;?&lt;/em&gt;, soit :&lt;/p&gt;

&lt;pre&gt;
[('Je', 'PRO'), ('sais', '?'), (&amp;quot;qu'&amp;quot;, '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')]
&lt;/pre&gt;


&lt;p&gt;L'application de règles simples naïves telles que :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un pronom est suivi d'un pronom ou d'un verbe ;&lt;/li&gt;
&lt;li&gt;Un déterminant est suivi d'un adjectif ou d'un nom ;&lt;/li&gt;
&lt;li&gt;Une préposition est suivie d'un nom propre, d'un pronom ou d'un déterminant ;&lt;/li&gt;
&lt;li&gt;Un adjectif est suivi d'un adjectif, d'un nom ou d'une ponctuation ;&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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.&lt;/p&gt;


&lt;p&gt;C'est &lt;em&gt;grosso modo&lt;/em&gt; le concept de l'&lt;a href=&quot;http://en.wikipedia.org/wiki/Brill_tagger&quot; hreflang=&quot;en&quot;&gt;algorithme de Brill&lt;/a&gt;...&lt;/p&gt;


&lt;h3&gt;Fonctionnement&lt;/h3&gt;


&lt;p&gt;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 &lt;em&gt;NOM&lt;/em&gt; ou &lt;em&gt;NOM PROPRE&lt;/em&gt; 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.&lt;/p&gt;


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


&lt;p&gt;Pour en savoir plus, vous pouvez lire cet &lt;a href=&quot;http://dl.acm.org/citation.cfm?id=1075553&quot; hreflang=&quot;en&quot;&gt;article écrit par Brill lui-même&lt;/a&gt;.&lt;/p&gt;


&lt;h2&gt;Brill dans nltk&lt;/h2&gt;


&lt;p&gt;Nltk intègre &lt;a href=&quot;http://nltk.googlecode.com/svn/trunk/doc/api/nltk.tag.brill.BrillTagger-class.html&quot; hreflang=&quot;en&quot;&gt;une implémentation de l'algorithme de Brill&lt;/a&gt;, ainsi que l'&lt;a href=&quot;http://nltk.googlecode.com/svn/trunk/doc/api/nltk.tag.brill.BrillTaggerTrainer-class.html&quot; hreflang=&quot;en&quot;&gt;outillage nécessaire à l'entraînement d'un nouvel étiqueteur&lt;/a&gt;.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.fabienpoulard.info/post/2011/11/21/Travaux-Pratique-TALN-Contexte-syntaxique#comment-form</comments>
      <wfw:comment>http://www.fabienpoulard.info/post/2011/11/21/Travaux-Pratique-TALN-Contexte-syntaxique#comment-form</wfw:comment>
      <wfw:commentRss>http://www.fabienpoulard.info/feed/atom/comments/722</wfw:commentRss>
      </item>
    
  <item>
    <title>Travaux Pratique TALN - Morphologie et contexte syntaxique</title>
    <link>http://www.fabienpoulard.info/post/2011/10/25/Travaux-Pratique-TALN-Le-lexique</link>
    <guid isPermaLink="false">urn:md5:95d64192fb0f4d7be685690d8664a7c2</guid>
    <pubDate>Mon, 14 Nov 2011 18:55:00 +0100</pubDate>
    <dc:creator>Fabien Poulard</dc:creator>
        <category>Sciences &amp; Recherche</category>
        <category>analyse lexicale</category><category>analyse morphologique</category><category>corpus</category><category>enseignement</category><category>nltk</category><category>POS tagging</category><category>python</category><category>regexp</category>    
    <description>&lt;p&gt;Dans &lt;a href=&quot;http://www.fabienpoulard.info/post/2011/10/24/Travaux-Pratique-TALN-Le-lexique&quot;&gt;le TP précédent&lt;/a&gt; nous nous sommes limité à l'analyse des mots en-dehors de tout contexte. Il s'est alors agi de découper un texte en mots puis de compter ces derniers.&lt;/p&gt;


&lt;p&gt;Dans ce second TP, nous allons nous intéresser à la morphologie des mots (leur forme textuelle). Nous explorerons notamment deux procédés de normalisation morphologique : la racinisation et la lemmatisation. Nous découvrirons ensuite que le contexte des mots, combiné à leur morphologie, peut nous apprendre bien des choses.&lt;/p&gt;    &lt;p&gt;Je considère comme acquis le découpage en phrases et en mots (si ce n'est pas le cas, vous pouvez vous rafraîchir la mémoire &lt;a href=&quot;http://www.fabienpoulard.info/post/2011/10/24/Travaux-Pratique-TALN-Le-lexique&quot;&gt;ici&lt;/a&gt;). Nous allons dans cette partie directement travailler sur &lt;a href=&quot;http://www.fabienpoulard.info/download/Recherche/Corpus/Discours-Sarkozy-v20111025.preproc.txt.gz&quot; hreflang=&quot;fr&quot; title=&quot;Corpus des discours de N. Sarkozy après découpage en unités linguistiques&quot;&gt;une version du corpus des discours de N. Sarkozy déjà découpée en phrases et en mots&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;La fonction ci-dessous permet de charger la liste des phrases du corpus et pour chaque phrase la liste des mots qui la compose :&lt;/p&gt;
&lt;pre class=&quot;python python&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;def&lt;/span&gt; load_preprocessed_corpus&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;finput=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;Discours-Sarkozy-v20111025.preproc.txt&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;:
	&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;&amp;quot;&amp;quot;
	Load the content of a preprocessed file as a list of sentences which happen
	to be a list of words.
	&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
	fh = &lt;span style=&quot;color: #dc143c;&quot;&gt;codecs&lt;/span&gt;.&lt;span style=&quot;color: #008000;&quot;&gt;open&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;finput, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;r&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;utf-8&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
	corpus = fh.&lt;span style=&quot;color: black;&quot;&gt;read&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
	fh.&lt;span style=&quot;color: black;&quot;&gt;close&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
	sents = &lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;
	&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; sent &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; corpus.&lt;span style=&quot;color: black;&quot;&gt;split&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;:
		sents.&lt;span style=&quot;color: black;&quot;&gt;append&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt; sent.&lt;span style=&quot;color: black;&quot;&gt;split&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
	&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;return&lt;/span&gt; sents&lt;/pre&gt;


&lt;p&gt;Exemple d'utilisation :&lt;/p&gt;

&lt;pre class=&quot;python python&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; sentences = load_preprocessed_corpus&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;Discours-Sarkozy-v20111025.preproc.txt&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;Nombre de phrases  : %d&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;%&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;sentences&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color: #483d8b;&quot;&gt;'Nombre de phrases  : 84325'&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;Nombre de mots : %d&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;%&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;w &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; s &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; sentences &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; w &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; s&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color: #483d8b;&quot;&gt;'Nombre de mots : 2017309'&lt;/span&gt;&lt;/pre&gt;


&lt;h2&gt;Morphologie : des expressions rationnelles à l'algorithme de Porter&lt;/h2&gt;


&lt;p&gt;Nous allons avoir besoin d'un outil puissant pour exprimer par intention les formes textuelles que nous allons manipuler : les &lt;a href=&quot;http://fr.wikipedia.org/wiki/Expression_rationnelle&quot; hreflang=&quot;fr&quot;&gt;expressions rationnelles&lt;/a&gt;. Celles-ci permettent de décrire un langage régulier pour lequel il sera possible de générer un automate acceptant. La plupart des langages informatiques récents offrent des bibliothèques permettant de manipuler  ces expressions et les automates en découlant. &lt;a href=&quot;http://docs.python.org/howto/regex.html#regex-howto&quot; hreflang=&quot;en&quot;&gt;Python ne fait pas exception à la règle&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Les expressions rationnelles sont gérés sous Python par le module &lt;em&gt;re&lt;/em&gt;. Il serait trop long de présenter l'utilisation des expressions rationnelles avec Python ici, et &lt;a href=&quot;http://diveintopython.adrahon.org/regular_expressions/index.html&quot; hreflang=&quot;fr&quot;&gt;d'autres le font beaucoup mieux que moi&lt;/a&gt;.&lt;/p&gt;


&lt;h3&gt;France, Français, Française, Françaises...&lt;/h3&gt;


&lt;p&gt;Le &lt;a href=&quot;http://www.fabienpoulard.info/public/2011/TP-TALN/nuage-mots-sarkozy.png&quot;&gt;nuage de mots&lt;/a&gt; généré &lt;a href=&quot;http://www.fabienpoulard.info/post/2011/10/24/Travaux-Pratique-TALN-Le-lexique&quot;&gt;précédemment&lt;/a&gt; contient des mots très similaires, c'est le cas notamment de &lt;em&gt;français&lt;/em&gt; et &lt;em&gt;française&lt;/em&gt;. Les expressions rationnelles peuvent nous permettre de les considérer ensemble :&lt;/p&gt;

&lt;pre class=&quot;python python&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #dc143c;&quot;&gt;re&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #dc143c;&quot;&gt;re&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;findall&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;u&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\\&lt;/span&gt;bfrançais&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\\&lt;/span&gt;b&amp;quot;&lt;/span&gt;, text&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color: #ff4500;&quot;&gt;1031&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #dc143c;&quot;&gt;re&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;findall&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;u&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\\&lt;/span&gt;bfrançaise&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\\&lt;/span&gt;b&amp;quot;&lt;/span&gt;, text&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color: #ff4500;&quot;&gt;1286&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #dc143c;&quot;&gt;re&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;findall&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;u&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\\&lt;/span&gt;bfran[cç]ais&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\\&lt;/span&gt;w&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\\&lt;/span&gt;b&amp;quot;&lt;/span&gt;, text&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color: #ff4500;&quot;&gt;2661&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; tous_francais = &lt;span style=&quot;color: #008000;&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; m &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color: #dc143c;&quot;&gt;re&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;finditer&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;u&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\\&lt;/span&gt;bfran[cç]ais&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\\&lt;/span&gt;w*&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\\&lt;/span&gt;b&amp;quot;&lt;/span&gt;, text&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;:
...     &lt;span style=&quot;color: black;&quot;&gt;tous_francais&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt; m.&lt;span style=&quot;color: black;&quot;&gt;group&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ff4500;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; tous_francais
&lt;span style=&quot;color: #008000;&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;u&lt;span style=&quot;color: #483d8b;&quot;&gt;'fran&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\x&lt;/span&gt;e7aise'&lt;/span&gt;, u&lt;span style=&quot;color: #483d8b;&quot;&gt;'fran&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\x&lt;/span&gt;e7ais'&lt;/span&gt;, u&lt;span style=&quot;color: #483d8b;&quot;&gt;'fran&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\x&lt;/span&gt;e7aises'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;&lt;/pre&gt;


&lt;h3&gt;Généralisation : vers l'algorithme de Porter&lt;/h3&gt;


&lt;p&gt;L'exemple précédent nous montre que nous pourrions profiter d'une normalisation morphologique des mots collectés  afin de rendre mieux compte de la distribution lexicale. Après tout &lt;em&gt;français&lt;/em&gt;, &lt;em&gt;française&lt;/em&gt; et &lt;em&gt;françaises&lt;/em&gt; correspondent tous trois au même mot &lt;em&gt;français&lt;/em&gt; tel qu'on le trouve dans &lt;a href=&quot;http://atilf.atilf.fr/dendien/scripts/tlfiv5/visusel.exe?16;s=2523494280;r=1;nat=;sol=9;&quot; hreflang=&quot;fr&quot;&gt;le dictionnaire&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;En effet, &lt;em&gt;française&lt;/em&gt; et &lt;em&gt;françaises&lt;/em&gt; sont des flexions de l'adjectif &lt;em&gt;français&lt;/em&gt;. En linguistique, on oppose flexions et dérivations :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La flexion consiste à ajouter un affixe au mot afin de refléter un changement au niveau grammatical, du genre, du nombre, de la personne, etc., sans que cette modification morphologique n'altère le sens du lexème d'origine ;&lt;/li&gt;
&lt;li&gt;La dérivation consiste à créer un nouveau lexème, c-à-d un nouveau mot avec un nouveau sens, par l'ajout d'un affixe.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Les règles flexionnelles en français semblent assez régulières : ajout d'un &amp;quot;e&amp;quot; pour marquer le féminin, d'un &amp;quot;s&amp;quot; pour le pluriel... Ne pourrait-on pas définir un algorithme capable de déconstruire ces flexions afin de retrouver le lexème d'origine, au masculin singulier ?&lt;/p&gt;


&lt;p&gt;Petit exercice :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tentez de produire une liste exhaustive des suffixes utilisés pour marquer le genre et le nombre en français&lt;/li&gt;
&lt;li&gt;Recherchez toutes les formes textuelles qui utilisent ces suffixes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Proposition de corrigé :&lt;/p&gt;
&lt;pre class=&quot;python python&quot; style=&quot;font-family:inherit&quot;&gt;all_words = &lt;span style=&quot;color: #008000;&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;w.&lt;span style=&quot;color: black;&quot;&gt;lower&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; w &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; words&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
 
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;def&lt;/span&gt; evaluation_suffix&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;suffix&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;:
	&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;global&lt;/span&gt; raw_text
	regexp = &lt;span style=&quot;color: #dc143c;&quot;&gt;re&lt;/span&gt;.&lt;span style=&quot;color: #008000;&quot;&gt;compile&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;r&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\b&lt;/span&gt;(&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\w&lt;/span&gt;+)%s&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\b&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;%&lt;/span&gt;suffix, &lt;span style=&quot;color: #dc143c;&quot;&gt;re&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;I&lt;/span&gt;|re.&lt;span style=&quot;color: black;&quot;&gt;U&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
	&lt;span style=&quot;color: #008000;&quot;&gt;map&lt;/span&gt; = &lt;span style=&quot;color: black;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;}&lt;/span&gt;
	&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# Collecter les mots avec le suffixe&lt;/span&gt;
	&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; m &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; regexp.&lt;span style=&quot;color: black;&quot;&gt;finditer&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;raw_text&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;:
		avec_suffixe = m.&lt;span style=&quot;color: black;&quot;&gt;group&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ff4500;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
		sans_suffixe = m.&lt;span style=&quot;color: black;&quot;&gt;group&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ff4500;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
		&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;not&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;map&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;has_key&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;avec_suffixe&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;:
			&lt;span style=&quot;color: #008000;&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;avec_suffixe&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt; = &lt;span style=&quot;color: black;&quot;&gt;{&lt;/span&gt;
				&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;sans_suffixe&amp;quot;&lt;/span&gt;: sans_suffixe,
				&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;sans_suffixe_existe&amp;quot;&lt;/span&gt;: &lt;span style=&quot;color: #008000;&quot;&gt;False&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;}&lt;/span&gt;
	&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# Chercher les occurrences sans suffixe&lt;/span&gt;
	&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; k &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;map&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;keys&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;:
		sans_suffixe = &lt;span style=&quot;color: #008000;&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;k&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;sans_suffixe&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;lower&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
		&lt;span style=&quot;color: #008000;&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;k&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;sans_suffixe_existe&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt; = &lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;sans_suffixe &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; all_words&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
	&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# Rapport&lt;/span&gt;
	nb_est_suffixe = &lt;span style=&quot;color: #008000;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;k &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; k &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;map&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;keys&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;k&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;sans_suffixe_existe&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
	nb_est_pas_suffixe = &lt;span style=&quot;color: #008000;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt; - nb_est_suffixe
	&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;if&lt;/span&gt; nb_est_suffixe &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;gt;&lt;/span&gt; nb_est_pas_suffixe:
		&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;print&lt;/span&gt; &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;%s est un suffixe (%d/%d)&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;%&lt;/span&gt; &lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;suffix, nb_est_suffixe, nb_est_pas_suffixe&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
	&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;else&lt;/span&gt;:
		&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;print&lt;/span&gt; &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;%s n'est PAS un suffixe (%d/%d)&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;%&lt;/span&gt; &lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;suffix, nb_est_suffixe, nb_est_pas_suffixe&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
 
suffixes = &lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;ous&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;aux&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;s&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;e&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;ais&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;ives&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;ent&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;es&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;ai&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;ons&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;ez&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;t&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;ait&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;ions&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;iez&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;aient&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;ant&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;le&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;les&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;ne&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;nes&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;x&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;
 
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; suffix &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; suffixes:
	evaluation_suffix&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;suffix&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;&lt;/pre&gt;


&lt;h3&gt;Algorithme de Porter&lt;/h3&gt;


&lt;p&gt;L'algorithme de Porter offre un cadre algorithmique pour la désuffixation des mots. Le fonctionnement de l'algorithme est décrit en de nombreux endroits sur le Web, notamment &lt;a href=&quot;http://www.fabienpoulard.info/post/2011/10/25/www-igm.univ-mlv.fr/~lecroq/cours/porter.pdf&quot; hreflang=&quot;fr&quot; title=&quot;Présentation de l'algorithme de Porter par Thierry Lecroq de l'Université de Rouen&quot;&gt;ici&lt;/a&gt; ou &lt;a href=&quot;http://www.fabienpoulard.info/post/2008/02/21/Lalgorithme-de-Porter&quot; hreflang=&quot;fr&quot; title=&quot;Présentation de l'algorithme de Porter par Fabien Poulard&quot;&gt;sur mon propre blog&lt;/a&gt;. S'il a été mis au point pour l'anglais, il est tout à fait envisageable de l'utiliser pour le français (&lt;a href=&quot;http://snowball.tartarus.org/&quot; hreflang=&quot;en&quot; title=&quot;Implémentation multilingue de l'algorithme de Porter&quot;&gt;d'ailleurs certains l'ont fait&lt;/a&gt;).&lt;/p&gt;


&lt;p&gt;L'idée de l'algorithme de Porter est de déconstruire les flexions pour retrouver la forme canonique des mots : le lemme. Par exemple : retirer le suffixe &amp;quot;aux&amp;quot; de &lt;em&gt;chevaux&lt;/em&gt; et le remplacer par &amp;quot;al&amp;quot; pour obtenir le singulier. Les règles de Porter sont déclenchées lorsque deux conditions sont réunies :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;le mot se termine par un suffixe particulier&lt;/li&gt;
&lt;li&gt;le radical (mot privé dudit suffixe) respecte un motif particulier, le plus généralement un certain nombre de pseudo-syllabes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Le code python ci-dessous est une proposition d'implémentation de la règle de Porter pour normaliser &lt;em&gt;journaux&lt;/em&gt; et &lt;em&gt;chevaux&lt;/em&gt; en respectivement &lt;em&gt;journal&lt;/em&gt; et &lt;em&gt;cheval&lt;/em&gt; :&lt;/p&gt;

&lt;pre class=&quot;python python&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;def&lt;/span&gt; compute_m&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;w&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;:
     pseudosyllabs = &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;
     &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; c &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; w:
             &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;if&lt;/span&gt; c &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'a'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'e'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'i'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'o'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'u'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'y'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;:
                     &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;pseudosyllabs&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;==&lt;span style=&quot;color: #ff4500;&quot;&gt;0&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;or&lt;/span&gt; pseudosyllabs&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;-&lt;span style=&quot;color: #ff4500;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;==&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;C&amp;quot;&lt;/span&gt;:
                             pseudosyllabs += &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;V&amp;quot;&lt;/span&gt;
             &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;else&lt;/span&gt;:
                     &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;pseudosyllabs&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;==&lt;span style=&quot;color: #ff4500;&quot;&gt;0&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;or&lt;/span&gt; pseudosyllabs&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;-&lt;span style=&quot;color: #ff4500;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;==&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;V&amp;quot;&lt;/span&gt;:
                             pseudosyllabs += &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;C&amp;quot;&lt;/span&gt;
     &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;return&lt;/span&gt; pseudosyllabs.&lt;span style=&quot;color: black;&quot;&gt;count&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;VC&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
 
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# Règle de Porter : (m=1 &amp;amp;&amp;amp; *c) aux -&amp;gt; al&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# Le mot se termine par aux, a un radical composé d'une pseudo-syllabe et qui se termine par une consomne&lt;/span&gt;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;def&lt;/span&gt; regle_porter_aux&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;w&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;:
     &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;if&lt;/span&gt; w.&lt;span style=&quot;color: black;&quot;&gt;endswith&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;aux&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;:
          radical = w&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;:-&lt;span style=&quot;color: #ff4500;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;
          &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;not&lt;/span&gt; radical&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;-&lt;span style=&quot;color: #ff4500;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'a'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'e'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'i'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'o'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'u'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'y'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;:
               &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;return&lt;/span&gt; radical + &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;al&amp;quot;&lt;/span&gt;
     &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;return&lt;/span&gt; w
 
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; regle_porter_aux&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;journaux&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color: #483d8b;&quot;&gt;'journal'&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; regle_porter_aux&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;chevaux&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color: #483d8b;&quot;&gt;'cheval'&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; regle_porter_aux&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;agneaux&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color: #483d8b;&quot;&gt;'agneaux'&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Petit exercice :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Écrire d'autres règles pour le français dans le formalisme proposé par Porter&lt;/li&gt;
&lt;li&gt;À partir du &lt;a href=&quot;http://atoll.inria.fr/~sagot/lefff.html&quot; hreflang=&quot;fr&quot;&gt;travail de compilation des formes flexionnelles du français par B. Sagot&lt;/a&gt;, pouvez-vous inférer automatiquement toutes les règles de Porter pour le français ?&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
          <comments>http://www.fabienpoulard.info/post/2011/10/25/Travaux-Pratique-TALN-Le-lexique#comment-form</comments>
      <wfw:comment>http://www.fabienpoulard.info/post/2011/10/25/Travaux-Pratique-TALN-Le-lexique#comment-form</wfw:comment>
      <wfw:commentRss>http://www.fabienpoulard.info/feed/atom/comments/719</wfw:commentRss>
      </item>
    
  <item>
    <title>Rencontre des contributeurs Nantais à OSM</title>
    <link>http://www.fabienpoulard.info/post/2011/11/03/Rencontre-des-contributeurs-Nantais-%C3%A0-OSM</link>
    <guid isPermaLink="false">urn:md5:68729f722ef6bc5ae8891dc839c61601</guid>
    <pubDate>Thu, 03 Nov 2011 11:40:00 +0100</pubDate>
    <dc:creator>Fabien Poulard</dc:creator>
        <category>Geek &amp; Technique</category>
        <category>openstreetmap</category>    
    <description>    &lt;p&gt;Les contributeurs Nantais à &lt;a href=&quot;http://openstreetmap.org&quot; hreflang=&quot;fr&quot;&gt;Open Street Map&lt;/a&gt; (OSM pour les intimes) se donnent rendez-vous &lt;strong&gt;ce soir (jeudi 3 novembre 2011) &lt;a href=&quot;http://www.openstreetmap.org/?mlat=47.214315&amp;amp;mlon=-1.554687&amp;amp;zoom=18&amp;amp;layers=M&quot; title=&quot;Position du bar le Flesselles à Nantes&quot;&gt;au bar le Flesselles&lt;/a&gt; à 19h30&lt;/strong&gt;.&lt;/p&gt;


&lt;p&gt;À l'ordre du jour :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Boire un verre (ou plusieurs) tous ensemble&lt;/li&gt;
&lt;li&gt;Discuter de la création récente de l'association OSM nationale&lt;/li&gt;
&lt;li&gt;Échanger autour de nos pratiques (outils, méthodes, zones couvertes, ...)&lt;/li&gt;
&lt;li&gt;Réfléchir à de futures cartoparties (accessibilité notamment)&lt;/li&gt;
&lt;li&gt;Rétablir &lt;a href=&quot;http://www.openstreetmap.org/?lat=47.24539&amp;amp;lon=-1.55213&amp;amp;zoom=17&amp;amp;layers=M&quot;&gt;la route du campus Tertre&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ces rencontres sont ouvertes à toutes les personnes curieuses de découvrir OSM, pas seulement aux contributeurs réguliers (et moins réguliers).&lt;/p&gt;</description>
    
    
    
          <comments>http://www.fabienpoulard.info/post/2011/11/03/Rencontre-des-contributeurs-Nantais-%C3%A0-OSM#comment-form</comments>
      <wfw:comment>http://www.fabienpoulard.info/post/2011/11/03/Rencontre-des-contributeurs-Nantais-%C3%A0-OSM#comment-form</wfw:comment>
      <wfw:commentRss>http://www.fabienpoulard.info/feed/atom/comments/720</wfw:commentRss>
      </item>
    
  <item>
    <title>Travaux Pratique TALN - Le lexique</title>
    <link>http://www.fabienpoulard.info/post/2011/10/24/Travaux-Pratique-TALN-Le-lexique</link>
    <guid isPermaLink="false">urn:md5:3d9b874ed0a302ea01edabb9759aef46</guid>
    <pubDate>Mon, 24 Oct 2011 22:38:00 +0200</pubDate>
    <dc:creator>Fabien Poulard</dc:creator>
        <category>Sciences &amp; Recherche</category>
        <category>analyse lexicale</category><category>corpus</category><category>enseignement</category><category>nltk</category><category>python</category><category>scikit-learn</category>    
    <description>&lt;p&gt;Malgré &lt;a href=&quot;http://www.dictanova.com&quot; hreflang=&quot;fr&quot; title=&quot;Page de présentation de Dictanova&quot;&gt;notre projet de création d'entreprise&lt;/a&gt;, je tenais à continuer à enseigner le TALN à l'Université. Outre l'intérêt pragmatique du chef d'entreprise qui souhaite ainsi repérer les éléments prometteurs à recruter, l'enseignement est une des meilleures manières de prendre du recul sur un domaine.&lt;/p&gt;


&lt;p&gt;Cette année je compte mettre de côté UIMA pour me concentrer sur l'expérimentation. J'ai donc décidé de me tourner vers Python, mon langage de cœur, et les bibliothèques &lt;a href=&quot;http://www.nltk.org/&quot; hreflang=&quot;en&quot;&gt;NLTK&lt;/a&gt; et &lt;a href=&quot;http://scikit-learn.sourceforge.net/stable/&quot; hreflang=&quot;en&quot;&gt;scikit-learn&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Pour ce premier TP, je compte faire réfléchir les étudiants sur l'analyse lexicale : découpage d'un texte en mots, calculer une distribution sur un document, puis un corpus, filtrer les mots qui participent peu à l'expression du sens et visualiser un texte à partir de son lexique.&lt;/p&gt;    &lt;h2&gt;Constitution du corpus&lt;/h2&gt;


&lt;p&gt;Si la construction du corpus est toujours primordiale, celle-ci revêt un enjeu d'autant plus stratégique en enseignement que le corpus peut captiver ou repousser les étudiants.&lt;/p&gt;


&lt;p&gt;J'ai un temps été tenté par les messages de condoléances laissés par les fans d'Apple à l'occasion de la mort de Steve Jobs. Neil Kodner a réalisé &lt;a href=&quot;http://www.neilkodner.com/2011/10/an-analysis-of-steve-jobs-tribute-messages-displayed-by-apple/&quot; hreflang=&quot;en&quot;&gt;une superbe analyse sur le sujet&lt;/a&gt;. Toutefois, je préfère faire travailler mes étudiants sur le français qui a des propriétés particulières qu'on ne retrouve pas en anglais, notamment sa forte flexionnalité.&lt;/p&gt;


&lt;p&gt;À l'occasion du lancement par Google d'un concours de visualisation de données sur la thématique des élections présidentielles 2012, je me suis une nouvelle fois tourné vers les discours politiques. Ceux-ci sont souvent chargés de symboles qui s'expriment souvent par le lexique, d'où l'intérêt de les utiliser dans ce genre d'étude. Bien sûr l'objectif n'est pas de chercher à atteindre la qualité des études menées avec brillo par &lt;a href=&quot;http://blog.veronis.fr/&quot; hreflang=&quot;fr&quot;&gt;Jean Véronis&lt;/a&gt;, mais simplement se faire la main sur quelques textes contemporains d'intérêts.&lt;/p&gt;


&lt;p&gt;Pour la constitution du corpus, je me suis simplement tourné vers &lt;a href=&quot;http://www.elysee.fr/&quot; hreflang=&quot;fr&quot;&gt;le site de l'Élysée&lt;/a&gt;. J'avais commencé à &lt;a href=&quot;http://www.fabienpoulard.info/post/2010/03/13/Corpus-des-discours-de-Nicolas-Sarkozy-%28M%C3%80J%29&quot;&gt;collecter les différents discours de notre président&lt;/a&gt;, mais une mise-à-jour du site (fortement inspiré du &lt;a href=&quot;http://www.whitehouse.gov/&quot; hreflang=&quot;en&quot;&gt;site de la Maison Blanche&lt;/a&gt;) m'avait coupé dans mon élan. Le point positif est que ce nouveau site met l'accent sur l'accessibilité. J'ai écrit un petit script Python qui permet d'aller récupérer tous les discours. Il est un peu simpliste et ramène donc un peu de bruit, mais suffisamment peu pour que le résultat soit exploitable :&lt;/p&gt;

&lt;pre class=&quot;python python&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;#!/usr/bin/env python&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# -*- coding: utf-8 -*-&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;#&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# Scrap the speeches from M. President Sarkozy :)&lt;/span&gt;
 
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #dc143c;&quot;&gt;sys&lt;/span&gt;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #dc143c;&quot;&gt;codecs&lt;/span&gt;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #dc143c;&quot;&gt;urllib2&lt;/span&gt;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;from&lt;/span&gt; BeautifulSoup &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; BeautifulSoup
 
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; did &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;range&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ff4500;&quot;&gt;12300&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;:
	&lt;span style=&quot;color: #dc143c;&quot;&gt;sys&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;stdout&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;write&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;Dealing with page %d...&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;%&lt;/span&gt;did&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
	&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;try&lt;/span&gt;:
		&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# Collect the page&lt;/span&gt;
		uh    = &lt;span style=&quot;color: #dc143c;&quot;&gt;urllib2&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;urlopen&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;http://www.elysee.fr/president/root/bank/print/%d.htm&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;%&lt;/span&gt; did&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
		html  = uh.&lt;span style=&quot;color: black;&quot;&gt;read&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
		uh.&lt;span style=&quot;color: black;&quot;&gt;close&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
		&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# Check it is a discourse (discourse subcategory)&lt;/span&gt;
		&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;if&lt;/span&gt; html.&lt;span style=&quot;color: black;&quot;&gt;find&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;/president/root/core/D00018&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;gt;&lt;/span&gt;= &lt;span style=&quot;color: #ff4500;&quot;&gt;0&lt;/span&gt;:
			&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# Extract the text&lt;/span&gt;
			soup  = BeautifulSoup&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;html&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
			zone  = soup.&lt;span style=&quot;color: black;&quot;&gt;body&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;find&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;div&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #008000;&quot;&gt;id&lt;/span&gt;=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;zonePrincipale&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
			texts = &lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;t.&lt;span style=&quot;color: black;&quot;&gt;strip&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; t &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; zone.&lt;span style=&quot;color: black;&quot;&gt;findAll&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;text=&lt;span style=&quot;color: #008000;&quot;&gt;True&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;t.&lt;span style=&quot;color: black;&quot;&gt;strip&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #ff4500;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;
			&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# Export it&lt;/span&gt;
			fh = &lt;span style=&quot;color: #dc143c;&quot;&gt;codecs&lt;/span&gt;.&lt;span style=&quot;color: #008000;&quot;&gt;open&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;%d.txt&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;%&lt;/span&gt;did, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;w&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;utf-8&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
			&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; t &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; texts:
				fh.&lt;span style=&quot;color: black;&quot;&gt;write&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;t + &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
			fh.&lt;span style=&quot;color: black;&quot;&gt;close&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
			&lt;span style=&quot;color: #dc143c;&quot;&gt;sys&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;stdout&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;write&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;done&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
		&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;else&lt;/span&gt;:
			&lt;span style=&quot;color: #dc143c;&quot;&gt;sys&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;stdout&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;write&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;ignored&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
	&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;except&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;Exception&lt;/span&gt;:
		&lt;span style=&quot;color: #dc143c;&quot;&gt;sys&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;stdout&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;write&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;error&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;À l'heure de l'écriture de ce billet, le script permet de collecter 588 discours (ou pages identifiées comme tels) pour un total de 1943116 mots. L'export de l'extraction peut-être téléchargé &lt;a href=&quot;http://www.fabienpoulard.info/download/Recherche/Corpus/Discours-Sarkozy-v20111025.tar.gz&quot; hreflang=&quot;fr&quot;&gt;ici&lt;/a&gt;.&lt;/p&gt;


&lt;h2&gt;Découpage en mots&lt;/h2&gt;


&lt;p&gt;J'ai déjà discuté plusieurs fois du découpage en mots sur ce blog : avec &lt;a href=&quot;http://www.fabienpoulard.info/post/2008/03/05/Tokenisation-en-mots-avec-NLTK&quot;&gt;NLTK&lt;/a&gt; ou de &lt;a href=&quot;http://www.fabienpoulard.info/post/2010/09/08/Un-rapide-tokeniseur-en-mots-pour-le-fran%C3%A7ais&quot;&gt;manière plus théorique&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Je vois trois façons d'approcher le problème du découpage en mots :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Rechercher les sous-chaînes qui constituent les mots ;&lt;/li&gt;
&lt;li&gt;Rechercher les sous-chaînes qui séparent les mots ;&lt;/li&gt;
&lt;li&gt;Identifier les frontières entre les mots et les non-mots.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;La première approche est celle qui a été auparavant discutée sur ce blog. L'idée générale est qu'un mot (ou plus précisément un &lt;a href=&quot;http://ldelafosse.pagesperso-orange.fr/Glossaire/L.htm#lexeme&quot; hreflang=&quot;fr&quot;&gt;lexème&lt;/a&gt;) est une séquence continue de lettres ou de chiffres. Les choses se compliquent lorsque l'on considère les cas particuliers : les articles et pronoms contractés (l', d', j', m', ...) ; les composés lexicaux à apostrophe (aujourd'hui, ...) ; les composés lexicaux à traits d'union (arc-en-ciel, peut-être, sauve-qui-peut, ...) ; les valeurs numériques (14 000, 14,18, 30 %, ...) ; les acronymes (ASSEDIC, ASCII, ...) ; les sigles (C-4, c-à-d, i.e., ...) ou encore les unités de mesure (A/m, km/h, ...).&lt;/p&gt;


&lt;p&gt;La seconde approche me semble biaisée par nature. Elle fonctionne suffisamment bien pour l'anglais où l'on peut envisager découper un texte en mots en coupant à l'endroit des espaces. Elle est toutefois inefficace pour le français étant donné le nombre de cas où les mots sont séparés par une chaîne vide (présence d'un apostrophe, ponctuation, ...).&lt;/p&gt;


&lt;p&gt;La dernière approche serait celle que je mettrais en œuvre si je devais implémenter un algorithme de découpage en mot par &lt;a href=&quot;http://fr.wikipedia.org/wiki/Apprentissage_automatique&quot; hreflang=&quot;fr&quot;&gt;apprentissage&lt;/a&gt;. L'idée serait alors de classer chaque caractère dans une des catégories : début de mot, fin de mot ou n'appartenant pas à un mot. Je ne connais pas l'état de l'art des techniques de tokenisation automatique, mais une approche par n-grammes caractères devrait assez bien fonctionner. Il faudrait toutefois étudier lequel du contexte gauche ou droit est le plus important (si l'un des deux est plus important que l'autre).&lt;/p&gt;


&lt;p&gt;Pour l'exercice nous utiliserons le &lt;a href=&quot;http://nltk.googlecode.com/svn/trunk/doc/api/nltk.tokenize.regexp.RegexpTokenizer-class.html&quot; hreflang=&quot;en&quot;&gt;RegexpTokenizer&lt;/a&gt; de nltk avec l'expression régulière suivante (à améliorer éventuellement) :&lt;/p&gt;

&lt;pre class=&quot;python python&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #dc143c;&quot;&gt;re&lt;/span&gt;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;from&lt;/span&gt; nltk.&lt;span style=&quot;color: #dc143c;&quot;&gt;tokenize&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;regexp&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; RegexpTokenizer
 
reg_words = r&lt;span style=&quot;color: #483d8b;&quot;&gt;''&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'(?x)
          aujourd'&lt;/span&gt;hui    &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# exception 1&lt;/span&gt;
        | prud&lt;span style=&quot;color: #483d8b;&quot;&gt;'hom&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\w&lt;/span&gt;+ # exception 2
        | &lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\d&lt;/span&gt;+(,&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\d&lt;/span&gt;+)?&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\s&lt;/span&gt;*[%€$] # les valeurs
        | &lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\d&lt;/span&gt;+                # les nombres
        | &lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\w&lt;/span&gt;'&lt;/span&gt;                 &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# les contractions d', l', j', t', s'&lt;/span&gt;
        | \w+&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;-\w+&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;+    &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# les mots composés&lt;/span&gt;
        | &lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;\d|\w&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;+         &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# les combinaisons alphanumériques&lt;/span&gt;
        | \w+               &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# les mots simples&lt;/span&gt;
        &lt;span style=&quot;color: #483d8b;&quot;&gt;''&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'
tokenizer = RegexpTokenizer(reg_words, flags=re.UNICODE|re.IGNORECASE)&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;L'utilisation du RegexpTokenizer est des plus simple, il suffit d'appeler la méthode &lt;em&gt;tokenize&lt;/em&gt; sur un texte pour obtenir en retour la liste des mots extraits dudit texte :&lt;/p&gt;

&lt;pre&gt;
&amp;gt;&amp;gt;&amp;gt; tokenizer.tokenize(text)

[u'Hommage', u'\xe0', u'M', u'Aim\xe9', u'C\xc9SAIRE', u'ALLOCUTION', u'DE', u'M', u'LE', u'PR\xc9SIDENT', u'DE', u'LA', 
u'R\xc9PUBLIQUE', u'FRAN\xc7AISE', u'A\xe9roport', u'de', u'Fort-de-France', u'Martinique', u'Dimanche', u'20', u'Avril', u'2008', u&amp;quot;C'&amp;quot;, 
u'est', u'avec', u'une', u'profonde', u'\xe9motion', u'que', u'je', u'viens', u&amp;quot;aujourd'hui&amp;quot;, u'rendre', u&amp;quot;l'&amp;quot;, u'hommage', u'de', u'la', 
u'Nation', u'\xe0', u'Aim\xe9', u'C\xc9SAIRE', u'qui', u'nous', u'a', u'quitt\xe9s', u'jeudi', u'dernier', u'Ma', u'place', u'ne', u'pouvait', 
u'\xeatre', u&amp;quot;aujourd'hui&amp;quot;, u'que', u'sur', u'cette', u'terre', u'de', u'Martinique', u'aux', u'c\xf4t\xe9s', u'de', u'ceux', u'qui', u'sont', 
u'dans', u'la', u'peine', u'Mes', u'premi\xe8res', u'pens\xe9es', u'vont', u'naturellement', u'\xe0', u'la', u'famille', u'endeuill\xe9e', 
u'qu', u'avec', u'les', u'ministres', u'je', u'rencontrerai', u'dans', ...
&lt;/pre&gt;


&lt;h2&gt;Distribution des mots&lt;/h2&gt;


&lt;p&gt;L'objet du découpage en mot est, outre de se confronter à la difficulté bien réelle de la tâche, de mesurer la distribution du lexique dans le corpus des discours. Plus simplement dit, il s'agit de compter le nombre d'occurrences de chacun des mots utilisés. Par mot, j'entends ici &lt;a href=&quot;http://ldelafosse.pagesperso-orange.fr/Glossaire/L.htm#lexie&quot; hreflang=&quot;fr&quot;&gt;lexie&lt;/a&gt; (bien sûr ^^), soit la forme textuelle qui fait référence au mot tel qu'on le trouve dans le dictionnaire.&lt;/p&gt;


&lt;p&gt;Pour le comptage des mots, il est possible d'utiliser un simple dictionnaire en gérant l'ajout d'une clé pour chaque nouveau mot rencontré. NLTK propose toutefois une classe qui permet de s'affranchir de cette déclaration et de se concentrer uniquement sur le comptage : la classe &lt;a href=&quot;http://nltk.googlecode.com/svn/trunk/doc/api/nltk.probability.FreqDist-class.html&quot; hreflang=&quot;en&quot;&gt;FreqDist&lt;/a&gt;.&lt;/p&gt;

&lt;pre class=&quot;python python&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;from&lt;/span&gt; nltk.&lt;span style=&quot;color: black;&quot;&gt;probability&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; FreqDist
 
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# Comptage des mots à la création&lt;/span&gt;
fdist = FreqDist&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;  tokenizer.&lt;span style=&quot;color: #dc143c;&quot;&gt;tokenize&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;text&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;  &lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
 
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# ... ou bien en parcourant la liste&lt;/span&gt;
fdist = FreqDist&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; word &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt;  tokenizer.&lt;span style=&quot;color: #dc143c;&quot;&gt;tokenize&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;text&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;:
     fdist.&lt;span style=&quot;color: black;&quot;&gt;inc&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt; word.&lt;span style=&quot;color: black;&quot;&gt;lower&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;En plus d'économiser la déclaration des mots, la classe ordonne automatiquement les mots par fréquence décroissante :&lt;/p&gt;

&lt;pre&gt;
&amp;gt;&amp;gt;&amp;gt; fdist.items()[:30]

[(u'de', 53), (u'la', 36), (u'qui', 23), (u'et', 19), (u&amp;quot;l'&amp;quot;, 18), (u'un', 17), (u'\xe0', 14), (u'des', 13),
 (u'que', 13), (u'les', 12), (u'le', 11), (u'a', 10), (u'est', 10), (u'homme', 10), (u'sa', 9),
 (u'aim\xe9', 8), (u'c\xe9saire', 8), (u'je', 8), (u&amp;quot;c'&amp;quot;, 7), (u'dans', 7), (u'du', 7), (u'cet', 6),
 (u'france', 6), (u'martinique', 6), (u'nous', 6), (u'ses', 6), (u'avec', 5), (u'ce', 5), (u&amp;quot;d'&amp;quot;, 5), (u'martiniquais', 5)]
&lt;/pre&gt;


&lt;h2&gt;Filtrage des mots non signifiants&lt;/h2&gt;


&lt;p&gt;Tous les mots d'un texte ne jouent pas le même rôle : certains participent à la construction du sens (je les appellerai &lt;em&gt;signifiants&lt;/em&gt;), d'autres ont un rôle d'assemblage (je les appellerai &lt;em&gt;outils&lt;/em&gt;). La catégorisation est volontairement extrêmement grossière. Toute la profondeur de l'analyse lexicale réside précisément dans le juste filtrage des mots qui n'apporte pas de sens dans le contexte de l'énonciation. Comment les sélectionner ?&lt;/p&gt;


&lt;p&gt;Une hypothèse simple, mais qui fonctionne assez bien, est de considérer que les mots les plus communs ne participent pas à l'élaboration du sens. L'hypothèse est globalement validé si l'on observe le top 50 des mots du corpus :&lt;/p&gt;

&lt;pre&gt;
&amp;gt;&amp;gt;&amp;gt; fdist.items()[:50]

[(u'de', 101164), (u'la', 67872), (u'le', 48749), (u'et', 42159), (u&amp;quot;l'&amp;quot;, 41465), (u'les', 36784), (u'que', 33999),
 (u'\xe0', 31771), (u'des', 30118), (u'est', 30097), (u&amp;quot;d'&amp;quot;, 26459), (u'en', 22888), (u'qui', 22072), (u'je', 21717),
 (u'un', 20687), (u'pas', 20162), (u'pour', 19479), (u'du', 18521), (u'il', 17603), (u'une', 17362), (u'a', 16495),
 (u'nous', 16219), (u&amp;quot;c'&amp;quot;, 15088), (u'dans', 14612), (u'vous', 14175), (u'on', 13874), (u'ce', 13645), (u'ne', 13540),
 (u'qu', 12816), (u&amp;quot;n'&amp;quot;, 12401), (u'au', 11463), (u'plus', 9716), (u'sur', 8973), (u'france', 8316), (u'avec', 8311), (u'y', 8047),
 (u'mais', 7662), (u'pr\xe9sident', 7540), (u&amp;quot;j'&amp;quot;, 6409), (u'par', 6384), (u'se', 6252), (u'sous', 6225), (u'r\xe9publique', 6179),
 (u'sont', 5905), (u&amp;quot;s'&amp;quot;, 5809), (u'aux', 5673), (u'publi\xe9', 5586), (u'class\xe9', 5576), (u'cette', 5564), (u'cela', 5555)]
&lt;/pre&gt;


&lt;p&gt;Dans les faits, il semble important de conserver des mots tels que &lt;em&gt;france&lt;/em&gt; ou &lt;em&gt;république&lt;/em&gt;. Au final, il est donc préférable d'opérer la sélection manuellement.&lt;/p&gt;


&lt;p&gt;Une première phase de filtrage consiste à supprimer toutes les entrées qui correspondent aux mots outils classiques (déterminants, pronoms, verbes être et avoir, ...). NLTK propose une telle liste de mots :&lt;/p&gt;

&lt;pre class=&quot;python python&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;from&lt;/span&gt; nltk.&lt;span style=&quot;color: black;&quot;&gt;corpus&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; stopwords
 
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; sw &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; stopwords.&lt;span style=&quot;color: black;&quot;&gt;words&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;french&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;:
     &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;if&lt;/span&gt; fdist.&lt;span style=&quot;color: black;&quot;&gt;has_key&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;sw&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;:
          fdist.&lt;span style=&quot;color: black;&quot;&gt;pop&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;sw&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Il faut ensuite la compléter en observant manuellement, parmi les mots les plus fréquents, ceux qui n'apportent pas d'information sur le contenu d'un discours politique. J'ai déposé une proposition d'anti-dictionnaire composé de 318 mots, encodés en UTF-8, dans &lt;a href=&quot;http://fabienpoulard.info/download/Recherche/Corpus/antidictionnaire&quot; hreflang=&quot;fr&quot;&gt;l'espace de téléchargement du corpus&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Le top 50 des mots du corpus une fois l'anti-dictionnaire appliqué est beaucoup plus parlant :&lt;/p&gt;

&lt;pre&gt;
&amp;gt;&amp;gt;&amp;gt; fdist.items()[:50]

[(u'france', 8316), (u'pr\xe9sident', 7540), (u'r\xe9publique', 6179), (u'monde', 4083), (u'fran\xe7ais', 3194),
 (u'europe', 3189), (u'travail', 2434), (u'ministre', 2331), (u'\xe9tat', 2175), (u'politique', 2130),
 (u'fran\xe7aise', 1812), (u'question', 1770), (u'crise', 1755), (u'avenir', 1515), (u'entreprises', 1480),
 (u'r\xe9forme', 1430), (u's\xe9curit\xe9', 1424), (u'vie', 1424), (u'besoin', 1420), (u'conseil', 1397),
 (u'international', 1319), (u'emploi', 1318), (u'recherche', 1314), (u'gouvernement', 1308), (u'\xe9conomie', 1253),
 (u'd\xe9veloppement', 1194), (u'etat', 1153), (u'palais', 1136), (u'paris', 1123), (u'droit', 1098),
 (u'histoire', 1079), (u'service', 1074), (u'\xe9conomique', 1054), (u'syst\xe8me', 1046), (u'enfants', 1006),
 (u'jeunes', 1000), (u'afrique', 985), (u'moyens', 954), (u'europ\xe9enne', 950), (u'plan', 941), (u'croissance', 925),
 (u'nationale', 903), (u'amis', 900), (u'loi', 888), (u'ministres', 885), (u'sant\xe9', 885), (u'projet', 873),
 (u'hommes', 842), (u'euros', 833), (u'culture', 829)]
&lt;/pre&gt;


&lt;h2&gt;Visualisation&lt;/h2&gt;


&lt;p&gt;La dernière étape du TP consiste à visualiser les données ainsi collectées. Il existe plusieurs méthodes de visualisation de ce type de données (voir notamment &lt;a href=&quot;http://blog.veronis.fr/2006/04/2007-larbre-des-thmes.html&quot; hreflang=&quot;fr&quot;&gt;ce billet de Jean Véronis&lt;/a&gt;), j'ai choisi la plus simple de toutes : le nuage de mots.&lt;/p&gt;


&lt;p&gt;J'utilise l'&lt;a href=&quot;http://www.wordle.net/&quot; hreflang=&quot;en&quot;&gt;outil Wordle&lt;/a&gt; pour générer mes nuages, et plus particulièrement &lt;a href=&quot;http://www.wordle.net/advanced&quot; hreflang=&quot;en&quot;&gt;l'interface avancée&lt;/a&gt; qui permet d'indiquer soit même les mots retenus et leur pondération.&lt;/p&gt;


&lt;p&gt;J'ai retenu pour le nuage les 500 mots les plus présents dans le corpus. Leur pondération est calculée à partir de leur fréquence multipliée par 10000 :&lt;/p&gt;

&lt;pre class=&quot;python python&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; w &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; fdist.&lt;span style=&quot;color: black;&quot;&gt;keys&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;:&lt;span style=&quot;color: #ff4500;&quot;&gt;500&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;:
     &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;print&lt;/span&gt; &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;%s:%d&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;%&lt;/span&gt; &lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;w, &lt;span style=&quot;color: #008000;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;fdist.&lt;span style=&quot;color: black;&quot;&gt;freq&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;w&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #ff4500;&quot;&gt;10000&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Le résultat est visible dans &lt;a href=&quot;http://www.wordle.net/show/wrdl/4298454/Discours_de_N._Sarkozy&quot; hreflang=&quot;fr&quot;&gt;la galerie publique de Wordle&lt;/a&gt;, ou ci-dessous :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.fabienpoulard.info/public/2011/TP-TALN/nuage-mots-sarkozy.png&quot; title=&quot;Nuage de mots du corpus des discours publiques de N. Sarkozy en tant que président de la République (jusqu'au 24 octobre 2011).&quot;&gt;&lt;img src=&quot;http://www.fabienpoulard.info/public/2011/TP-TALN/.nuage-mots-sarkozy_m.jpg&quot; alt=&quot;Nuage de mots du corpus des discours publiques de N. Sarkozy en tant que président de la République (jusqu'au 24 octobre 2011).&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;Nuage de mots du corpus des discours publiques de N. Sarkozy en tant que président de la République (jusqu'au 24 octobre 2011)., oct. 2011&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.fabienpoulard.info/post/2011/10/24/Travaux-Pratique-TALN-Le-lexique#comment-form</comments>
      <wfw:comment>http://www.fabienpoulard.info/post/2011/10/24/Travaux-Pratique-TALN-Le-lexique#comment-form</wfw:comment>
      <wfw:commentRss>http://www.fabienpoulard.info/feed/atom/comments/718</wfw:commentRss>
      </item>
    
  <item>
    <title>Premières semaines en tant qu'entrepreneur</title>
    <link>http://www.fabienpoulard.info/post/2011/09/01/Premi%C3%A8res-semaines-en-tant-qu-entrepreneur</link>
    <guid isPermaLink="false">urn:md5:918fc9bc64a0d21d890a175dea446c76</guid>
    <pubDate>Fri, 02 Sep 2011 00:00:00 +0200</pubDate>
    <dc:creator>Fabien Poulard</dc:creator>
        <category>Entrepreneuriat</category>
        <category>dictanova</category><category>entrepreneuriat</category>    
    <description>&lt;p&gt;L'aventure universitaire s'est terminée avec mon contrat d'ingénieur de recherche à l'&lt;a href=&quot;http://www.angers-nantes.inra.fr/&quot; hreflang=&quot;fr&quot;&gt;INRA Nantes-Angers&lt;/a&gt;. Je suis désormais entrepreneur, dans l'hypothèse où c'est un statut figé dans le temps ! C'est le début d'une toute nouvelle aventure, extrêmement excitante... C'est aussi l'occasion de légèrement modifier la ligne éditoriale de ce blog (mais pas trop quand même), à commencer par son titre !&lt;/p&gt;    &lt;p&gt;Cela fait une quinzaine de jours que &lt;a href=&quot;http://www.matthieu-vernier.com/&quot; hreflang=&quot;fr&quot; title=&quot;CV de Matthieu&quot;&gt;Matthieu&lt;/a&gt; et &lt;a href=&quot;http://www.doyoubuzz.com/fabien-poulard/&quot; hreflang=&quot;fr&quot;&gt;moi même&lt;/a&gt; travaillons à temps plein sur notre projet d'entreprise &lt;em&gt;Dictanova&lt;/em&gt;. Et le temps passe vite ! Petit récapitulatif des épisodes (non diffusés) précédents...&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.fabienpoulard.info/public/dictanova/.newlogo-fabien_s.jpg&quot; alt=&quot;Logo dictanova&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;Logo dictanova, sept. 2011&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Comme tout doctorant (j'imagine), la fin de la thèse a été l'occasion de me poser les questions existentielles classiques sur mon avenir : maître de conférence ? entreprise ? chômeur ? Et pourquoi pas créer ma propre boîte ? La balance a rapidement pesé à l'avantage de la création d'entreprise par rapport à la voie universitaire &lt;em&gt;royale&lt;/em&gt;, comprenez : contrats précaires à l'étranger (aussi appelés stages post-doctoraux), campagne de recrutement, se faire bouler, contrats précaires, campagne de recrutement... Toutefois j'étais frileux à l'idée de me lancer seul dans l'aventure. J'avais besoin de faire ça avec quelqu'un de compétent, en qui j'ai confiance et avec qui j'ai des liens d'amitié suffisamment forts pour résister aux tempêtes à venir : &lt;a href=&quot;http://www.matthieu-vernier.com/&quot; hreflang=&quot;fr&quot; title=&quot;CV de Matthieu&quot;&gt;Matthieu&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;L'idée ancrée dans nos têtes, il a fallut trouver un catalyseur pour se lancer. Pour nous ça a été le &lt;a href=&quot;http://www.les-entrepreneuriales.fr/&quot; hreflang=&quot;fr&quot;&gt;programme des entrepreneuriales&lt;/a&gt;. Il s'agit d'une initiative fantastique pour découvrir la création d'entreprise, et y prendre goût. C'est l'occasion avant tout de rencontrer des gens : des entrepreneurs passionnés (&lt;a href=&quot;http://www.reseau-entreprendre-atlantique.fr/reseau-entreprendre-atlantique/fr/s04_laureats/s04p03_fiche_laureat.php?laureat=3306&quot; hreflang=&quot;fr&quot;&gt;notre parrain notamment&lt;/a&gt;), des structures prêtes à vous accompagner, ... et des  clients potentiels !&lt;/p&gt;


&lt;p&gt;Une dizaine de rendez-vous de prospection, un business plan et accessoirement une soutenance de thèse plus tard, l'aventure était réellement lancée. Nous avons alors proposé à &lt;a href=&quot;http://jerome.rocheteau.free.fr/&quot; hreflang=&quot;fr&quot;&gt;Jérôme&lt;/a&gt; de nous rejoindre comme troisième associé fondateur afin de compléter le panel des compétences techniques de l'équipe.&lt;/p&gt;


&lt;p&gt;S'ensuit un parcours jalonné :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;rencontre de la &lt;a href=&quot;http://www.univ-nantes.fr/90048/0/fiche___defaultstructureksup/&amp;amp;RH=VALO&quot; hreflang=&quot;fr&quot;&gt;cellule de valorisation de l'Université&lt;/a&gt; et de la direction du &lt;a href=&quot;http://www.lina.univ-nantes.fr/&quot; hreflang=&quot;fr&quot;&gt;laboratoire&lt;/a&gt; pour régler les problèmes de propriété intellectuelle et étudier les possibilités de soutient de d'hébergement ;&lt;/li&gt;
&lt;li&gt;d'&lt;a href=&quot;http://www.atlanpole.fr/&quot; hreflang=&quot;fr&quot;&gt;Atlanpole&lt;/a&gt; pour l'incubation ;&lt;/li&gt;
&lt;li&gt;et d'&lt;a href=&quot;http://www.oseo.fr/&quot; hreflang=&quot;fr&quot;&gt;OSÉO&lt;/a&gt; pour financer une étude de faisabilité économique.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La suite va s'écrire dans les prochaines semaines. Le passage en comité d'engagement tout d'abord, afin de convaincre &lt;a href=&quot;http://www.atlanpole.fr/&quot; hreflang=&quot;fr&quot;&gt;Atlanpole&lt;/a&gt; de nous incuber. L'hébergement au sein même du &lt;a href=&quot;http://www.lina.univ-nantes.fr/&quot; hreflang=&quot;fr&quot;&gt;LINA&lt;/a&gt; ensuite qui nous permettra de rester au contact de nos collègues chercheurs.&lt;/p&gt;


&lt;p&gt;Bien des évènements à venir que je compte faire partager au travers ce blog... d'ici là, retour au boulot : il y a du pain sur la planche !&lt;/p&gt;</description>
    
    
    
          <comments>http://www.fabienpoulard.info/post/2011/09/01/Premi%C3%A8res-semaines-en-tant-qu-entrepreneur#comment-form</comments>
      <wfw:comment>http://www.fabienpoulard.info/post/2011/09/01/Premi%C3%A8res-semaines-en-tant-qu-entrepreneur#comment-form</wfw:comment>
      <wfw:commentRss>http://www.fabienpoulard.info/feed/atom/comments/716</wfw:commentRss>
      </item>
    
  <item>
    <title>Cartopartie OSM sur Nantes le samedi 23 juillet 2011</title>
    <link>http://www.fabienpoulard.info/post/2011/07/19/Cartopartie-OSM-sur-Nantes-le-samedi-23-juillet-2011</link>
    <guid isPermaLink="false">urn:md5:bb3a62ec16da5e912680a121f2eaea29</guid>
    <pubDate>Tue, 19 Jul 2011 15:18:00 +0200</pubDate>
    <dc:creator>Fabien Poulard</dc:creator>
        <category>Geek &amp; Technique</category>
            
    <description>    &lt;p&gt;Les contributeurs nantais à &lt;a href=&quot;http://www.openstreetmap.org&quot; hreflang=&quot;en&quot;&gt;OpenStreetMap (OSM)&lt;/a&gt; organisent une cartopartie ce &lt;strong&gt;samedi 23 juillet&lt;/strong&gt;. La journée est placée sous le signe de la circulation douce : l'objectif est de corriger et compléter les infrastructures dédiées à la circulation douce sur l'agglomération nantaise (pistes cyclables, bornes, ...).&lt;/p&gt;


&lt;p&gt;Le rendez-vous est donné à &lt;strong&gt;10h30 au &lt;a href=&quot;http://www.openstreetmap.org/?mlat=47.214329&amp;amp;mlon=-1.554661&amp;amp;zoom=18&amp;amp;layers=M&quot; hreflang=&quot;fr&quot;&gt;Café Flesselles&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;


&lt;p&gt;Au programme :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Présentation de l'état des lieux et identification des zones prioritaires pour la cartopartie avec une intervention de &lt;a href=&quot;http://www.geovelo.fr/apropos.php&quot; hreflang=&quot;fr&quot;&gt;Benoît Grunberg&lt;/a&gt; de &lt;a href=&quot;http://geovelo.nantesmetropole.fr/&quot; hreflang=&quot;fr&quot;&gt;GéoVélo&lt;/a&gt; ;&lt;/li&gt;
&lt;li&gt;Formation des équipes et affectation des zones à cartographier ;&lt;/li&gt;
&lt;li&gt;Fusion des données collectées.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;L’événement est ouvert à tous, que vous soyez un novice qui n'a même jamais entendu parlé d'OpenStreetMap ou bien un contributeur confirmé. L'objectif de cette rencontre est de faire avancer le projet OSM dans la convivialité.&lt;/p&gt;


&lt;p&gt;Pensez à apporter votre matériel de cartographe (bloc-notes, GPS, appareil photo...), et si possible venez en vélo puisque la cartopartie devrait principalement s'effectuer par ce mode de transport.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.fabienpoulard.info/post/2011/07/19/Cartopartie-OSM-sur-Nantes-le-samedi-23-juillet-2011#comment-form</comments>
      <wfw:comment>http://www.fabienpoulard.info/post/2011/07/19/Cartopartie-OSM-sur-Nantes-le-samedi-23-juillet-2011#comment-form</wfw:comment>
      <wfw:commentRss>http://www.fabienpoulard.info/feed/atom/comments/711</wfw:commentRss>
      </item>
    
  <item>
    <title>Map/Reduce dans MongoDB</title>
    <link>http://www.fabienpoulard.info/post/2011/06/07/Map/Reduce-dans-MongoDB</link>
    <guid isPermaLink="false">urn:md5:ccfcbb6a995bf7d2c416fb141158df7a</guid>
    <pubDate>Sat, 11 Jun 2011 15:00:00 +0200</pubDate>
    <dc:creator>Fabien Poulard</dc:creator>
        <category>Geek &amp; Technique</category>
        <category>mapreduce</category><category>mongodb</category><category>parallélisation</category>    
    <description>&lt;p&gt;L'un des intérêts de la mouvance NoSQL est d'intégrer le &lt;a href=&quot;http://fr.wikipedia.org/wiki/MapReduce&quot; hreflang=&quot;en&quot;&gt;paradigme du Map/Reduce&lt;/a&gt; qui consiste à partitionner les données afin de les traiter en parallèle. MongoDB ne fait pas exception et intègre directement ces concepts.&lt;/p&gt;


&lt;p&gt;J'explique dans ce billet comment compter le nombre de documents associés à chaque valeur d'un attribut.&lt;/p&gt;    &lt;h2&gt;Map/Reduce ?&lt;/h2&gt;


&lt;p&gt;Le principe du paradigme Map/Reduce (oui j'ai choisi de considérer qu'il s'agissait d'un paradigme... carrément) Map/Reduce est de diviser les données à traiter en partitions indépendantes, traiter ces partitions en parallèle et finalement combiner les résultats des traitements parallèles.&lt;/p&gt;


&lt;p&gt;Le &lt;em&gt;Map&lt;/em&gt; consiste en l'étape de découpage puis de distribution des différentes partitions de données constituées. La mise en œuvre se réalise habituellement à l'échelle d'une grappe de serveurs. Le &lt;em&gt;Map&lt;/em&gt; est alors réalisé par un nœud qui distribue les données à d'autres nœuds. Chaque nœud en réception se charge alors du traitement sur les données reçues.&lt;/p&gt;


&lt;p&gt;Le &lt;em&gt;Reduce&lt;/em&gt; est l'opération inverse du &lt;em&gt;Map&lt;/em&gt; qui consiste à récolter tous les résultats calculés en parallèle et les fusionner (&lt;em&gt;reduce&lt;/em&gt;) en un seul résultat global. Chaque partition de données distribuée se structure comme un couple clée/valeur. La clée est utilisée lors de la fusion pour regrouper les valeurs qui vont ensemble. Toutes les valeurs associées à une clée sont donc réunies à la fin du &lt;em&gt;Reduce&lt;/em&gt;.&lt;/p&gt;


&lt;p&gt;Le schéma ci-dessous résume le principe général :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.fabienpoulard.info/public/2011/mongodb/map-and-reduce.png&quot; title=&quot;Principe général du Map/Reduce&quot;&gt;&lt;img src=&quot;http://www.fabienpoulard.info/public/2011/mongodb/.map-and-reduce_m.jpg&quot; alt=&quot;Principe général du Map/Reduce&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;Principe général du Map/Reduce, juin 2011&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;... et dans MongoDB ?&lt;/h2&gt;


&lt;p&gt;Le principe de Map/Reduce est directement implémenté dans l'API de MongoDB, soit par les &lt;a href=&quot;http://www.mongodb.org/display/DOCS/Drivers&quot; hreflang=&quot;en&quot;&gt;divers pilotes&lt;/a&gt;, soit par le &lt;a href=&quot;http://www.mongodb.org/display/DOCS/Overview+-+The+MongoDB+Interactive+Shell&quot; hreflang=&quot;en&quot;&gt;shell&lt;/a&gt; à travers &lt;a href=&quot;http://www.mongodb.org/display/DOCS/MapReduce&quot; hreflang=&quot;en&quot;&gt;la méthode mapReduce des collections&lt;/a&gt;. La méthode &lt;em&gt;mapReduce&lt;/em&gt; prend en paramètre une fonction &lt;em&gt;map&lt;/em&gt;, une fonction &lt;em&gt;reduce&lt;/em&gt; et un certain nombre d'autres paramètres optionnels passés comme un objet.&lt;/p&gt;


&lt;h3&gt;La fonction Map&lt;/h3&gt;


&lt;p&gt;La fonction &lt;em&gt;map&lt;/em&gt; ne prend pas de paramètre mais elle accède directement à l'entrée de la collection considérée par le biais de &lt;em&gt;this&lt;/em&gt;. Le rôle principal de cette méthode est d'émettre, à l'aide de la fonction &lt;em&gt;emit&lt;/em&gt;, un couple clé/objet. Par exemple, la fonction ci-dessous retourne un tel couple avec pour clé la valeur de l'attribut &lt;em&gt;croisclus&lt;/em&gt; de l'entrée et pour objet une simple paire clé/valeur : &lt;em&gt;instances/1&lt;/em&gt; :&lt;/p&gt;

&lt;pre class=&quot;javascript javascript&quot; style=&quot;font-family:inherit&quot;&gt;m &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
  emit&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;croisclus&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;instances&lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;&lt;/pre&gt;


&lt;h3&gt;La fonction Reduce&lt;/h3&gt;


&lt;p&gt;La fonction &lt;em&gt;reduce&lt;/em&gt; prend en paramètres une clé et une collection d'objets associés à cette clé tels que générés par la fonction &lt;em&gt;map&lt;/em&gt;. Elle produit en retour un objet de même structure que ceux passés en paramètre. Étant donné que la fonction &lt;em&gt;reduce&lt;/em&gt; peut-être appelée de manière itérative avec en paramètre des objets qu'elle a elle même générée, il est important qu'elle soit &lt;a href=&quot;http://fr.wikipedia.org/wiki/Idempotence&quot; hreflang=&quot;fr&quot;&gt;idempotente&lt;/a&gt;. En d'autres termes, les égalités suivantes doivent être respectées :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;reduce(k, &lt;a href=&quot;http://www.fabienpoulard.info/post/2011/06/07/Map/A ,B&quot; title=&quot;A ,B&quot;&gt;A ,B&lt;/a&gt;) == reduce(k, &lt;a href=&quot;http://www.fabienpoulard.info/post/2011/06/07/Map/B, A&quot; title=&quot;B, A&quot;&gt;B, A&lt;/a&gt;)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;reduce(k, &lt;a href=&quot;http://www.fabienpoulard.info/post/2011/06/07/Map/A ,B&quot; title=&quot;A ,B&quot;&gt;A ,B&lt;/a&gt;) == reduce(k, reduce(k, &lt;a href=&quot;http://www.fabienpoulard.info/post/2011/06/07/Map/A,B&quot; title=&quot;A,B&quot;&gt;A,B&lt;/a&gt;))&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Par exemple, la fonction ci-dessous consomme les couples générés par la fonction &lt;em&gt;map&lt;/em&gt; et additionne les valeurs de l'attribut &lt;em&gt;instances&lt;/em&gt; qui sont associées à une même clée &lt;em&gt;k&lt;/em&gt;. En d'autre terme elle fusionne tous les objets de même clé &lt;em&gt;k&lt;/em&gt; en un seul objet en additionnant leurs valeurs &lt;em&gt;instances&lt;/em&gt; :&lt;/p&gt;

&lt;pre class=&quot;javascript javascript&quot; style=&quot;font-family:inherit&quot;&gt;r &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;k&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; vals&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
  &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;var&lt;/span&gt; result &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;instances&lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
  vals.&lt;span style=&quot;color: #660066;&quot;&gt;forEach&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt; &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;value&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
      result.&lt;span style=&quot;color: #660066;&quot;&gt;instances&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;+=&lt;/span&gt; value.&lt;span style=&quot;color: #660066;&quot;&gt;instances&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt; 
    &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
  &lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;return&lt;/span&gt; result&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;&lt;/pre&gt;


&lt;h3&gt;La fonction mapReduce&lt;/h3&gt;


&lt;p&gt;Une fois ces deux fonctions écrites, il ne reste plus qu'à lancer l'opération de &lt;em&gt;Map/Reduce&lt;/em&gt; sur la collection ou éventuellement sur un sous-ensemble de la collection définie par une requête. Depuis la version 1.8 de MongoDB, il est nécessaire de préciser le nom de la collection où seront stockés les résultats du processus à l'aide d'un attribut &lt;em&gt;out&lt;/em&gt; dans le paramètre optionnel :&lt;/p&gt;

&lt;pre class=&quot;javascript javascript&quot; style=&quot;font-family:inherit&quot;&gt;res &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; db.&lt;span style=&quot;color: #660066;&quot;&gt;nano&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;mapReduce&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;m&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; r&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;out&lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;'test1'&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
	&lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;result&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;test1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
	&lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;timeMillis&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;39517&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
	&lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;counts&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
		&lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;input&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;167340&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
		&lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;emit&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;167340&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
		&lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;output&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;2332&lt;/span&gt;
	&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
	&lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;ok&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Les résultats du processus sont alors disponibles dans ladite collection :&lt;/p&gt;

&lt;pre class=&quot;javascript javascript&quot; style=&quot;font-family:inherit&quot;&gt;db.&lt;span style=&quot;color: #660066;&quot;&gt;test1&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;find&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;limit&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #CC0000;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;_id&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;C10M10&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;value&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;instances&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;2&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;_id&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;C10M11&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;value&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;instances&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;3&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;_id&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;C10M12&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;value&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;instances&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;5&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;_id&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;C10M13&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;value&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;instances&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;10&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;_id&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;C10M15&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;value&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;instances&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;1&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;_id&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;C10M16&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;value&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;instances&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;10&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;_id&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;C10M17&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;value&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;instances&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;21&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;_id&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;C10M18&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;value&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;instances&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;19&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;_id&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;C10M19&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;value&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;instances&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;674&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;_id&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;C10M20&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;value&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;instances&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;2&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;&lt;/pre&gt;</description>
    
    
    
          <comments>http://www.fabienpoulard.info/post/2011/06/07/Map/Reduce-dans-MongoDB#comment-form</comments>
      <wfw:comment>http://www.fabienpoulard.info/post/2011/06/07/Map/Reduce-dans-MongoDB#comment-form</wfw:comment>
      <wfw:commentRss>http://www.fabienpoulard.info/feed/atom/comments/709</wfw:commentRss>
      </item>
    
  <item>
    <title>Copier une annotation d'une vue à une autre dans UIMA</title>
    <link>http://www.fabienpoulard.info/post/2011/06/05/Copier-une-annotation-d-une-vue-%C3%A0-une-autre-dans-UIMA</link>
    <guid isPermaLink="false">urn:md5:0b6065d02489768c42aa754796cfe7b9</guid>
    <pubDate>Sun, 05 Jun 2011 00:59:00 +0200</pubDate>
    <dc:creator>Fabien Poulard</dc:creator>
        <category>Geek &amp; Technique</category>
        <category>uima</category>    
    <description>&lt;p&gt;Lorsque l'on travaille avec plusieurs vues au sein d'un même CAS, on se retrouve rapidement confronté au besoin de recopier certaines annotations d'une vue vers une autre.&lt;/p&gt;    &lt;p&gt;Il est possible de recréer l'annotation et de repositionner tous ses traits sur les mêmes valeurs que l'annotation d'origine. Cette approche est fastidieuse lorsque l'annotation est complexe, que l'on n'en connaît pas tous les traits ou bien lorsque l'on veut copier plusieurs annotations de types différentes.&lt;/p&gt;


&lt;p&gt;Une autre approche, beaucoup plus souple, consiste à faire une copie profonde de l'objet Java du CAS correspondant à ladite annotation à l'aide de la méthode &lt;em&gt;clone&lt;/em&gt;. Il faut alors penser à modifier la valeur du SOFA associée la nouvelle annotation sous peine de se voir refuser l'ajout de l'annotation copiée à l'index de la nouvelle vue.&lt;/p&gt;


&lt;p&gt;La difficulté réside dans le fait que le trait contenant le &lt;em&gt;SOFA&lt;/em&gt; n'est pas directement accessible. Il faut utiliser la méthode &lt;em&gt;setFeatureValue&lt;/em&gt; pour mettre à jour la valeur :&lt;/p&gt;

&lt;pre class=&quot;java java&quot; style=&quot;font-family:inherit&quot;&gt;Feature sofaFeature &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; annotation.&lt;span style=&quot;color: #006633;&quot;&gt;getType&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;.&lt;span style=&quot;color: #006633;&quot;&gt;getFeatureByBaseName&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;quot;sofa&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
annotation.&lt;span style=&quot;color: #006633;&quot;&gt;setFeatureValue&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;sofaFeature, view.&lt;span style=&quot;color: #006633;&quot;&gt;getSofa&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Voici la méthode que j'utilise désormais pour copier mes annotations d'une vue à une autre :&lt;/p&gt;

&lt;pre class=&quot;java java&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #003399;&quot;&gt;Annotation&lt;/span&gt; copyAnnotationToView&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #003399;&quot;&gt;Annotation&lt;/span&gt; a, JCas view&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
	&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;// To copy the annotation we must process in three steps&lt;/span&gt;
	&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;// 1- Clone the annotation from the original view&lt;/span&gt;
	&lt;span style=&quot;color: #003399;&quot;&gt;Annotation&lt;/span&gt; a2 &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #003399;&quot;&gt;Annotation&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; a.&lt;span style=&quot;color: #006633;&quot;&gt;clone&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
	&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;// 2- Change the Sofa of the cloned annotation&lt;/span&gt;
	Feature sofaFeature &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; a2.&lt;span style=&quot;color: #006633;&quot;&gt;getType&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;.&lt;span style=&quot;color: #006633;&quot;&gt;getFeatureByBaseName&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;quot;sofa&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
	a2.&lt;span style=&quot;color: #006633;&quot;&gt;setFeatureValue&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;sofaFeature, view.&lt;span style=&quot;color: #006633;&quot;&gt;getSofa&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
	&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;// 3- Add this annotation to the indexes of the new view&lt;/span&gt;
	a2.&lt;span style=&quot;color: #006633;&quot;&gt;addToIndexes&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;view&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
	&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;return&lt;/span&gt; a2&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;&lt;/pre&gt;</description>
    
    
    
          <comments>http://www.fabienpoulard.info/post/2011/06/05/Copier-une-annotation-d-une-vue-%C3%A0-une-autre-dans-UIMA#comment-form</comments>
      <wfw:comment>http://www.fabienpoulard.info/post/2011/06/05/Copier-une-annotation-d-une-vue-%C3%A0-une-autre-dans-UIMA#comment-form</wfw:comment>
      <wfw:commentRss>http://www.fabienpoulard.info/feed/atom/comments/708</wfw:commentRss>
      </item>
    
  <item>
    <title>MongoDB c'est cool</title>
    <link>http://www.fabienpoulard.info/post/2011/05/26/MongoDB-c-est-cool</link>
    <guid isPermaLink="false">urn:md5:fc42052dc83560dd0966d65fe89ee78f</guid>
    <pubDate>Thu, 26 May 2011 16:12:00 +0200</pubDate>
    <dc:creator>Fabien Poulard</dc:creator>
        <category>Geek &amp; Technique</category>
        <category>mongodb</category><category>nosql</category>    
    <description>&lt;p&gt;Je suis récemment tombé amoureux de la base de données &lt;a href=&quot;http://www.mongodb.org/&quot; hreflang=&quot;en&quot;&gt;MongoDB&lt;/a&gt;. Ses avantages sont nombreux mais j'apprécie tout particulièrement l'absence de schéma et le &lt;a href=&quot;http://www.mongodb.org/display/DOCS/mongo+-+The+Interactive+Shell&quot; hreflang=&quot;en&quot;&gt;shell&lt;/a&gt;. L'absence de schéma permet d'insérer des structures de données différentes dans les collections ou de modifier les structures existantes de manière transparentes sans impact sur les autres entrées (bye bye &lt;em&gt;ALTER&lt;/em&gt;). Le shell quant à lui offre une réelle souplesse qui permet de réaliser des opérations complexes qui auraient nécessiter l'écriture de code sur des bases SQL.&lt;/p&gt;    &lt;p&gt;Le shell est en réalité un interpréteur &lt;a href=&quot;http://fr.wikipedia.org/wiki/JavaScript&quot; hreflang=&quot;fr&quot;&gt;JavaScript&lt;/a&gt;, Petit exemple de la puissance de celui-ci. Dans le cadre d'un projet je voulais extraire un &lt;a href=&quot;http://en.wikipedia.org/wiki/Stratified_sampling&quot; hreflang=&quot;en&quot;&gt;sous-ensemble stratifié&lt;/a&gt; d'un corpus stocké dans MongoDB. La stratification doit s'opérer sur un attribut nommé &lt;em&gt;nivabr&lt;/em&gt; qui prend un certain nombre de valeurs. Je souhaitais avoir une dizaine de documents pour chacune de ces valeurs.&lt;/p&gt;


&lt;p&gt;Voici le code qui m'a permis de créer la nouvelle collection contenant le sous-ensemble stratifié de mon corpus :&lt;/p&gt;

&lt;pre class=&quot;javascript javascript&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;var&lt;/span&gt; strata &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; db.&lt;span style=&quot;color: #660066;&quot;&gt;nano&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;distinct&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;nivabr&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
insertInColl &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;entry&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
    db.&lt;span style=&quot;color: #660066;&quot;&gt;subostnano&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;insert&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;entry&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
selectStratum &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;stratename&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;
    db.&lt;span style=&quot;color: #660066;&quot;&gt;nano&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;find&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;nivabr&lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt;$in&lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;[&lt;/span&gt;stratename&lt;span style=&quot;color: #009900;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; $size&lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;limit&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #CC0000;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;forEach&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;insertInColl&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;
strata.&lt;span style=&quot;color: #660066;&quot;&gt;forEach&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;selectStratum&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Et ça fonctionne :&lt;/p&gt;

&lt;pre class=&quot;javascript javascript&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #339933;&quot;&gt;&amp;gt;&lt;/span&gt; db.&lt;span style=&quot;color: #660066;&quot;&gt;subostnano&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;find&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;count&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color: #CC0000;&quot;&gt;100&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Par contre je ne suis pas (encore) un maître du shell Mongo (ou &lt;a href=&quot;http://learnmongo.com/videos/administration/mongodb-shell/&quot; hreflang=&quot;en&quot;&gt;Monja&lt;/a&gt;). Vous voyez une meilleure approche pour mon problème ? J'aimerais notamment que la sélection au sein des strates se fasse aléatoirement, ce qui n'est pas le cas ici.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.fabienpoulard.info/post/2011/05/26/MongoDB-c-est-cool#comment-form</comments>
      <wfw:comment>http://www.fabienpoulard.info/post/2011/05/26/MongoDB-c-est-cool#comment-form</wfw:comment>
      <wfw:commentRss>http://www.fabienpoulard.info/feed/atom/comments/705</wfw:commentRss>
      </item>
    
  <item>
    <title>Firefox 4 en 64 bits</title>
    <link>http://www.fabienpoulard.info/post/2011/05/09/Firefox-4-en-64-bits</link>
    <guid isPermaLink="false">urn:md5:76228654a57dfe9c43c714006ff320c3</guid>
    <pubDate>Mon, 09 May 2011 15:49:00 +0200</pubDate>
    <dc:creator>Fabien Poulard</dc:creator>
        <category>Geek &amp; Technique</category>
        <category>debian</category><category>firefox</category><category>linux</category>    
    <description>    &lt;p&gt;Un rapide billet pour indiquer à ceux qui comme moi veulent utiliser une version 64 bits de Firefox sans devoir utiliser les compilations nocturnes que des releases 64 bits sont disponibles sur le ftp de mozilla :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://releases.mozilla.org/pub/mozilla.org/firefox/releases/4.0.1/linux-x86_64/fr/&quot;&gt;http://releases.mozilla.org/pub/mozilla.org/firefox/releases/4.0.1/linux-x86_64/fr/&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;En fait je me sers surtout de ce billet comme un pense-bête pour m'éviter quelques requêtes Google la prochaine fois que je voudrai réinstaller FF :)&lt;/p&gt;</description>
    
    
    
          <comments>http://www.fabienpoulard.info/post/2011/05/09/Firefox-4-en-64-bits#comment-form</comments>
      <wfw:comment>http://www.fabienpoulard.info/post/2011/05/09/Firefox-4-en-64-bits#comment-form</wfw:comment>
      <wfw:commentRss>http://www.fabienpoulard.info/feed/atom/comments/703</wfw:commentRss>
      </item>
    
  <item>
    <title>Rencontre OSM au Flesselles le 27 avril 2011 à 19h30</title>
    <link>http://www.fabienpoulard.info/post/2011/04/26/Rencontre-OSM-au-Flesselles-le-27-avril-2011-%C3%A0-19h30</link>
    <guid isPermaLink="false">urn:md5:79a4a872fc7cc7a92774b606a9388d3d</guid>
    <pubDate>Tue, 26 Apr 2011 15:19:00 +0200</pubDate>
    <dc:creator>Fabien Poulard</dc:creator>
        <category>Geek &amp; Technique</category>
        <category>irl</category><category>La Cantine</category><category>openstreetmap</category>    
    <description>    &lt;h2&gt;Quoi ?&lt;/h2&gt;


&lt;p&gt;Une rencontre informelle entre &lt;a href=&quot;http://wiki.openstreetmap.org/wiki/Category:Users_in_France&quot;&gt;contributeurs OpenStreetMap&lt;/a&gt; ouverte à tout le monde. L'objectif plus particulier de cette rencontre est de discuter de l'organisation d'un atelier OpenStreetMap à &lt;a href=&quot;http://cantine-nantes.org/&quot; hreflang=&quot;fr&quot;&gt;la Cantine&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Que vous soyez contributeur, utilisateur ou simple curieux, vous êtes les bienvenus.&lt;/p&gt;


&lt;h2&gt;Quand ?&lt;/h2&gt;


&lt;p&gt;Le mercredi 27 avril 2011 à partir de 19h30.&lt;/p&gt;


&lt;h2&gt;Où ?&lt;/h2&gt;


&lt;p&gt;Au café &lt;em&gt;Le Flesselles&lt;/em&gt; à Nantes (&lt;a href=&quot;http://www.openstreetmap.org/?mlat=47.214305&amp;amp;mlon=-1.554669&amp;amp;zoom=18&amp;amp;layers=M&quot;&gt;carte&lt;/a&gt;)&lt;/p&gt;</description>
    
    
    
          <comments>http://www.fabienpoulard.info/post/2011/04/26/Rencontre-OSM-au-Flesselles-le-27-avril-2011-%C3%A0-19h30#comment-form</comments>
      <wfw:comment>http://www.fabienpoulard.info/post/2011/04/26/Rencontre-OSM-au-Flesselles-le-27-avril-2011-%C3%A0-19h30#comment-form</wfw:comment>
      <wfw:commentRss>http://www.fabienpoulard.info/feed/atom/comments/699</wfw:commentRss>
      </item>
    
  <item>
    <title>Présentation aux Rendez-vous de la recherche à la Cantine de Nantes</title>
    <link>http://www.fabienpoulard.info/post/2011/04/05/Pr%C3%A9sentation-aux-Rendez-vous-de-la-recherche-%C3%A0-la-Cantine-de-Nantes</link>
    <guid isPermaLink="false">urn:md5:54af4ccfb8f9e0e1f0c546f437c5cf59</guid>
    <pubDate>Tue, 05 Apr 2011 20:45:00 +0200</pubDate>
    <dc:creator>Fabien Poulard</dc:creator>
        <category>Sciences &amp; Recherche</category>
        <category>La Cantine</category><category>présentation</category><category>RdvR</category><category>recherche</category>    
    <description>    &lt;p&gt;Aujourd'hui, J'ai joué le jeu des &lt;em&gt;Rendez-vous de la Recherche&lt;/em&gt; (RdvR pour les intimes) à &lt;a href=&quot;http://cantine-nantes.org/&quot;&gt;La Cantine de Nantes&lt;/a&gt;. J'y ai présenté mon parcours de jeune chercheur, mon équipe et mon domaine de recherche : le &lt;a href=&quot;http://www.atala.org/&quot; hreflang=&quot;fr&quot;&gt;Traitement Automatique des Langues&lt;/a&gt; (TAL).&lt;/p&gt;


&lt;p&gt;Les &lt;em&gt;Rendez-vous de la Recherche&lt;/em&gt; sont organisés par &lt;a href=&quot;http://www.linkedin.com/in/jeanbezivin&quot; hreflang=&quot;en&quot;&gt;Jean Bézivin&lt;/a&gt; et &lt;a href=&quot;http://www.univ-nantes.fr/guedon-jp/0/fiche___annuaireksup/&quot; hreflang=&quot;fr&quot;&gt;Jean-Pierre Guédon&lt;/a&gt;, L'objectif de ces présentations informelles est de faire se rencontrer le monde de la recherche et de l'industrie. Le chercheur présente ses travaux, son équipe et son domaine. Les industriels piochent dans le flot d'information les éléments qui pourraient permettre de résoudre certaines de leurs problématiques et échangent sur ce sujet avec le chercheur. Ceci peut déboucher sur des collaborations, des initiatives...&lt;/p&gt;


&lt;p&gt;Le support de ma présentation est disponible sur &lt;a href=&quot;http://www.scribd.com/doc/52351094/&quot; hreflang=&quot;fr&quot;&gt;scribd&lt;/a&gt;.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.fabienpoulard.info/post/2011/04/05/Pr%C3%A9sentation-aux-Rendez-vous-de-la-recherche-%C3%A0-la-Cantine-de-Nantes#comment-form</comments>
      <wfw:comment>http://www.fabienpoulard.info/post/2011/04/05/Pr%C3%A9sentation-aux-Rendez-vous-de-la-recherche-%C3%A0-la-Cantine-de-Nantes#comment-form</wfw:comment>
      <wfw:commentRss>http://www.fabienpoulard.info/feed/atom/comments/695</wfw:commentRss>
      </item>
    
  <item>
    <title>Je soutiens ma thèse !</title>
    <link>http://www.fabienpoulard.info/post/2011/03/17/Je-soutiens-ma-th%C3%A8se-%21</link>
    <guid isPermaLink="false">urn:md5:9e3868813b901d134f138c1668b78a1c</guid>
    <pubDate>Thu, 17 Mar 2011 17:00:00 +0100</pubDate>
    <dc:creator>Fabien Poulard</dc:creator>
        <category>Sciences &amp; Recherche</category>
        <category>these</category>    
    <description>&lt;p&gt;Je soutiendrai ma thèse le &lt;strong&gt;Jeudi 24 mars 2011 à 9h30&lt;/strong&gt; dans la &lt;a href=&quot;http://www.openstreetmap.org/?mlat=47.237051&amp;amp;mlon=-1.552404&amp;amp;zoom=18&amp;amp;layers=M&quot;&gt;salle 3 du LINA&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Non seulement la séance est publique, mais de plus vous êtes tous cordialement invité à y assister. Le contenu est détaillé dans la suite du billet.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Titre de la thèse :&lt;/strong&gt; Détection de dérivation de texte&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Mots-clés :&lt;/strong&gt; détection de dérivation, révisions, plagiat, approche par signature, mesures de similarité, recherche d'information&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Résumé de la thèse :&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;L'Internet permet la production et la diffusion de contenu sans effort et à grande vitesse. Cela pose la question du contrôle de leur origine. Ce travail s'intéresse à la détection des liens de dérivation entre des textes. Un lien de dérivation unit un texte dérivé et les textes préexistants à partir desquels il a été écrit. Nous nous sommes concentré sur la tâche d'identification des textes dérivés étant donné un texte source, et ce pour différentes formes de dérivation. Notre première contribution consiste en la définition d'un cadre théorique posant les concepts de la dérivation ainsi qu'un modèle mulitidimensionnel cadrant les différentes formes de dérivation. Nous avons ensuite mis en place un cadre expérimental constitué d'une infrastructure logicielle libre, de corpus d'évaluation et d'un protocole expérimental inspiré de la RI. Les corpus Piithie et Wikinews que nous avons développé sont à notre connaissance les seuls corpus en français pour la détection de dérivation. Finalement, nous avons exploré différentes méthodes de détection fondées sur l'approche par signature. Nous avons notamment introduit les notions de singularité et d'invariance afin de guider le choix des descripteurs utilisés pour la modélisation des textes en vue de leur comparaison.
Nos résultats montrent que le choix motivé des descripteurs, linguistiques notamment, permet de réduire la taille de la modélisation des textes, et par conséquence des coûts de la méthode, tout en offrant des performances comparables à l'approche état de l'art beaucoup plus volumineuse.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Jury de la thèse :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.limsi.fr/Individu/yvon/mysite/mysite.php&quot;&gt;M. François Yvon&lt;/a&gt;, Professeur à l'Université de Paris Sud 11 (rapporteur)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.univ-avignon.fr/en/research/annuaire-chercheurs/membrestruc/personnel/bellot-patrice.html&quot;&gt;M. Patrice Bellot&lt;/a&gt;, Maître de conférences à l'Université d'Avignon (rapporteur)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.irit.fr/~Josiane.Mothe/&quot;&gt;Mme Josiane Mothe&lt;/a&gt;, Professeur à l'Institut Universitaire de Formation des Maître de Toulouse (examinateur)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.syllabs.com/perso/loupy/cv/&quot;&gt;M. Claude de Loupy&lt;/a&gt;, Dirigeant et co-fondateur de Syllabs (invité)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.bdaille.fr/&quot;&gt;Mme Béatrice Daille&lt;/a&gt;, Professeur à l'Université de Nantes (directrice de thèse)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://e.nicolas.hernandez.free.fr/&quot;&gt;M. Nicolas Hernandez&lt;/a&gt;, Maître de conférences à l'Université de Nantes (encadrant)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Publications :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Poulard, F., N. Hernandez and B. Daille. 2011, &lt;em&gt;Detecting derivatives using specific and invariant descriptors&lt;/em&gt;, Proceedings of the 12th International Conference on Computational Linguistics and Intelligent Text Processing (CICLing 2011), Tokyo, Japan.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Hernandez, N., F. Poulard, M. Vernier and J. Rocheteau. 2010, &lt;em&gt;Building a French-speaking community around UIMA, gathering research, education and industrial partners, mainly in Natural Language Processing and Speech Recognizing domains&lt;/em&gt;, Workshop Abstracts LREC 2010 Workshop 'New Challenges for NLP Frameworks', La Valleta Malte, p.64. &lt;a href=&quot;http://hal.archives-ouvertes.fr/hal-00481459/en/&quot;&gt;http://hal.archives-ouvertes.fr/hal-00481459/en/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Poulard, F., N. Hernandez, S. D. Afantenos and B. Daille. 2010, &lt;em&gt;Evaluation de descripteurs statistiques et linguistiques pour la détection de dérivation de texte&lt;/em&gt;, Document numérique, 13, 3/2010, p.69-93. &lt;a href=&quot;http://hal.archives-ouvertes.fr/hal-00554351/en/&quot;&gt;http://hal.archives-ouvertes.fr/hal-00554351/en/&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Dejean, C., M. Fortun, C. Massot, V. Pottier, F. Poulard and M. Vernier. 2010, &lt;em&gt;Un  étiqueteur de rôles grammaticaux libre pour le français intégré à Apache UIMA&lt;/em&gt;, Actes de la 17e Conférence sur le Traitement Automatique des Langues Naturelles 17e Conférence sur le Traitement Automatique des Langues Naturelles, Montréal, Canada. &lt;a href=&quot;http://hal.archives-ouvertes.fr/hal-00493847/en/&quot;&gt;http://hal.archives-ouvertes.fr/hal-00493847/en/&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Poulard, F., S. D. Afantenos and N. Hernandez. 2009, &lt;em&gt;Nouvelles considérations pour la détection de réutilisation de texte&lt;/em&gt;, Actes de la 16ème conférence sur le Traitement Automatique des Langues Naturelles, Senlis France, p.67. &lt;a href=&quot;http://hal.archives-ouvertes.fr/hal-00401072/en/&quot;&gt;http://hal.archives-ouvertes.fr/hal-00401072/en/&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Hernandez, N., F. Poulard, S. Afantenos, M. Vernier J.  Rocheteau.  2009, &lt;em&gt;Apache UIMA pour le Traitement Automatique des Langues&lt;/em&gt;, 16ème conférence sur le Traitement Automatique des Langues Naturelles (TALN'09) - Session Démonstration. &lt;a href=&quot;http://hal.archives-ouvertes.fr/hal-00423728/en/&quot;&gt;http://hal.archives-ouvertes.fr/hal-00423728/en/&lt;/a&gt;,&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Poulard, F., T. Waszak, N. Hernandez and P. Bellot. 2008, &lt;em&gt;Repérage de citations, classification des styles de discours rapporté et identification des constituants citationnels en écrits journalistiques&lt;/em&gt;, Actes de la 15e Conférence sur le Traitement Automatique des Langues Naturelles Traitement Automatique des Langues Naturelles, Avignon, France, p.450-459. &lt;a href=&quot;http://hal.archives-ouvertes.fr/hal-00401011/en/&quot;&gt;http://hal.archives-ouvertes.fr/hal-00401011/en/&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Poulard, F. 2008, &lt;em&gt;Analyse quantitative et qualitative de citations extraites d'un corpus journalistique&lt;/em&gt;, Actes de la 12e édition de RECITAL Rencontre des Etudiants-Chercheurs en Informatique et en Traitement Automatique des Langues (RÉCITAL), Avignon France, p.101-110. &lt;a href=&quot;http://hal.archives-ouvertes.fr/hal-00401001/en/&quot;&gt;http://hal.archives-ouvertes.fr/hal-00401001/en/&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
          <comments>http://www.fabienpoulard.info/post/2011/03/17/Je-soutiens-ma-th%C3%A8se-%21#comment-form</comments>
      <wfw:comment>http://www.fabienpoulard.info/post/2011/03/17/Je-soutiens-ma-th%C3%A8se-%21#comment-form</wfw:comment>
      <wfw:commentRss>http://www.fabienpoulard.info/feed/atom/comments/693</wfw:commentRss>
      </item>
    
  <item>
    <title>I'm going to defend my PhD thesis !</title>
    <link>http://www.fabienpoulard.info/post/2011/03/17/I-m-going-to-defend-my-PhD-thesis-%21</link>
    <guid isPermaLink="false">urn:md5:0480ab16cc46307fdbeb367922108362</guid>
    <pubDate>Thu, 17 Mar 2011 16:30:00 +0100</pubDate>
    <dc:creator>Fabien Poulard</dc:creator>
        <category>Sciences &amp; Recherche</category>
        <category>these</category>    
    <description>&lt;p&gt;I will defend my PhD thesis on &lt;strong&gt;March, 24th 2011 at 9:30 am&lt;/strong&gt; in &lt;a href=&quot;http://www.openstreetmap.org/?mlat=47.237051&amp;amp;mlon=-1.552404&amp;amp;zoom=18&amp;amp;layers=M&quot;&gt;room 3 of LINA&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Not only is the defense public, but you are welcome to attend. The thesis content is detailed in the rest of this bill.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Title:&lt;/strong&gt; Detecting textual derivatives&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Keywords:&lt;/strong&gt; detection of derivation, revisions, plagiarism, signature approach, similarity metrics, information retrieval&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Abstract:&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Thanks to the Internet, the production and publication of content is possible with ease and speed. This possibility raises the issue of controling the origins of this content. This work focuses on detecting derivation links between texts. A derivation link associates a derivative text and the pre-existing texts from which it was written. We focused on the task of identifying derivative texts given a source text for various forms of derivation. Our first contribution is the definition of a theoretical framework defines the concept of derivation as well as a model framing the different forms of derivation. Then, we set up an experimental framework consisting of free software tools, evaluation corpora and evaluation metrics based on IR. The Piithie and Wikinews corpora we have developed are to our knowledge the only ones in French for the detection of derivation links. Finally, we explored different methods of detection based on the signature-based approach. In particular, we have introduced the notions of specificity and invariance to guide the choice of descriptors used to modelize the texts in the expectation of their comparison. Our results show that the choice of motivated descriptors, including linguistically motivated ones, can reduce the size of the modelization of texts, and therefore the cost of the method, while offering performances comparable to the much more voluminous state of the art approach.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Thesis jury:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.limsi.fr/Individu/yvon/mysite/mysite.php&quot;&gt;M. François Yvon&lt;/a&gt;, Professor at Université de Paris Sud 11 (rapporteur)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.univ-avignon.fr/en/research/annuaire-chercheurs/membrestruc/personnel/bellot-patrice.html&quot;&gt;M. Patrice Bellot&lt;/a&gt;, Assistant professor at Université d'Avignon (rapporteur)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.irit.fr/~Josiane.Mothe/&quot;&gt;Mme Josiane Mothe&lt;/a&gt;, Professor at Institut Universitaire de Formation des Maître de Toulouse (examiner)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.syllabs.com/perso/loupy/cv/&quot;&gt;M. Claude de Loupy&lt;/a&gt;, Director and co-founder of Syllabs (guest)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.bdaille.fr/&quot;&gt;Mme Béatrice Daille&lt;/a&gt;, Professor at Université de Nantes (director)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://e.nicolas.hernandez.free.fr/&quot;&gt;M. Nicolas Hernandez&lt;/a&gt;, Assistant professor at Université de Nantes (supervisor)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Publications:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Poulard, F., N. Hernandez and B. Daille. 2011, &lt;em&gt;Detecting derivatives using specific and invariant descriptors&lt;/em&gt;, Proceedings of the 12th International Conference on Computational Linguistics and Intelligent Text Processing (CICLing 2011), Tokyo, Japan.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Hernandez, N., F. Poulard, M. Vernier and J. Rocheteau. 2010, &lt;em&gt;Building a French-speaking community around UIMA, gathering research, education and industrial partners, mainly in Natural Language Processing and Speech Recognizing domains&lt;/em&gt;, Workshop Abstracts LREC 2010 Workshop 'New Challenges for NLP Frameworks', La Valleta Malte, p.64. &lt;a href=&quot;http://hal.archives-ouvertes.fr/hal-00481459/en/&quot;&gt;http://hal.archives-ouvertes.fr/hal-00481459/en/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Poulard, F., N. Hernandez, S. D. Afantenos and B. Daille. 2010, &lt;em&gt;Evaluation de descripteurs statistiques et linguistiques pour la détection de dérivation de texte&lt;/em&gt;, Document numérique, 13, 3/2010, p.69-93. &lt;a href=&quot;http://hal.archives-ouvertes.fr/hal-00554351/en/&quot;&gt;http://hal.archives-ouvertes.fr/hal-00554351/en/&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Dejean, C., M. Fortun, C. Massot, V. Pottier, F. Poulard and M. Vernier. 2010, &lt;em&gt;Un  étiqueteur de rôles grammaticaux libre pour le français intégré à Apache UIMA&lt;/em&gt;, Actes de la 17e Conférence sur le Traitement Automatique des Langues Naturelles 17e Conférence sur le Traitement Automatique des Langues Naturelles, Montréal, Canada. &lt;a href=&quot;http://hal.archives-ouvertes.fr/hal-00493847/en/&quot;&gt;http://hal.archives-ouvertes.fr/hal-00493847/en/&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Poulard, F., S. D. Afantenos and N. Hernandez. 2009, &lt;em&gt;Nouvelles considérations pour la détection de réutilisation de texte&lt;/em&gt;, Actes de la 16ème conférence sur le Traitement Automatique des Langues Naturelles, Senlis France, p.67. &lt;a href=&quot;http://hal.archives-ouvertes.fr/hal-00401072/en/&quot;&gt;http://hal.archives-ouvertes.fr/hal-00401072/en/&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Hernandez, N., F. Poulard, S. Afantenos, M. Vernier J.  Rocheteau.  2009, &lt;em&gt;Apache UIMA pour le Traitement Automatique des Langues&lt;/em&gt;, 16ème conférence sur le Traitement Automatique des Langues Naturelles (TALN'09) - Session Démonstration. &lt;a href=&quot;http://hal.archives-ouvertes.fr/hal-00423728/en/&quot;&gt;http://hal.archives-ouvertes.fr/hal-00423728/en/&lt;/a&gt;,&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Poulard, F., T. Waszak, N. Hernandez and P. Bellot. 2008, &lt;em&gt;Repérage de citations, classification des styles de discours rapporté et identification des constituants citationnels en écrits journalistiques&lt;/em&gt;, Actes de la 15e Conférence sur le Traitement Automatique des Langues Naturelles Traitement Automatique des Langues Naturelles, Avignon, France, p.450-459. &lt;a href=&quot;http://hal.archives-ouvertes.fr/hal-00401011/en/&quot;&gt;http://hal.archives-ouvertes.fr/hal-00401011/en/&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Poulard, F. 2008, &lt;em&gt;Analyse quantitative et qualitative de citations extraites d'un corpus journalistique&lt;/em&gt;, Actes de la 12e édition de RECITAL Rencontre des Etudiants-Chercheurs en Informatique et en Traitement Automatique des Langues (RÉCITAL), Avignon France, p.101-110. &lt;a href=&quot;http://hal.archives-ouvertes.fr/hal-00401001/en/&quot;&gt;http://hal.archives-ouvertes.fr/hal-00401001/en/&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
          <comments>http://www.fabienpoulard.info/post/2011/03/17/I-m-going-to-defend-my-PhD-thesis-%21#comment-form</comments>
      <wfw:comment>http://www.fabienpoulard.info/post/2011/03/17/I-m-going-to-defend-my-PhD-thesis-%21#comment-form</wfw:comment>
      <wfw:commentRss>http://www.fabienpoulard.info/feed/atom/comments/694</wfw:commentRss>
      </item>
    
  <item>
    <title>Visualiser un espace à plusieurs dimensions en 3D</title>
    <link>http://www.fabienpoulard.info/post/2011/03/17/Visualiser-un-espace-%C3%A0-plusieurs-dimensions-en-3D</link>
    <guid isPermaLink="false">urn:md5:24221b5107df633791515dec0e00c854</guid>
    <pubDate>Thu, 17 Mar 2011 00:03:00 +0100</pubDate>
    <dc:creator>Fabien Poulard</dc:creator>
        <category>Sciences &amp; Recherche</category>
        <category>clustering</category><category>matplotlib</category><category>nlp</category><category>python</category><category>scikit-learn</category>    
    <description>&lt;p&gt;L'&lt;a href=&quot;http://fr.wikipedia.org/wiki/Analyse_en_composantes_principales&quot; hreflang=&quot;fr&quot;&gt;analyse en composantes principales&lt;/a&gt; (ACP) permet de calculer les hyperplans d'un espace vectoriel tel qu'une projection sur ces plans conserve un maximum d'entropie. Cette approche permet entre autres choses de projeter des espaces ayant un très grand nombre de dimensions dans des espaces de dimensions réduites tout en limitant la perte d'information.&lt;/p&gt;


&lt;p&gt;L'utilisation combinée de &lt;a href=&quot;http://scikit-learn.sourceforge.net/&quot; hreflang=&quot;en&quot;&gt;scikit-learn&lt;/a&gt; et de &lt;a href=&quot;http://matplotlib.sourceforge.net/&quot; hreflang=&quot;en&quot;&gt;matplotlib&lt;/a&gt; permet de produire très rapidement des réductions de dimension et de les visualiser. J'utilise ces bibliothèques pour visualiser dans un espace à 2 ou 3 dimensions des espaces vectoriels correspondant à des représentations de documents à l'aide de traits particuliers.&lt;/p&gt;    &lt;p&gt;Je travaille actuellement sur le &lt;a href=&quot;http://www.ttc-project.eu/&quot; hreflang=&quot;en&quot;&gt;projet TTC&lt;/a&gt; au sein de mon équipe. Je suis chargé de développer un classifieur de pages Web selon leurs intentions de communication. S'il existe bon nombre de travaux sur la classification des documents Web, dans notre cas nous cherchons une approche indépendante de la langue. Nous travaillons en effet sur sept langues différentes plus ou moins éloignées (français, anglais, allemand, espagnol, letton, russe et chinois). Voilà le contexte et le problème posé.&lt;/p&gt;


&lt;p&gt;J'explore un certain nombre de traits qui pourraient s'avérer pertinent pour ladite tâche (URL, structure HTML, n-grammes caractères...). Il est cependant compliqué d'évaluer qualitativement si les traits retenus permettent de différencier les &amp;quot;intentions de communication&amp;quot; auxquelles nous nous intéressons. Une manière très subjective, mais également très efficace, de mesurer cette capacité est de visualiser les clusters formés par les documents dans l'espace vectoriel défini par nos traits. Chaque document est représenté par un vecteur des valeurs correspondant aux différents traits sélectionnés. Ces traits sont cependant très nombreux et l'espace vectoriel correspondant ne peut pas être directement représenté sous forme graphique.&lt;/p&gt;


&lt;p&gt;Afin d'aisément visualiser les documents dans ces espaces vectoriels j'effectue une projection sur seulement trois dimensions et je visualise le résultat sous forme d'un graphique de type &lt;a href=&quot;http://fr.wikipedia.org/wiki/Nuage_de_points&quot; hreflang=&quot;en&quot;&gt;&amp;quot;nuage de points&amp;quot;&lt;/a&gt;. Les trois combinaisons sont en réalité des combinaisons algébriques de l'ensemble des dimensions de mon espace vectoriel obtenues par une &lt;a href=&quot;http://fr.wikipedia.org/wiki/Analyse_en_composantes_principales&quot; hreflang=&quot;fr&quot;&gt;approche en composantes principales&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Il est assez aisé de mettre en œuvre une telle approche avec &lt;a href=&quot;http://scikit-learn.sourceforge.net/&quot; hreflang=&quot;en&quot;&gt;scikit-learn&lt;/a&gt; :&lt;/p&gt;

&lt;pre class=&quot;python python&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# Importation de l'approche par composantes principales&lt;/span&gt;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;from&lt;/span&gt; scikits.&lt;span style=&quot;color: black;&quot;&gt;learn&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;pca&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; PCA
 
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# On utilise un ensemble de données exemple classique : Iris&lt;/span&gt;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;from&lt;/span&gt; scikits.&lt;span style=&quot;color: black;&quot;&gt;learn&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; datasets
iris = datasets.&lt;span style=&quot;color: black;&quot;&gt;load_iris&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
 
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# Préparation de la méthode PCA pour une projection sur 3 dimensions&lt;/span&gt;
pca = PCA&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;n_components=&lt;span style=&quot;color: #ff4500;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# Calcul de la projection à partir des données exemples&lt;/span&gt;
pca.&lt;span style=&quot;color: black;&quot;&gt;fit&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;iris.&lt;span style=&quot;color: black;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# Application de la projection aux données&lt;/span&gt;
newdata = pca.&lt;span style=&quot;color: black;&quot;&gt;transform&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;iris.&lt;span style=&quot;color: black;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;La variable &lt;em&gt;newdata&lt;/em&gt; contient alors une projection de nos données sur le nouvel espace vectoriel en 3 dimensions. Je peux ainsi visualiser les documents dans ce nouvel espace en utilisant &lt;em&gt;Pylab&lt;/em&gt; issue de &lt;a href=&quot;http://matplotlib.sourceforge.net/&quot; hreflang=&quot;en&quot;&gt;matplotlib&lt;/a&gt; :&lt;/p&gt;

&lt;pre class=&quot;python python&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# Utilisation de Pylab et de mplot3d intégré à matplotlib&lt;/span&gt;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; pylab &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;as&lt;/span&gt; pl
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; mpl_toolkits.&lt;span style=&quot;color: black;&quot;&gt;mplot3d&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;axes3d&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;as&lt;/span&gt; p3
 
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# Création de la figure dans laquelle nous allons représenté notre nuage de points&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# qui sera composée de 3 dimensions (Axes3D)&lt;/span&gt;
fig=pl.&lt;span style=&quot;color: black;&quot;&gt;figure&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
ax = p3.&lt;span style=&quot;color: black;&quot;&gt;Axes3D&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;fig&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# Les données Iris se répartissent entre 3 classes (0, 1 et 2), nous allons coloré chacune de&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# ces classes différemment afin de les visualiser&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# Nous utilisons également le nom réel (iris.target_names) des classes dans la légende&lt;/span&gt;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; color, classe, nom_classe &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;zip&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;rgb&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #ff4500;&quot;&gt;0&lt;/span&gt;, &lt;span style=&quot;color: #ff4500;&quot;&gt;1&lt;/span&gt;, &lt;span style=&quot;color: #ff4500;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;, iris.&lt;span style=&quot;color: black;&quot;&gt;target_names&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;:
	&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# newdata[iris.target==classe,0] permet de récupérer la première colonne (0) de la &lt;/span&gt;
	&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# sous-matrice correspondant aux instances de la classe &amp;quot;classe&amp;quot;&lt;/span&gt;
	ax.&lt;span style=&quot;color: black;&quot;&gt;scatter3D&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;newdata&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;iris.&lt;span style=&quot;color: black;&quot;&gt;target&lt;/span&gt;==classe,&lt;span style=&quot;color: #ff4500;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;, 
	  newdata&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;iris.&lt;span style=&quot;color: black;&quot;&gt;target&lt;/span&gt;==classe,&lt;span style=&quot;color: #ff4500;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;, newdata&lt;span style=&quot;color: black;&quot;&gt;[&lt;/span&gt;iris.&lt;span style=&quot;color: black;&quot;&gt;target&lt;/span&gt;==classe,&lt;span style=&quot;color: #ff4500;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;]&lt;/span&gt;, 
	  c=color, label=nom_classe&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# On ajoute les données à la figure et on dessine le tout&lt;/span&gt;
fig.&lt;span style=&quot;color: black;&quot;&gt;add_axes&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;ax&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;
pl.&lt;span style=&quot;color: black;&quot;&gt;show&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Et voici le résultat :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.fabienpoulard.info/public/Python/iris-pca-3d.png&quot; title=&quot;Projection 3D des instances de la base iris&quot;&gt;&lt;img src=&quot;http://www.fabienpoulard.info/public/Python/.iris-pca-3d_m.jpg&quot; alt=&quot;Projection 3D des instances de la base iris&quot; style=&quot;float:left; margin: 0 1em 1em 0;&quot; title=&quot;Projection 3D des instances de la base iris, mar. 2011&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;La projection en 3D permet très facilement (et très subjectivement) d'identifier les trois clusters correspondant aux trois classes et d'ainsi valider les traits retenus pour représenter les instances.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.fabienpoulard.info/post/2011/03/17/Visualiser-un-espace-%C3%A0-plusieurs-dimensions-en-3D#comment-form</comments>
      <wfw:comment>http://www.fabienpoulard.info/post/2011/03/17/Visualiser-un-espace-%C3%A0-plusieurs-dimensions-en-3D#comment-form</wfw:comment>
      <wfw:commentRss>http://www.fabienpoulard.info/feed/atom/comments/692</wfw:commentRss>
      </item>
    
  <item>
    <title>Présentation OpenStreetMap à la médiathèque de Rezé</title>
    <link>http://www.fabienpoulard.info/post/2011/02/06/Pr%C3%A9sentation-OpenStreetMap-%C3%A0-la-m%C3%A9diath%C3%A8que-de-Rez%C3%A9</link>
    <guid isPermaLink="false">urn:md5:8bcf9b2f8fc6eefe19df71a8b69f1b40</guid>
    <pubDate>Sun, 06 Feb 2011 01:25:00 +0100</pubDate>
    <dc:creator>Fabien Poulard</dc:creator>
        <category>Geek &amp; Technique</category>
        <category>nantes</category><category>openstreetmap</category>    
    <description>    &lt;p&gt;Ce samedi 6 Février, j'ai rapidement (2h tout de même) présenté &lt;a href=&quot;http://www.openstreetmap.org&quot;&gt;OpenStreetMap&lt;/a&gt; dans le cadre des &lt;em&gt;&lt;a href=&quot;http://www.bibliotheque.mairie-reze.fr/opacwebaloes/index.aspx?idpage=268#samedi&quot;&gt;Samedi du Net&lt;/a&gt;&lt;/em&gt; à la &lt;a href=&quot;http://www.openstreetmap.org/?mlat=47.18376&amp;amp;mlon=-1.56268&amp;amp;zoom=16&amp;amp;layers=M&quot;&gt;médiathèque de Rezé&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Si d'autres personnes sont intéressées pour réaliser le même genre de présentation (il faut évangéliser au maximum ^^), je tiens les supports à disposition sous &lt;a href=&quot;http://creativecommons.org/licenses/by-sa/2.0/fr/&quot; hreflang=&quot;fr&quot;&gt;licence CC-by-sa&lt;/a&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.scribd.com/doc/52277248/Internet-et-la-geomatique-l-autre-revolution&quot;&gt;Supports disponibles sur Scribd&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.fabienpoulard.info/download/opendata/openstreetmap/osm-presentation-20110205/presentation-osm.pdf&quot;&gt;Supports au format PDF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.fabienpoulard.info/download/opendata/openstreetmap/osm-presentation-20110205/presentation-osm-src.tar.gz&quot;&gt;Sources LaTeX de la présentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
          <comments>http://www.fabienpoulard.info/post/2011/02/06/Pr%C3%A9sentation-OpenStreetMap-%C3%A0-la-m%C3%A9diath%C3%A8que-de-Rez%C3%A9#comment-form</comments>
      <wfw:comment>http://www.fabienpoulard.info/post/2011/02/06/Pr%C3%A9sentation-OpenStreetMap-%C3%A0-la-m%C3%A9diath%C3%A8que-de-Rez%C3%A9#comment-form</wfw:comment>
      <wfw:commentRss>http://www.fabienpoulard.info/feed/atom/comments/687</wfw:commentRss>
      </item>
    
  <item>
    <title>Nantes passe à l'OpenData</title>
    <link>http://www.fabienpoulard.info/post/2011/02/03/Nantes-passe-%C3%A0-l-OpenData</link>
    <guid isPermaLink="false">urn:md5:70cd4047d0545693c050f06cb1d088d3</guid>
    <pubDate>Thu, 03 Feb 2011 23:04:00 +0100</pubDate>
    <dc:creator>Fabien Poulard</dc:creator>
        <category>Geek &amp; Technique</category>
        <category>nantes</category><category>opendata</category>    
    <description>&lt;p&gt;C'est du tout frais — même si on l'attendait plus ou moins depuis quelques jours — &lt;a href=&quot;http://jmayrault.fr/&quot; hreflang=&quot;fr&quot;&gt;Jean-Marc Ayrault&lt;/a&gt; a profité de l'inauguration de &lt;a href=&quot;http://cantine-nantes.org/&quot; hreflang=&quot;fr&quot;&gt;la Cantine Numérique à Nantes&lt;/a&gt; pour annoncer que la ville de Nantes &lt;a href=&quot;http://twitpic.com/3w5281&quot; hreflang=&quot;fr&quot;&gt;se lançait dans la libération de ses données&lt;/a&gt; et rejoignait par conséquent &lt;a href=&quot;http://libertic.wordpress.com/&quot; hreflang=&quot;fr&quot;&gt;le mouvement OpenData&lt;/a&gt;.&lt;/p&gt;    &lt;p&gt;&lt;a href=&quot;http://www.data.rennes-metropole.fr/&quot; hreflang=&quot;fr&quot;&gt;Rennes&lt;/a&gt; avait lancé le bal il y a presque un an, en mars 2010, &lt;a href=&quot;http://opendata.paris.fr/opendata/jsp/site/Portal.jsp?page_id=5&quot; hreflang=&quot;fr&quot;&gt;Paris&lt;/a&gt; lui a récemment emboîté le pas et maintenant c'est Nantes qui devient la troisième ville française à alimenter le mouvement de l'OpenData !&lt;/p&gt;


&lt;p&gt;Cette victoire est le fruit du travail notamment de &lt;a href=&quot;http://libertic.wordpress.com/&quot; hreflang=&quot;fr&quot;&gt;l'association LiberTic&lt;/a&gt; et fait suite aux &lt;a href=&quot;http://www.opendataday.org/wiki/Nantes&quot; hreflang=&quot;fr&quot;&gt;initiatives récentes&lt;/a&gt; autour de la libération de données sur Nantes.&lt;/p&gt;


&lt;p&gt;Pour ma part, j'ai récemment écrit &lt;a href=&quot;http://www.fabienpoulard.info/download/opendata/horaires-tan-nantes/extract-horaires-tan.py&quot;&gt;un script python&lt;/a&gt; permettant de récupérer &lt;a href=&quot;http://www.fabienpoulard.info/download/opendata/horaires-tan-nantes/&quot;&gt;les horaires de trams et bus&lt;/a&gt; et j'ai extrait de la base &lt;a href=&quot;http://www.fabienpoulard.info/tag/openstreetmap&quot;&gt;OpenStreetMap&lt;/a&gt; la &lt;a href=&quot;http://www.fabienpoulard.info/download/opendata/arrets-bus-nantes.json&quot;&gt;liste des arrêts ainsi que leurs coordonnées GPS&lt;/a&gt;. La démarche a surtout été expérimentale avec pour finalité la création, quand j'aurai le temps, d'une application mobile permettant de donner les horaires de passage des lignes les plus proches.&lt;/p&gt;


&lt;p&gt;Vous souhaitez vous impliquer dans le mouvement OpenData ?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Parcourez les sites officiels à la recherche de données et rendez-les informatiquement exploitables (scrapping) ;&lt;/li&gt;
&lt;li&gt;Rejoignez le mouvement &lt;a href=&quot;http://wiki.openstreetmap.org/wiki/Beginners'_guide&quot; hreflang=&quot;en&quot;&gt;OpenStreetMap&lt;/a&gt;, je donne d'ailleurs &lt;a href=&quot;http://bibliotheque.reze.fr/opacwebaloes/index.aspx?idpage=268#samedi&quot; hreflang=&quot;fr&quot;&gt;une présentation sur ce sujet le samedi 5 février 2011&lt;/a&gt; ;&lt;/li&gt;
&lt;li&gt;Si vous êtes enseignants, exploitez la masse de données disponible (&lt;a href=&quot;http://www.data.rennes-metropole.fr/&quot; hreflang=&quot;fr&quot;&gt;ici&lt;/a&gt;, &lt;a href=&quot;http://opendata.paris.fr/&quot; hreflang=&quot;fr&quot;&gt;là&lt;/a&gt;, &lt;a href=&quot;http://www.data-publica.com/&quot; hreflang=&quot;fr&quot;&gt;là&lt;/a&gt;, &lt;a href=&quot;http://www.data.gov/&quot; hreflang=&quot;en&quot;&gt;là&lt;/a&gt;, ou encore &lt;a href=&quot;http://www.data-publica.com/data_set_module/20110114-D6345F&quot; hreflang=&quot;fr&quot;&gt;là&lt;/a&gt;) pour faire travailler vos étudiants sur des données réelles... je pense notamment aux enseignants en informatique !&lt;/li&gt;
&lt;li&gt;Parlez du mouvement autour de vous (amis, famille, élus...) ;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Je me rends compte qu'il n'y a pratiquement pas de ressources francophones sur le sujet... il va falloir remédier à ça.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Mise à jour :&lt;/strong&gt; Un peu plus de détails sur l'annonce &lt;a href=&quot;http://libertic.wordpress.com/2011/02/07/nantesselancedanslopendata/&quot; hreflang=&quot;fr&quot;&gt;sur le site de Libertic&lt;/a&gt;.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.fabienpoulard.info/post/2011/02/03/Nantes-passe-%C3%A0-l-OpenData#comment-form</comments>
      <wfw:comment>http://www.fabienpoulard.info/post/2011/02/03/Nantes-passe-%C3%A0-l-OpenData#comment-form</wfw:comment>
      <wfw:commentRss>http://www.fabienpoulard.info/feed/atom/comments/686</wfw:commentRss>
      </item>
    
</channel>
</rss>
