tag:blogger.com,1999:blog-3188662577498903422024-02-08T10:38:34.553-08:00Nicolas HernandezBlognotes qui vient dynamiser <a href="http://e.nicolas.hernandez.free.fr">http://e.nicolas.hernandez.free.fr</a>Nicolas Hernandezhttp://www.blogger.com/profile/11685903401452574118noreply@blogger.comBlogger60125tag:blogger.com,1999:blog-318866257749890342.post-91653104157840903542014-02-11T23:51:00.001-08:002014-02-11T23:51:11.362-08:00Bonnes pratiques de développement (java)<ul>
<li>Package by feature, not layer <a href="http://www.javapractices.com/topic/TopicAction.do?Id=205">http://www.javapractices.com/topic/TopicAction.do?Id=205</a></li>
<li>Properly Package Your Java Classes <a href="http://www.techrepublic.com/article/properly-package-your-java-classes/">http://www.techrepublic.com/article/properly-package-your-java-classes/</a></li>
<li>Spring Architecture <a href="http://docs.spring.io/spring/docs/3.0.x/reference/overview.html">http://docs.spring.io/spring/docs/3.0.x/reference/overview.html</a> </li>
<li>Java Tutorial - Naming a Package <a href="http://docs.oracle.com/javase/tutorial/java/package/namingpkgs.html">http://docs.oracle.com/javase/tutorial/java/package/namingpkgs.html</a></li>
<li>SUN Naming Conventions <a href="http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-135099.html#367">http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-135099.html#367</a></li>
</ul>
Nicolas Hernandezhttp://www.blogger.com/profile/11685903401452574118noreply@blogger.com0tag:blogger.com,1999:blog-318866257749890342.post-47353450266997016802013-09-11T07:50:00.001-07:002013-09-11T07:50:43.126-07:00Installer Apache UIMA Java (environnement d'exécution et de développement)<div>
<span style="font-family: Arial, Helvetica, sans-serif;">Il existe 3 implémentations concurrentes d'UIMA</span><br />
<br />
<ul>
<li><span style="font-family: Arial, Helvetica, sans-serif;">UIMA Java (uimaj) (à préférer pour les débutants)</span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;">UIMA-AS (implémentation java à privilégier pour de l'asynchronous scaleout)</span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;">UIMA CPP (à préférer pour développer autrement qu'en Java)</span></li>
</ul>
<div>
<span style="font-family: Arial, Helvetica, sans-serif;">Les outils Eclipse ne sont pas indispensables mais facilitent une activité de développement.</span></div>
<br />
<h4>
<b><span style="font-family: Arial, Helvetica, sans-serif;">Installation le framework Apache UIMA Java et ses outils de développements</span></b></h4>
<ol>
<li><span style="font-family: Arial, Helvetica, sans-serif;"><b>Télécharger</b> une archive d'un binaire de "UIMA Java framework & SDK" dans la <a href="http://uima.apache.org/downloads.cgi#Latest Official Releases">section de téléchargement de UIMA</a> (contient le nécessaire pour exécuter et développer des composants, des workflows et des applications UIMA en java)</span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;"><b>Désarchiver</b> dans le répertoire d'installation de votre choix</span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;"><b>Fixer les variables d'environnement.</b> Pour cela je suis les consignes du fichier README présent dans l'archive.</span></li>
<ol>
<li><span style="font-family: Arial, Helvetica, sans-serif;">Set JAVA_HOME to the directory of your JRE installation you would like to use for UIMA.</span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;">Set UIMA_HOME to the apache-uima directory of your unpacked Apache UIMA distribution</span></li>
<ul>
<li><span style="font-size: xx-small;"><span style="font-family: Arial, Helvetica, sans-serif;">export UIMA_HOME=/my/applications/apache-uimaj</span></span></li>
</ul>
<li><span style="font-family: Arial, Helvetica, sans-serif;">Afin d'exécuter les outils UIMA en ligne de commande, ajouter UIMA_HOME/bin to your PATH </span></li>
<ul>
<li><span style="font-size: xx-small;"><span style="font-family: Arial, Helvetica, sans-serif;">export PATH=${UIMA_HOME}/bin:$PATH</span></span></li>
</ul>
<li><span style="font-family: Arial, Helvetica, sans-serif;">Facultatif : afin de faciliter la configuration ultérieure des exemples, ajuster les exemples à votre répertoire d'installation (via l'exécution du script <span style="font-size: xx-small;">UIMA_HOME/bin/adjustExamplePaths.sh</span>)</span></li>
</ol>
<li><span style="font-family: Arial, Helvetica, sans-serif;"><span style="color: #222222; font-size: 1em; line-height: 1.3em;"><span style="color: black; font-size: small; line-height: normal;">Facultatif :</span> </span><b style="color: #222222; font-size: 1em; line-height: 1.3em;">Un test d'installation </b>Afin de réaliser ce test consulter la page "<a href="http://enicolashernandez.blogspot.com/2009/12/comment-executer-des-chaines-de.html">Comment exécuter des chaînes de traitement avec UIMA </a>" notamment la section "Exécution d'une chaîne de traitement en ligne de commande".</span></li>
</ol>
<h4>
<span style="font-family: Arial, Helvetica, sans-serif;">Installer les outils Eclipse pour assister le développement (via plugins)</span></h4>
<div>
<span style="font-family: Arial, Helvetica, sans-serif;">Requiert une version d'<a href="http://www.eclipse.org/downloads/">Eclipse récupérée et désintallée</a></span></div>
<ol>
<li><span style="font-family: Arial, Helvetica, sans-serif;">Indiquer à Eclipse, le site où récupérer des plugins liés à UIMA </span></li>
<ul>
<li><span style="font-family: Arial, Helvetica, sans-serif;">Help > "Software updates | Install New software" > Add </span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;">Name : "Apache UIMA" ; URL http://www.apache.org/dist/uima/eclipse-update-site</span></li>
</ul>
<li><span style="font-family: Arial, Helvetica, sans-serif;">Indiquer lui ensuite le site avec lequel vous voulez travailler. Attendez quelques instants et le système vous proposera une liste proche de celle-ci</span></li>
<ul>
<li><span style="font-family: Arial, Helvetica, sans-serif;">Apache UIMA Eclipse tooling </span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;">Apache UIMA Ruta </span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;">Apache UIMA-AS (Asynchronous Scaleout) Eclipse tooling</span></li>
</ul>
<li><span style="font-family: Arial, Helvetica, sans-serif;">Cocher les plugins que vous voulez ajouter puis "Next". Certains peuvent ne pas vouloir s'installer. Les Eclipse tooling sont la priorité. UIMA-AS tooling seulement si vous voulez faire du AS. Ruta si vous savez que vous voulez faire du Ruta.</span></li>
<ul>
<li><span style="font-family: Arial, Helvetica, sans-serif;">Si vous rencontrez des problèmes : Commence une étape de résolution de dépendances, il est possible qu'il faille cocher plus de sites afin de permettre cette résolution, il est possible qu'il faille faire des install un à un des sites, et il est possible qu'il faille commencer par ceux natifs d'eclipse. Quelques refresh.</span></li>
</ul>
<li><span style="font-family: Arial, Helvetica, sans-serif;">Accept the licence</span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;">Il se peut qu'il vous signale que vous voulez installer un "Unsigned content", accepter...</span></li>
</ol>
<h4>
<span style="font-family: Arial, Helvetica, sans-serif;">Configurer son environnement au sein d'Eclipse</span></h4>
<br />
<ol>
<li><b><span style="font-family: Arial, Helvetica, sans-serif;">Définir la variable UIMA_HOME au sein d'Eclipse</span></b></li>
<ul>
<li><span style="font-family: Arial, Helvetica, sans-serif;">Cliquer onglet Window > Preferences > Java > Build Path > Classpath Variables > Faire New (Name: UIMA_HOME et Path: Folder... > vers "applications/apache-uima") > Ok > Ok > Yes (rebuild)</span></li>
</ul>
<li><b><span style="font-family: Arial, Helvetica, sans-serif;">Importer le répertoire de codes exemples UIMA_HOME/examples au sein d'Eclipse</span></b></li>
<ul>
<li><span style="font-family: Arial, Helvetica, sans-serif;">Cliquer onglet File > Import ; Sélectionner "General/Existing Project into Workspace" ; Cliquer "Next" ; Cliquer "Browse" et naviguer jusqu'au répertoire UIMA_HOME</span></li>
</ul>
<li><span style="font-family: Arial, Helvetica, sans-serif;">Facultatif : <b>Un test d'installation au sein d'Eclipse </b>Afin de réaliser ce test consulter la page "<a href="http://enicolashernandez.blogspot.com/2009/12/comment-executer-des-chaines-de.html">Comment exécuter des chaînes de traitement avec UIMA </a>" notamment la section "Exécuter une chaîne de traitement au sein d'Eclipse". </span></li>
</ol>
</div>
<div>
<h4>
<span style="font-family: Arial, Helvetica, sans-serif;"><b>Installer les composants et les outils tiers présents dans la sandbox d'UIMA</b> (addons et tools)</span></h4>
<br />
<ul>
<li><span style="font-family: Arial, Helvetica, sans-serif;">Si les binaires des tools et des addons ne sont pas proposés dans la <a href="http://uima.apache.org/downloads.cgi">section téléchargement</a>, récupérer et compiler les sources comme décrit dans la <a href="http://uima.apache.org/dev-quick.html">section "Checkout and Build an Addons (Sandbox) project"</a> </span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;"><a href="http://enicolashernandez.blogspot.com/2010/01/installer-les-uima-annotator-addons.html%20">L'<b>ajout des addons..</b>.</a> est décrit dans ce post.</span></li>
</ul>
</div>
<h4>
<b><span style="font-family: Arial, Helvetica, sans-serif;">Références</span></b></h4>
<br />
<ul>
<li><a href="http://uima.apache.org/doc-uima-examples.html"><span style="font-family: Arial, Helvetica, sans-serif;">Section "Install UIMA SDK"</span></a></li>
<li><a href="http://uima.apache.org/d/uimaj-2.4.2/overview_and_setup.html#ugr.ovv.eclipse_setup"><span style="font-family: Arial, Helvetica, sans-serif;">Section "Setting up the Eclipse IDE to work with UIMA"</span></a></li>
</ul>
<br />
<h4>
<b><span style="font-family: Arial, Helvetica, sans-serif;">Liens externes </span></b></h4>
<div>
<ul style="background-color: #fdfdfd; font-size: 13.142857551574707px;">
<li><span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"><a href="http://www.uima-fr.org/planet//index.php?post_id=57" rel="nofollow" style="color: #551a8b;" title="Lire l'article">Nicolas Hernandez : Installer l'implémentation Java d'Apache UIMA (uimaj)</a> (12/09) DEPRECATED</span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size: x-small;"><a href="http://www.uima-fr.org/planet//index.php?post_id=35" rel="nofollow" style="color: #551a8b;" title="Lire l'article">Jérôme Rocheteau : Installer UIMA</a></span><span style="font-size: x-small;"> </span><span style="font-size: x-small;">(09/09) </span><span style="font-size: x-small;"> DEPRECATED</span></span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size: x-small; text-decoration: underline;"><a href="http://www.uima-fr.org/planet//index.php?post_id=41" rel="nofollow" style="color: #551a8b; text-decoration: none;" title="Lire l'article">Laurent Audibert : Installation d'UIMA sous Linux (... Suite)</a></span><span style="font-size: x-small;"> </span><span style="font-size: x-small;">(</span><span style="font-size: x-small;">02/08) </span><span style="font-size: x-small;"> DEPRECATED</span></span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;"><a href="http://www.uima-fr.org/planet//index.php?post_id=42" rel="nofollow" style="color: #551a8b; font-size: small; text-decoration: none;" title="Lire l'article">Laurent Audibert : Installation complète de l'environnement de développement UIMA sous Linux</a><span style="font-size: x-small;"> (02/08)</span><span style="font-size: x-small;"> DEPRECATED</span></span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size: 10pt;"><a href="http://www.uima-fr.org/planet//index.php?post_id=58" rel="nofollow" style="color: #551a8b;" title="Lire l'article">Nicolas Hernandez : Installer Eclipse et ses plugins pour UIMA</a> (12/09) </span><span style="font-size: x-small;"> DEPRECATED</span></span></li>
<li><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size: x-small;"><a href="http://www.uima-fr.org/planet//index.php?post_id=28" rel="nofollow" style="color: #551a8b; text-decoration: none;" title="Lire l'article">Jérôme Rocheteau : Comment configurer Eclipse pour UIMA ?</a></span><span style="font-size: x-small;"> </span><span style="font-size: x-small;">(10/09)</span><span style="font-size: x-small;"> DEPRECATED</span></span></li>
</ul>
</div>
Nicolas Hernandezhttp://www.blogger.com/profile/11685903401452574118noreply@blogger.com0tag:blogger.com,1999:blog-318866257749890342.post-8676182378568999702013-06-13T06:06:00.000-07:002013-06-13T06:06:25.736-07:00Toward a Free French Treebank<br />
<span style="font-family: Arial, Helvetica, sans-serif;">One of my current objective is to develop</span><span style="font-family: Arial, Helvetica, sans-serif; font-size: 13.600000381469727px; line-height: 12.800000190734863px;"> a Free French treebank allowing to train statistical systems on common NLP tasks </span><span style="font-family: Arial, Helvetica, sans-serif; font-size: 13.600000381469727px; line-height: 12.800000190734863px;">such as text segmentation, morphological analysis, chunking, parsing...</span><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size: 13.600000381469727px; line-height: 12.800000190734863px;">As part of this project, in [2] we show a way of doing it.</span><br /></span><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><b>Download</b></span><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><b><br /></b></span>
<span style="font-family: Arial, Helvetica, sans-serif;">Here you can <a href="https://docs.google.com/forms/d/1fSiEaAPeq3S4tF1P1vuWJXuDvMUMQvnQILP2b-58m7k/viewform">download the current version of the Free French Treebank [0]</a>.<br /><br /><b>Licence </b></span><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><b><br /></b>The resource (i.e. annotations) is distributed under the terms of this Lesser General<br />Public License for Linguistic Resources (LGLP-LR) [1].<br />This means you can use it in the context you want, you can modify it, and<br />distribute it as long as you do the same with your contribution.<br />If you use this project to support academic research, then please cite the<br />following paper as appropriate [2].</span><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><br /><b>Notes on the current release</b></span><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><b><br /></b>The current version is based on the frwikinews-20130110 articles dump [3].<br />It has 28000 news articles covering a period from January 2005 to now.<br />After filtering of sentences with less than 5 tokens the version has 87461<br />sentences and 2535396 tokens. Texts are available under Creative Commons<br />Attribution 2.5 (CC-BY 2.5) licence. Prior versions from September 2005 are in<br />public domain. The text format have been cleaned up by using a Java Wikipedia<br /> API [4], then tokenized using a rule-/dictionary-based tokenizer [5], then<br />POS tagged by the Stanford tagger [6].<br />The resource contains<br /> * xml-bz2 XML source archive<br /> * txt raw text<br /> * txt-tok a sentence per line and whitespace-separated words<br /> * txt-tok-pos a pos tag is associated with each word and is separated from this one with an underscore</span><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><br /><b>References</b></span><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><b><br /></b>[0] <a href="https://docs.google.com/forms/d/1fSiEaAPeq3S4tF1P1vuWJXuDvMUMQvnQILP2b-58m7k/viewform">https://docs.google.com/forms/d/1fSiEaAPeq3S4tF1P1vuWJXuDvMUMQvnQILP2b-58m7k/viewform</a><br />[1] <a href="http://infolingu.univ-mlv.fr/lgpllr.html">http://infolingu.univ-mlv.fr/lgpllr.html</a><br />[2] @inproceedings{hernandez:2013:taln,<br /> title = {{Construction automatique d'un large corpus libre annot{\'e} morpho-syntaxiquement en fran{\c c}ais}},<br /> author = {Hernandez, Nicolas and Boudin, Florian},<br /> abstract = {{Cet article {\'e}tudie la possibilit{\'e} de cr{\'e}er un nouveau corpus {\'e}crit en fran{\c c}ais annot{\'e} morpho-syntaxiquement {\`a} partir d'un corpus annot{\'e} existant. Nos objectifs sont de se lib{\'e}rer de la licence d'exploitation contraignante du corpus d'origine et d'obtenir une modernisation perp{\'e}tuelle des textes. Nous montrons qu'un corpus pr{\'e}-annot{\'e} automatiquement peut permettre d'entra{\^\i}ner un {\'e}tiqueteur produisant des performances {\'e}tat-de-l'art, si ce corpus est suffisamment grand.}},<br /> language = {Fran{\c c}ais},<br /> affiliation = {Laboratoire d'Informatique de Nantes Atlantique - LINA},<br /> booktitle = {{Actes de la conf{\'e}rence TALN-RECITAL 2013}},<br /> address = {Sables d'Olonne, France},<br /> audience = {nationale },<br /> year = {2013},<br /> month = Jun,<br /> pdf = {<a href="http://hal.archives-ouvertes.fr/hal-00816350/PDF/TALN13.pdf">http://hal.archives-ouvertes.fr/hal-00816350/PDF/TALN13.pdf</a>},<br />}</span><br />
<br />
<div style="background-color: white; font-family: Verdana, Helvetica, Arial, sans-serif; font-size: 13.600000381469727px; line-height: 12.800000190734863px;">
[3] <a href="http://dumps.wikimedia.org/legal.html">http://dumps.wikimedia.org/legal.html</a></div>
<div style="background-color: white; font-family: Verdana, Helvetica, Arial, sans-serif; font-size: 13.600000381469727px; line-height: 12.800000190734863px;">
[4] <a href="http://code.google.com/p/gwtwiki">http://code.google.com/p/gwtwiki</a></div>
<div style="background-color: white; font-family: Verdana, Helvetica, Arial, sans-serif; font-size: 13.600000381469727px; line-height: 12.800000190734863px;">
[5] <a href="https://github.com/boudinfl/kea">https://github.com/boudinfl/kea</a></div>
<div style="background-color: white; font-family: Verdana, Helvetica, Arial, sans-serif; font-size: 13.600000381469727px; line-height: 12.800000190734863px;">
[6] <a href="http://nlp.stanford.edu/software/tagger.shtml">http://nlp.stanford.edu/software/tagger.shtml</a></div>
<br />
Nicolas Hernandezhttp://www.blogger.com/profile/11685903401452574118noreply@blogger.com0tag:blogger.com,1999:blog-318866257749890342.post-53165782064686591052012-12-19T14:27:00.001-08:002012-12-19T14:29:17.454-08:00Apache UIMA HMM Tagger FR Models<span style="font-family: Arial, Helvetica, sans-serif;"><b>Download here: Models for the <a href="https://docs.google.com/spreadsheet/viewform?formkey=dC0xbmpldHZPRWF6WVg3RUViWkJhdGc6MA">Apache UIMA Hidden Markov Model Tagger Annotator [1] (from the sandbox UIMA Addons)</a></b><br /><br />The models concern the following tasks:<br /> * Part of speech tagging (POS)<br /> * Grammatical subcategorization (Subcat) <br /> * Morphological inflection analysis (Mph) </span><div>
<span style="font-family: Arial, Helvetica, sans-serif;">* Lemmatization(canonical form) </span><div>
<span style="font-family: Arial, Helvetica, sans-serif;">* Ee analysis (POS + Subcat + Mph) <br /><br />Models have been built with the addon's version 2.4 using the French Treebank corpus [2] (version 2010). The ftb licence does not prevent to distribute analysis results under whatever licence but it mentions that the ftb should be used only for research purpose.Consequently we restrict the use of these models only for research purposes. <br /><br />To get the '.dat', unzip and have a look to the '/HMMTrainerTagger/french/' dir <br /><br />[1] <a href="http://uima.apache.org/sandbox.html#tagger.annotator">http://uima.apache.org/sandbox.html#tagger.annotator</a></span></div>
<div>
<span style="font-family: Arial, Helvetica, sans-serif;">[2] For more on the French Treebank, see Abeille, A., L. Clement, and F. Toussenel. 2003. `Building a treebank for French', in A. Abeille (ed) Treebanks , Kluwer, Dordrecht. <a href="http://www.llf.cnrs.fr/Gens/Abeille/French-Treebank-fr.php">http://www.llf.cnrs.fr/Gens/Abeille/French-Treebank-fr.php</a></span><div class="ss-form-desc ss-no-ignore-whitespace" style="border: 0px; font: inherit; margin: 0px; padding: 0px; white-space: pre-wrap; width: 570px; word-wrap: break-word;">
<br /></div>
</div>
</div>
Nicolas Hernandezhttp://www.blogger.com/profile/11685903401452574118noreply@blogger.com0tag:blogger.com,1999:blog-318866257749890342.post-5824251524812376712012-12-19T14:17:00.000-08:002013-11-20T00:18:18.931-08:00Apache OpenNLP FR Models<br />
<span style="font-family: Arial, Helvetica, sans-serif; font-size: small;"><b><span style="white-space: pre-wrap;">Download here: <a href="https://docs.google.com/spreadsheet/viewform?formkey=dGJ5ZmRvZnF0WEVUSXBPbWRzNjBIaEE6MQ">the last version of the models for processing several common Natural Language Processing tasks in French with Apache OpenNLP </a> </span><span style="white-space: pre-wrap;">[1]</span></b></span><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><br />The models concern the following tasks: Sentence segmentation, Word tokenization, Part-of-Speech Tagging, Morphological inflection analysis*, Lemmatization*, Chunking, Person|Organization|Location Name Entity recognition**<br /><br /> Except for Named Entity models, models have been built using the French Treebank corpus [2] (version 2010). Its licence does not prevent to distribute its analysis results under whatever licence but it mentions that the ftb should be used only for research purpose. Consequently we restrict the use of these models only for research purposes. </span><br />
<div>
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div>
<span style="font-family: Arial, Helvetica, sans-serif;">* To be used with the tagger </span></div>
<div>
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div>
<span style="font-family: Arial, Helvetica, sans-serif;">** Named Finder Models have been built by Olivier Grisel. See for more detail [3]. </span></div>
<div>
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div>
<span style="font-family: Arial, Helvetica, sans-serif;">To get the '.bin' files, unzip and have a loot at the '/opennlp/models/fr/' dir. </span></div>
<div>
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div>
<span style="font-family: Arial, Helvetica, sans-serif;">[1] <a href="http://opennlp.apache.org/">http://opennlp.apache.org/</a> </span></div>
<div>
<span style="font-family: Arial, Helvetica, sans-serif;">[2] For more on the French Treebank, see Abeille, A., L. Clement, and F. Toussenel. 2003. `Building a treebank for French', in A. Abeille (ed) Treebanks , Kluwer, Dordrecht. <a href="http://www.llf.cnrs.fr/Gens/Abeille/French-Treebank-fr.php">http://www.llf.cnrs.fr/Gens/Abeille/French-Treebank-fr.php</a> </span></div>
<div>
<span style="font-family: Arial, Helvetica, sans-serif;">[3] <a href="http://www.nuxeo.com/blog/development/2011/01/mining-wikipedia-with-hadoop-and-pig-for-natural-language-processing/">http://www.nuxeo.com/blog/development/2011/01/mining-wikipedia-with-hadoop-and-pig-for-natural-language-processing/</a></span></div>
Nicolas Hernandezhttp://www.blogger.com/profile/11685903401452574118noreply@blogger.com9tag:blogger.com,1999:blog-318866257749890342.post-37762238833472137632012-12-19T06:41:00.001-08:002012-12-19T06:41:10.179-08:00UIMA AS (Asynchronous Scaleout) Tutorial?<br />
At the bottom of the<a href="http://uima.apache.org/doc-uimaas-what.html"> Getting Started: Apache UIMA Asynchronous Scaleout</a> [1] page, you find the following mention<br />
<blockquote class="tr_bq">
See the <a href="http://svn.apache.org/repos/asf/uima/uima-as/trunk/README">README file</a> [3] in the top level directory for instructions on deploying and testing standard UIMA example annotators as UIMA AS services.</blockquote>
Download for example the <a href="http://uima.apache.org/downloads.cgi">binary version of UIMA AS</a> [2] and you fill find out the README in the top level directory. It contains various information for Installation and Setup, and examples for Starting the ActiveMQ Broker, Deploying an Analysis Engine as a UIMA AS Asynchronous Service, Calling a UIMA AS Asynchronous Service, Migration from CPM to UIMA-AS...<br />
<br />
Again the direct link to this <a href="http://svn.apache.org/repos/asf/uima/uima-as/trunk/README">README file</a> [3].<br />
<br />
[1]: <a href="http://uima.apache.org/doc-uimaas-what.html">http://uima.apache.org/doc-uimaas-what.html</a><br />
[2]: <a href="http://uima.apache.org/downloads.cgi">http://uima.apache.org/downloads.cgi</a><br />
[3]: <a href="http://svn.apache.org/repos/asf/uima/uima-as/trunk/README">http://svn.apache.org/repos/asf/uima/uima-as/trunk/README</a><br />
Nicolas Hernandezhttp://www.blogger.com/profile/11685903401452574118noreply@blogger.com0tag:blogger.com,1999:blog-318866257749890342.post-13561449580275996232012-11-21T09:12:00.000-08:002012-11-22T00:21:41.128-08:00Accéder et gérer des ressources externes au sein d'un UIMA Analysis Engine Ce post s'appuie notamment sur la section 1.5.4 du guide utilisateur [1] (<a href="http://uima.apache.org/d/uimaj-2.4.0/tutorials_and_users_guides.html#ugr.tug.aae.accessing_external_resource_files">Managing and accessing External Resources</a>).<br />
<div>
Des exemples de descripteurs et de code Java d'analysis engine mettant en oeuvre l'accès et la gestion à des ressources externes sont fournis dans l'exemple 6 du tutoriel de uima-examples.</div>
<div>
<div>
<h4>
De quoi parle-t-on ?</h4>
<div>
<div style="text-align: left;">
On exploite régulièrement des ressources au sein de composants (analysis engine) de traitement de la langue. Il peut s'agir par exemples de dictionnaires que l'on accède en lecture ou bien d'objets que l'on accède en écriture (et lecture) pour stocker des informations sur le sujet d'analyse du moment. </div>
<div style="text-align: left;">
Concernant ce deuxième cas, cela peut par exemple consister en le nombre de fois où un élément des données (une instance) avec un label x est classée avec un label y, ce qui permettra par la suite de construire une matrice de contingence pour évaluer les résultats d'un processus de classification. On peut imaginer plusieurs instances d'un même traitement qui comptent en parallèle différents documents... Un autre exemple peut consister en compter les occurrences de formes candidates (e.g. ngrams) en vue de calculer ultérieurement le tf.idf de ces formes pour un extracteur de termes par exemple. Dans ces deux exemples le calcul ultérieur peut être envisagé <a href="http://uima.apache.org/d/uimaj-2.4.0/tutorials_and_users_guides.html#ugr.tug.aae.aaes_can_contain_cas_consumers">au sein de la méthode <span style="background-color: white; line-height: 12.666666984558105px;"><span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">collectionProcessComplete()</span></span>d'un analysis engine.</a><span style="font-family: monospace; font-size: x-small;"><span style="line-height: 12.499999046325684px;"> </span></span></div>
Pour l'exemple sur le comptage de la classification des instances on peut imaginer qu'un objet ayant un attribut de type <span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">Map String to Integer<string nteger="nteger"></string></span> pourrait parfaitement nous convenir. Les clés string seraient "truePositive", "trueNegative", "falsePositive" et "falseNegative". Remarquons qu'une <span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">Map String to String</span> pourrait très bien convenir aussi pour un dictionnaire qui associe une forme lexicale avec son lemme.</div>
<h4>
Qu'entend-t-on par gestion et accès à une ressource ?</h4>
<div>
La gestion d'une ressource est souvent plus "facile" et plus "rapide" à mettre en oeuvre lorsque la définition de celle-ci est au sein même du composant que l'on développe. Elle nécessite généralement que la connaissance de l'API du langage de programmation (Java) et du modèle de données de la ressource (induit du format du dictionnaire ou bien du phénomène que l'on observe) pour la manipuler. </div>
<div>
Externaliser les ressources de type dictionnaire et spécifier le chemin (e.g. sur le système de fichier ou sur le web) pour y accéder par la définition de paramètres des composants, sont un début de bonne pratique. Il en coûte quelques lignes de codes supplémentaires (gestion de fichiers et du parcours du format de stockage). C'est un premier pas pour faciliter la maintenance et le partage de de ressources en lecture entre plusieurs composants.</div>
<div>
Le chemin peut même désigner une ressource publique ou un chemin relatif plus facilement portable.</div>
<div>
Néanmoins cette solution ne répond pas au problème de multiplication des instances de ressources en mémoire (une pour chaque instance de composant qui souhaite accéder à la ressource) ni au besoin d'accès concurrent en écriture sur la ressource. Pour cela il faut se plonger davantage dans la maîtrise du langage de programmation et écrire encore "quelques" lignes de codes supplémentaires.</div>
<div>
Par ailleurs il est souvent intéressant de découpler l'API d'accès d'un objet de son implémentation afin de ne pas rendre dépendant le composant à l'implémentation.</div>
<div>
<br /></div>
<div>
UIMA met à disposition ce qu'il appelle un <i>RessourceManager</i> pour permettre de </div>
<div>
<ul>
<li>partager la même instance d'un objet entre plusieurs composants (soit des composant distincts soit plusieurs instances d'un même composant)</li>
<li>éventuellement initialiser au démarrage les objets à partir du contenu d'un fichier pointé par une URL (ou éventuellement un chemin sur le système de fichiers local)</li>
<li>d'externaliser l'implémentation de l'API de manipulation de l'objet en en fournissant une de base pour traiter l'objet comme un flux et en offrant la possibilité d'en spécifier de plus ad hoc et d'en fournir une implémentation</li>
</ul>
</div>
<h4>
Comment déclarer l'identifiant utilisé dans le code du composant pour désigner la ressource externe (on parle aussi de clé) et comment spécifier l'interface qui déclare les manipulations que l'on peut réaliser sur l'objet ? </h4>
<div>
Pour ce faire, on utilise le "<i>component descriptor editor</i>", onglet "<i>Resources</i>", section de gauche "<i>Resource Dependencies</i>" (correspond à <span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">externalResourceDependency</span> dans le code source).</div>
<div>
<br /></div>
<div>
La <b>valeur de la clé</b> permet au code du composant d'identifier cette ressource. Elle est par conséquent unique au niveau de ce composant. Par contre d'autres composants peuvent utiliser cette valeur pour signifier d'autres ressources.</div>
<div>
<br /></div>
<div>
La spécification d'une <b>interface</b> est optionnelle. Pour rappel l'interface permet de dissocier l'implémentation de la manipulation de la ressource de son interface afin de pouvoir faire évoluer indépendamment le code du composant et celui de la gestion de la ressource. Sans nom d'interface spécifié, il sera possible d'accéder directement au contenu de la ressource par le biais d'une ImputStream (obtenu via une URL (éventuellement un chemin sur le système de fichiers local)). </div>
<div>
Cela signifie que le parsing de la ressource ne sera pas externalisé. Mais parfois si le format est simple, il n'est pas utile de définir une interface particulière.</div>
<h4>
Comment accède t on à la ressource au sein du code du composant ?</h4>
L'accès à la ressource ne peut que se faire si on a lié (binding) la clé que l'on a déclaré avec une définition de ressources externes, laquelle spécifiera l'URL pour accéder à la ressource. Cette opération sera vue ultérieurement.</div>
<div>
<br /></div>
<div>
Au sein du code on accède à la ressource à l'initialisation de l'analysis engine, c'est-à-dire que l'on accède à la ressource via le <span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">UimaContext</span> fourni disponible au sein de la méthode <span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">initialize</span>.<br />
<br />
Lorsqu'aucune interface n'est définie lors de la déclaration de la clé désignant la ressource (onglet "<i>Ressources"</i> section "<i>Resource Dependencies</i>" ), on peut accéder à la ressource comme cela :</div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">InputStream stream = getContext().getResourceAsStream("MaCleDesignantLaRessource");</span></div>
<div>
ou bien comme cela si l'on souhaite déterminer la localisation du fichier ressource : </div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">URI uri = getContext().getResourceURI("MaCleDesignantLaRessource");</span><br />
<br />
Lorsqu'une interface est définie on utilisera la méthode <span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">getResourceObject </span></div>
<div>
qui retourne un objet qui implémentera l'interface déclarée dans la section "<i>Resource Dependencies</i>" (onglet "<i>Ressources"</i> ) :</div>
<div>
<span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">MyResourceTypeImpl m</span><span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">MyResourceTypeImpl</span><span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"> =
(</span><span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">MyResourceType</span><span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">)getContext().getResourceObject("</span><span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">MaCleDesignantLaRessource</span><span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">");</span></div>
<div>
<br />
<div>
<h4>
<b>Comment définir une nouvelle ressource externe ?</b></h4>
</div>
<div>
Globalement une définition de ressource consiste à</div>
<div>
<ol>
<li>déclarer un nom de ressource pour l'identifier ultérieurement (afin de la lier avec des clés qui permettent aux composants d'identifier une ressource particulière au sein du code)</li>
<li>indiquer une url pour trouver la ressource </li>
<li>et optionnellement spécifier une implémentation de l'interface pour accéder à la ressource lorsqu'une interface a été déclarée</li>
</ol>
</div>
<div>
La définition s'opère à l'aide du "<i>component descriptor editor</i>", onglet "<i>Resources</i>", section de gauche "<i>Resources needs, Definition and Binding</i>" (correspond à <span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">resourceManagerConfiguration</span> dans le code source).</div>
<div>
<br /></div>
<div>
Indiquer dans le champ name (e.g. <span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">SharedResourceName</span>) un <b>nom servant à identifier cette définition de ressource</b>. Lorsque vous lierait la ressource avec une clé utilisée par le code du composant, le nom sera automatiquement repris.</div>
<div>
<br /></div>
<div>
Indiquer dans le premier champ <b>URL un chemin valide vers la ressource à charger</b>. Si la ressource est locale indiquer un chemin relatif plutôt qu'un chemin absolu. Il n'y a pas de lieu de stockage spécifique requis pour une ressource. </div>
<div>
Personnellement je les place dans le répertoire <span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">resources</span> de mon projet courant et j'ajoute le répertoire dans mon build path afin que les chemins relatifs soient accessibles dans celui-ci.</div>
<div>
<br /></div>
<div>
Dans le cas où votre ressource n'est pas de type dictionnaire et qu'il s'agit d'un objet partagé créé au fur et à mesure de l'analyse des documents traités, il faut tout de même spécifier un chemin vers une ressource existante. Créer par exemple un fichier vide <span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">defaultSharedResource.tmp</span> dans un sous répertoire (<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">external</span>) (package) du répertoire <span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">resources</span> du projet (n'oubliez pas d'ajouter ce répertoire dans le <i>build path</i>). Le chemin sera alors <span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">external/</span><span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">defaultSharedResource</span><span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">.tmp</span></div>
<div>
<br /></div>
<div>
Lorsqu'une interface a été spécifiée lors de la déclaration de clé ("<i>Resource Dependencies</i>" ), c'est sous cette section ("<i>Resources needs, Definition and Binding</i>") que l'on déclare <b>la classe qui implémente l'interface</b>.</div>
<div>
<br /></div>
If no implementation class is specified, then the getResource method returns a DataResource object, from which each annotator instance can obtain their own (non-shared) input stream; so threading is not an issue in this case.<br />
<div>
<h4>
<b>Comment associer une clé à une définition d'une ressource externe ?</b></h4>
</div>
<div>
A l'aide du "<i>component descriptor editor</i>", onglet "<i>Resources</i>", </div>
</div>
<div>
<ol>
<li>cliquer ensuite la clé que vous souhaitez dans la section de droite ("<i>Resource Dependencies</i>" )</li>
<li>cliquer sur la ressource définie que vous souhaitez dans la section de gauche ("<i>Resources needs, Definition and Binding</i>")</li>
<li>puis cliquer sur "bind"</li>
</ol>
<h4>
Lorsque l'on définit une interface d'accès à la ressource, que doit contenir la classe qui l'implémente ?</h4>
</div>
<div>
La classe qui implémenter l'interface de manipulation de la ressource doit implémenter aussi l'interface <span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">org.apache.uima.resource.SharedResourceObject</span>. Concrètement cela signifie que l'on doit surcharger la méthode <span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">load(DataResource data)</span> qui permet d'avoir accès à la ressource et qui va se charger de la parser pour initialiser l'instance de l'objet souhaité à retourner.</div>
<div>
Cela doit globalement ressembler à cela</div>
<div>
<span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">public </span><span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">class </span><span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">MyResourceTypeImpl </span><span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">implements </span><span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">MyResourceType</span><span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">_interface, SharedResourceObject {</span></div>
<div>
<span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"><br /></span></div>
<div>
<span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">public </span><span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">MyResourceTypeImpl</span><span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">() {</span><br />
<span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"> super();</span><br />
<span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">}</span><br />
<span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"><br /></span></div>
<div>
<span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">@Override</span><br />
<span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">public void load(DataResource data) throws ResourceInitializationException {</span></div>
<div>
<span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">}</span></div>
<div>
<span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;"><br /></span></div>
<div>
<span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">}</span></div>
<div>
Si il n'y a pas de ressources à charger, il suffit de laisser vide le code de la méthode.</div>
<div>
<div>
<br /></div>
<div>
Pour être instancié par le framework, l'implémentation doit être public et doit avoir un 0-argument constructor.</div>
</div>
<h4>
Comment partager une ressource entre plusieurs composants (ou comment bénéficier d'une seule définition de la ressource) ?</h4>
<div>
La section <a href="http://uima.apache.org/d/uimaj-2.4.0/tutorials_and_users_guides.html#ugr.tug.aae.accessing_external_resource_files">1.5.4.4. Sharing Resources among Annotators</a> détaille cela.</div>
<div>
<br /></div>
<div>
Les descripteurs de chaque composant doivent contenir la déclaration d'une dépendance pour la ressource partagée avec une valeur de clé qui leur est propre.</div>
<div>
Seul l'un des composants spécifie une définition de la ressource (en donnant un nom et une URL pour accéder à la ressource). Ce composant là peut lier cette ressource à sa clé. </div>
<div>
Il n'est pas possible d'opérer le binding au sein des descripteurs des autres composants. Si la ressource est requise pour ces composants, ceux-ci ne pourront fonctionner normalement.</div>
<div>
<br /></div>
<div>
Pour partager la ressource il faut utiliser un descripteur <i>aggregate</i> qui va réunir les descripteurs de différents composants. Dans la section Resources, celui-ci spécifiera le binding entre la ressource souhaitée et les clefs affichés des composants.</div>
<h4>
Qu'en est il de la sûreté d'accès à la ressource quand celle-ci est partagée ?</h4>
<div>
La documentation indique que "If an implementation class is specified in the external resource, only one instance of that implementation class is created for a given binding, and is shared among all annotators. Because of this, the implementation of that shared instance must be written to be thread-safe - that is, to operate correctly when called at arbitrary times by multiple threads."</div>
<div>
<br /></div>
<div>
Le <a href="http://www.javaconcurrencyinpractice.com/listings/Sequence.java">contrôle d'accès à des méthodes sensibles</a> peut être une solution pour permettre un accès concurrentiel en écriture à la ressource.</div>
<div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">public synchronized int increment() {</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"> return nextValue++;</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"> }</span></div>
</div>
<div>
<div>
<br /></div>
<div>
If no implementation class is specified, then the getResource method returns a DataResource object, from which each annotator instance can obtain their own (non-shared) input stream; so threading is not an issue in this case.</div>
</div>
</div>
Nicolas Hernandezhttp://www.blogger.com/profile/11685903401452574118noreply@blogger.com0tag:blogger.com,1999:blog-318866257749890342.post-22513796156832024332012-09-25T02:48:00.000-07:002012-10-25T00:49:09.156-07:00Génération et correction automatique de QCM<span style="background-color: black;"><span style="color: white;"><em style="font-family: Verdana, Geneva, sans-serif; font-size: 12.666666984558105px; line-height: 18.66666603088379px;">Auto Multiple Choice</em><span style="font-family: Verdana, Geneva, sans-serif; font-size: 12.666666984558105px; line-height: 18.66666603088379px;"> est un ensemble d'utilitaires permettant de créer, gérer et corriger automatiquement des questionnaires à choix multiples (QCM). C'est un logiciel libre distribué sous la licence </span><a href="http://fsffrance.org/gpl/gpl-fr.fr.html" style="font-family: Verdana, Geneva, sans-serif; font-size: 12.666666984558105px; line-height: 18.66666603088379px;">GPLv2+</a><span style="font-family: Verdana, Geneva, sans-serif; font-size: 12.666666984558105px; line-height: 18.66666603088379px;">.</span></span></span><br />
<span style="background-color: black;"><span style="color: white;"><span style="font-family: Verdana, Geneva, sans-serif; font-size: 12.666666984558105px; line-height: 18.66666603088379px;"><br /></span>
</span></span><br />
<a href="http://home.gna.org/auto-qcm/" style="background-color: black;"><span style="color: white;">http://home.gna.org/auto-qcm/</span></a><br />
<br />
<span style="background-color: black;"><span style="color: white;"><span style="font-family: Verdana, Geneva, sans-serif; font-size: 12.666666984558105px; line-height: 18.66666603088379px;"><br /></span>
</span></span><br />
<div style="font-family: Verdana, Geneva, sans-serif; font-size: 12.666666984558105px; line-height: 18.66666603088379px; margin-bottom: 0.5em; margin-top: 0.5em;">
<span style="background-color: black;"><span style="color: white;">Les sujets de QCM sont préparés par <a href="http://fr.wikipedia.org/wiki/LaTeX">LaTeX</a>, ce qui permet d'y écrire (éventuellement) toutes sortes de formules mathématiques.</span></span></div>
<div style="font-family: Verdana, Geneva, sans-serif; font-size: 12.666666984558105px; line-height: 18.66666603088379px; margin-bottom: 0.5em; margin-top: 0.5em;">
<span style="background-color: black;"><span style="color: white;">AMC permet de changer de manière aléatoire l'ordre des réponses à l'intérieur de chaque question, ainsi que l'ordre des questions, de sorte que chaque sujet se présente différemment. Il est ainsi plus difficile pour les étudiants de copier sur leurs voisins...</span></span></div>
<div style="font-family: Verdana, Geneva, sans-serif; font-size: 12.666666984558105px; line-height: 18.66666603088379px; margin-bottom: 0.5em; margin-top: 0.5em;">
<span style="background-color: black;"><span style="color: white;">À la suite de l'examen, les copies scannées peuvent être corrigées de manière automatique par AMC, grâce à une reconnaissance optique de marques (OMR). Si l'on ne dispose pas de scanner, ou pour les copies pour lesquelles la correction automatique aurait mal fonctionné, une correction manuelle assistée est aussi possible : il suffit de cliquer à la souris sur les cases cochées par chaque étudiant sur la reproduction du sujet affichée à l'écran.</span></span></div>
<div style="font-family: Verdana, Geneva, sans-serif; font-size: 12.666666984558105px; line-height: 18.66666603088379px; margin-bottom: 0.5em; margin-top: 0.5em;">
<span style="background-color: black;"><span style="color: white;">Il est possible de choisir le barème par défaut, ou de fixer un barème de manière fine pour chaque question du QCM. AMC fabrique un fichier OpenDocument rassemblant les notes de tous les étudiants, directement utilisable par <a href="http://fr.libreoffice.org/">LibreOffice.org</a> ou <a href="http://fr.openoffice.org/">OpenOffice.org</a>.</span></span></div>
Nicolas Hernandezhttp://www.blogger.com/profile/11685903401452574118noreply@blogger.com0tag:blogger.com,1999:blog-318866257749890342.post-19732969895876229012012-09-25T02:46:00.002-07:002012-09-25T02:46:28.885-07:00Logiciel de génération d'emplois du temps open source<br />
<div style="font-family: sans-serif; font-size: 16px; margin: 5px;">
FET is open source free software for automatically scheduling the timetable of a school, high-school or university. It uses a fast and efficient timetabling algorithm. It is licensed under GNU GPL.</div>
<div style="font-family: sans-serif; font-size: 16px; margin: 5px;">
Usually, FET is able to solve a complicated timetable in maximum 5-20 minutes. For simpler timetables, it may take a shorter time, under 5 minutes (in some cases, a matter of seconds). For extremely difficult timetables, it may take a longer time, a matter of hours.</div>
<br />
<a href="http://lalescu.ro/liviu/fet/">http://lalescu.ro/liviu/fet/</a><br />
<br />
<span style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.800000190734863px;"><br /></span>
<br />
<div style="font-family: sans-serif; font-size: 16px; margin: 5px;">
<br /></div>
Nicolas Hernandezhttp://www.blogger.com/profile/11685903401452574118noreply@blogger.com0tag:blogger.com,1999:blog-318866257749890342.post-55285585093258772492012-07-27T08:23:00.000-07:002012-07-27T08:51:37.291-07:00Example uima-connectors CAS to CSV<span style="background-color: black; color: white;">Using uima-connectors to serialize some CAS annotations into CSV-formatted files.</span><br />
<ol>
<li><span style="background-color: black; color: white;">This is performed in two steps: First, create a text view formatted in CSV with the information you wish serialize. </span></li>
<li><span style="background-color: black; color: white;">Second, write the views on the file system. The second step is optional, you do whatever you want with your view.</span></li>
</ol>
<span style="background-color: black; color: white;"><br /></span><br />
<span style="background-color: black; color: white;">The first step is performed by the CAS2CSVAE. Each line of the '<span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">_CSVView</span>', created at the first step, will contain some feature values of n annotation whose type have been configured via parameter. Columns of the lines contain the values of the features of the annotation type. They are also configured via parameters. </span><br />
<span style="background-color: black; color: white;">The second step is performed by the ViewWriterAE. This AE requires the presence of <span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">org.apache.uima.examples.SourceDocumentInformation</span> annotations in each CAS which results from using the FileSystemCollectionReader or using any tools from the apache uima SDK (like the DocumentAnalyzer). This is used to name the exported views in the file system.</span><br />
<span style="background-color: black; color: white;"><br /></span><br />
<b><span style="background-color: black; color: white;">Requirement</span></b><br />
<span style="background-color: black; color: white;">uima-connectors library is available here <a href="http://code.google.com/p/uima-connectors/">http://code.google.com/p/uima-connectors</a>.</span><br />
<span style="background-color: black; color: white;">It requires the uima-common lib <a href="http://code.google.com/p/uima-common/">http://code.google.com/p/uima-common/</a>.</span><br />
<span style="background-color: black; color: white;"><br /></span><br />
<b><span style="background-color: black; color: white;">Example of use</span></b><br />
<span style="background-color: black; color: white;">In the <a href="http://code.google.com/p/uima-connectors/downloads/detail?name=example-apacheAddons-uimaConnectors.tar.gz&can=2&q=">example eclipse project</a> you will see how to turn TokenAnnotations with coveredText, posTag, stem which result from apache uima addons analysis, into CSV formatted files.</span><br />
<span style="background-color: black; color: white;">See the descriptor <span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">desc/xample-apacheAddons-uimaConnectors/</span><span style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">example-apacheAddons-uimaConnectors-CAS2CSV-ViewWriter-AAE.xml</span></span><br />
<span style="background-color: black; color: white;">In particular have a look at the aggregate and the parameter settings tabs.</span><br />
<span style="background-color: black; color: white;">The example project assumes you have installed the apache-uima and apache-uima-addons binaries. Check the build path before using it.</span>Nicolas Hernandezhttp://www.blogger.com/profile/11685903401452574118noreply@blogger.com0tag:blogger.com,1999:blog-318866257749890342.post-33281025619630639472012-06-20T05:10:00.000-07:002012-06-20T05:10:23.380-07:00Extraire le texte de documents HTML en créant des annotations à la place des balises<div>
<div>
Traiter du SGML (e.g. HTML) ou du XML (i.e. SGML davantage contraint) est une activité commune dans nos chaînes de traitement TAL (Traitement Automatique des Langues). Par ailleurs, souvent les traitements que nous souhaitons réaliser (segmentation en phrases, en mots, étiquetage morpho-syntaxique, reconnaissance d'entités nommées...) ne fonctionnent que sur du texte simple (<i>plain text</i>).</div>
</div>
<h3>
<b>1. Tika MarkupAnnotator</b> vs. <b>uima-connectors XML2CAS</b></h3>
<div>
A ma connaissance, il y a au moins deux composants UIMA "librement" disponibles pour </div>
<div>
<ol>
<li>extraire le texte d'un document SGML sans en modifier ses offsets </li>
<li>transformer les balises d'un document SGML en annotations UIMA au dessus des zones de texte couvertes.</li>
</ol>
<div>
Il s'agit du <b>Tika MarkupAnnotator</b> [1] et du <b>uima-connectors XML2CAS</b> [3]. </div>
<div>
<ul>
<li>Pour chacun d'eux l'on peut spécifier la vue à analyser et la vue dans laquelle il faut produire le texte.</li>
<li>Chacun d'eux produit des annotations correspondantes aux balises. Le système de types est évidement différent dans sa forme même si l'on retrouve globalement dans le fond la même information. </li>
<li>XML2CAS travaille seulement avec de l'XML et vous autorise à spécifier les noms des éléments que vous voulez transformer en annotations afin de restreindre la taille du CAS</li>
<li>MarkupAnnotator offre la possibilité de traiter de l'XML mal formée (i.e. du SGML et en particulier HTML). Cela relativement simplement en ajoutant la bibliothèque du TagSoup parser dans le <i>classpath</i> [5].</li>
</ul>
</div>
<div>
Le premier est disponible dans les Annotator addons de Apache UIMA [2] et le second requiert de récupérer la bibliothèque uima-common pour fonctionner (au final [3] et [4]).</div>
</div>
<div>
<br /></div>
<div>
[1] <a href="http://uima.apache.org/sandbox.html#tika.annotator">http://uima.apache.org/sandbox.html#tika.annotator</a><div>
[2] <a href="http://uima.apache.org/downloads.cgi">http://uima.apache.org/downloads.cgi</a><br /><div>
<img src="https://mail.google.com/mail/images/cleardot.gif" /><br />[3] <a href="http://code.google.com/p/uima-connectors/downloads/detail?name=uima-connectors-v111205.jar">http://code.google.com/p/uima-connectors/downloads/detail?name=uima-connectors-v111205.jar</a><br />[4] <a href="http://code.google.com/p/uima-common/downloads/detail?name=uima-common-v120111.jar">http://code.google.com/p/uima-common/downloads/detail?name=uima-common-v120111.jar</a><br />[5] <a href="http://ccil.org/~cowan/XML/tagsoup/">http://ccil.org/~cowan/XML/tagsoup/</a></div>
</div>
</div>
<div>
<br /></div>
<div>
<span class="Apple-style-span" style="font-size: 19px; font-weight: bold;">2. Quelques détails sur mon test</span></div>
<div>
Personnellement j'ai testé les deux au sein d'un projet java Eclipse en déclarant les dépendances suivantes dans mon <i>classpath</i> (en plus de celles de UIMA):</div>
<div>
<div>
<ul>
<li>UIMA_HOME/addons/annotator/TikaAnnotator/lib/tika-core-0.7.jar</li>
<li>UIMA_HOME/addons/annotator/TikaAnnotator/lib/tika-parsers-0.7.jar</li>
<li>UIMA_HOME/addons/annotator/TikaAnnotator/lib/uima-an-tika.jar</li>
</ul>
</div>
<div>
<ul>
<li>chemin/vers/votre/lib/uima-common-v120111.jar</li>
<li>chemin/vers/votre/lib/uima-connectors-v111205.jar</li>
</ul>
<ul>
<li>chemin/vers/votre/lib/tagsoup-1.2.1.jar</li>
</ul>
<div>
J'ai ajouté la UIMA nature au projet et ajouté le répertoire <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">desc</span> aux<i> build path </i>pour me faciliter la tâche. J'ai créé un descripteur d'<i>Analysis Engine</i> que j'ai changé en <i>aggregate </i>afin de rajouter, les composants que je souhaitais tester, dans ma pipeline (section <i>aggregate</i> du descripteur) : </div>
</div>
</div>
<div>
<div>
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">MarkupAnnotator</span> et <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: xx-small;">connectors.xml.XML2CASAE.</span></div>
</div>
<div>
J'ai surchagé les paramètres des deux composants (section <i>parameter</i>) et n'ai pas oublié de les configurer (section <i>parameter settings</i>). </div>
<div>
Puis j'ai déclaré les types en sortie (section <i>capabilities</i>).</div>
<div>
Enfin j'ai lancé ma chaîne à l'aide du <i>Document Analyser</i>. Lorsque j'ai testé sur du HTML je n'avais pas retiré le composant XML2CAS de ma pipeline.</div>
<br /><div>
<div>
<br /><br /></div>
</div>Nicolas Hernandezhttp://www.blogger.com/profile/11685903401452574118noreply@blogger.com0tag:blogger.com,1999:blog-318866257749890342.post-36519081310938383682012-04-12T06:43:00.000-07:002012-04-12T06:43:53.661-07:00Sujet de thèse en Traitement Automatique des Langues et MultilinguismeEnglish version below.<br />
<br />
-------------------------------------------------------------------------------<br />
<br />
Sujet de thèse en Traitement Automatique des Langues et Multilinguisme<br />
<br />
L'équipe du Traitement Automatique du Langage Naturel (TALN) du Laboratoire<br />
Informatique de Nantes Atlantique (LINA UMR CNRS 6241) à l'Université de Nantes<br />
propose un sujet de thèse en Informatique dans les domaines du Traitement<br />
Automatique des Langues et du Multilinguisme. <br />
<br />
*Titre:*<br />
Analyse des structures discursives des textes et alignement de terminologies<br />
multilingues en corpus comparables ; pour une modélisation discursive de la<br />
notion de contexte.<br />
<br />
*Résumé : *<br />
La traduction automatique est l'une des activités de recherche les plus<br />
ambitieuses de notre temps. Ce travail de thèse propose de s'attaquer à l'un de<br />
ses enjeux, à savoir l'"alignement de terminologies multilingues" en corpus<br />
comparables, et ce en explorant de nouvelles méthodes de mise en correspondance<br />
des termes, à savoir à l'aide d'"analyses des structures discursives des<br />
textes". L'approche état de l'art consiste à établir une mise en correspondance<br />
des termes en mesurant la similarité de leurs contextes d'apparition à l'aide<br />
de dictionnaires bilingues préexistants. Les problèmes fondamentaux de cette<br />
approche sont qu'elle repose sur une modélisation très pauvre du contexte<br />
d'apparition d'un terme (un sac de mots apparaissant autour des termes<br />
analysés) et qu'elle présuppose l'existence de ressources lexicales bilingues<br />
pour être réalisée.<br />
Ce travail a pour objectif d'expérimenter des contextes de termes définis sur<br />
la base de résultats d'analyses du discours ainsi que réfléchir à la définition<br />
d'une notion de contexte discursif plus en adéquation avec la tâche.<br />
Ce sujet émerge dans la continuité du projet européen TTC et du projet ANR<br />
MeTRICC dont l'équipe TALN assure les coordinations.<br />
<br />
*Mots clefs :*<br />
Traduction, Alignement de terminologies multilingues, Analyse et modélisation<br />
des structures du discours, Corpus comparables<br />
<br />
*Profil et compétences recherchés: *<br />
M2 Recherche informatique ou école d'ingénieurs<br />
Bon niveau en anglais<br />
Bonnes notions en apprentissage automatique<br />
Bonnes connaissances en programmation Java/Python<br />
Affinités avec le logiciel libre et le développement collaboratif<br />
<br />
*Procédure de candidature* :<br />
La date butoir de réception des candidatures est le 20 Avril 2012 mais<br />
la position restera ouverte jusqu'à ce qu'elle soit attribuée.<br />
La thèse démarrera en Octobre 2012 et sera financée par une allocation ministérielle.<br />
Les candidats intéressés sont invités à prendre contact le plus tôt possible<br />
et à envoyer les informations suivantes : une lettre de motivation incluant votre<br />
positionnement par rapport aux compétences attendues, un CV, un relevé<br />
de notes avec classement au Master (au moins pour la période écoulée), un<br />
lien vers un site web présentant le programme de votre master et des lettres<br />
de recommandations de vos encadrants scientifiques.<br />
Cette thèse pourra être précédée d'un stage de master recherche financé<br />
sur le même thème. Prendre contact.<br />
<br />
*Contact : *<br />
Nicolas Hernandez et Emmanuel Morin (prenom.nom à univ-nantes.fr)<br />
<br />
*Plus d'information sur le sujet de thèse :*<br />
<a href="http://www.edstim.fr/these/sujets-de-these/informatique">http://www.edstim.fr/these/sujets-de-these/informatique</a><br />
<a href="http://e.nicolas.hernandez.free.fr/pub/rec/12">http://e.nicolas.hernandez.free.fr/pub/rec/12 </a><br />
<div><br />
</div><br />
<br />
<br />
-------------------------------------------------------------------------------<br />
Researcher position available: PhD in Natural Language Processing<br />
<br />
The University of Nantes (West coast of France) offers an opening for a 3-year<br />
PhD position at the LINA Computer Sciences Laboratory in the NLP Team (TALN).<br />
<br />
LINA TALN leads research in several NLP domains such as term extraction,<br />
syntactic and semantic analysis, and develops several applications (e.g.<br />
machine translation, opinion mining, plagiarism detection).<br />
LINA TALN participates in various projects founded by regional, national<br />
and European sources.<br />
<a href="http://www.lina.univ-nantes.fr/">http://www.lina.univ-nantes.fr/</a><br />
<br />
*Subject:*<br />
Discourse structure analysis and multilingual terminology alignment from comparable corpora.<br />
Toward a discourse definition of the notion of context<br />
<br />
*Brief description: *<br />
Multilingual terminology alignment from comparable corpora is one of the major<br />
issue of the automatic translation problem. To tackle this issue, the baseline<br />
approach proposes to align terms whose contexts are considered as similar<br />
thanks to bilingual dictionaries. This approach presents some drawbacks since<br />
the context model is quite simple (a bag of words occurring around the<br />
considered term) and because it requires external resources for performing.<br />
The current study aims at exploring a new approach for building term contexts.<br />
The idea is to use a more linguistically inspired approach: in particular to<br />
use discourse analysis both for providing semantically delimited text area<br />
around term occurrences and rhetorically dependent utterances in relation to<br />
the utterance where a term occurs. The work will start by trying out<br />
state-of-art discourse analysis methods, then it will go into the definition of<br />
a discourse context notion related to the task in depth. This research will<br />
pursue the works accomplished in the national and European projects MeTRICC<br />
and TTC.<br />
<br />
*Topics :*<br />
Machine translation, Multilingual terminology alignment, Discourse analysis,<br />
Comparable corpora<br />
<br />
*Qualifications:<br />
The ideal candidate would have:<br />
- (or soon receive) a Master degree in computer science/engineering<br />
- a background in NLP and/or machine learning<br />
- programming skills in JAVA/Python<br />
- experience in open source development (appreciated)<br />
- good English proficiency and ability to learn French (if appropriate)<br />
<br />
*Application procedure:*<br />
The application deadline is April 20, 2012 , but consideration of candidates<br />
will continue until the position is filled. It is expected to start on October 2012.<br />
Candidates interested in the position are asked to contact Nicolas Hernandez<br />
and Emmanuel Morin (firstname.lastname at univ-nantes.fr) with the following<br />
documents: A letter of motivation outlining your interest in the specific project,<br />
a curriculum vitae, at least two recommendation letters from a senior<br />
researcher/professor who can judge your potential as a future PhD student.<br />
<br />
The program will be funded by a grant from the French government.<br />
Median annual earnings are between 20,000 and 24,000 Euros.<br />
<br />
*More information on:*<br />
<a href="http://www.edstim.fr/these/sujets-de-these/informatique">http://www.edstim.fr/these/sujets-de-these/informatique</a><br />
<a href="http://e.nicolas.hernandez.free.fr/pub/rec/12">http://e.nicolas.hernandez.free.fr/pub/rec/12 </a>Nicolas Hernandezhttp://www.blogger.com/profile/11685903401452574118noreply@blogger.com0tag:blogger.com,1999:blog-318866257749890342.post-50123467568430112762012-04-12T04:50:00.003-07:002012-04-12T06:44:47.470-07:00Master Informatique spécialité ATAL : Apprentissage et Traitement Automatique de la LangueA la rentrée 2012/2013 ouvrira à l'université de Nantes un <a href="http://www.blogger.com/goog_1720813820">Master Informatique spécialité</a><a href="http://atal.univ-nantes.fr/"> ATAL (Apprentissage et Traitement Automatique de la Langue)</a>. <br />
<br />
Le Master ATAL viser à former des spécialistes de l'apprentissage automatique aux particularités des applications informatiques relevant du traitement automatique de la langue (TAL). Il s'agit notamment de pouvoir mettre en oeuvre des nouvelles applications prenant en compte des masses de données complexes et hétérogènes.<br />
<br />
La formation se veut pratique et fondamentale. Le but est de former en deux ans des étudiants issus de filières informatiques à un ensemble de techniques d'apprentissage automatique et de traitement automatique de la langue qui sont au coeur des applications en ingénierie des langues (comme en recherche d'information, en aide à la traduction, en analyse d'opinions). <br />
<br />
La formation s'inscrit dans une dynamique internationale en s'appuyant sur des personnalités scientifiques reconnues dans leurs domaines de compétences. <br />
<br />
Plus d'information sur <a href="http://atal.univ-nantes.fr/">atal.univ-nantes.fr</a>Nicolas Hernandezhttp://www.blogger.com/profile/11685903401452574118noreply@blogger.com0tag:blogger.com,1999:blog-318866257749890342.post-5009449567163938652012-03-08T00:40:00.002-08:002012-03-08T00:40:49.778-08:00Sélection d'articles de ACL'2011 et EMNLP'2011Les articles suivant ont été sélectionnés pour leurs accointances avec le traitement automatique du discours.<br />
<br />
Le programme de ACL'2011 est disponible à<br />
<a href="http://aclweb.org/anthology-new/P/P11/">http://aclweb.org/anthology-new/P/P11/</a><br />
<br />
<ul><li><a href="http://aclweb.org/anthology-new/P/P11/P11-1100.pdf">P11-1100</a> [<a href="http://aclweb.org/anthology-new/P/P11/P11-1100.bib">bib</a>]: Ziheng Lin; Hwee Tou Ng; Min-Yen Kan Automatically Evaluating Text Coherence Using Discourse Relations</li>
</ul><br />
et EMNLP'2011 <a href="http://aclweb.org/anthology-new/D/D11/">http://aclweb.org/anthology-new/D/D11/</a><br />
<br />
<ul><li><a href="http://aclweb.org/anthology-new/D/D11/D11-1002.pdf">D11-1002</a> [<a href="http://aclweb.org/anthology-new/D/D11/D11-1002.bib">bib</a>]: Li Wang; Marco Lui; Su Nam Kim; Joakim Nivre; Timothy Baldwin Predicting Thread Discourse Structure over Technical Web Forums</li>
<li><a href="http://aclweb.org/anthology-new/D/D11/D11-1015.pdf">D11-1015</a> [<a href="http://aclweb.org/anthology-new/D/D11/D11-1015.bib">bib</a>]: Lanjun Zhou; Binyang Li; Wei Gao; Zhongyu Wei; Kam-Fai Wong Unsupervised Discovery of Discourse Relations for Eliminating Intra-sentence Polarity Ambiguities</li>
<li><a href="http://aclweb.org/anthology-new/D/D11/D11-1028.pdf">D11-1028</a> [<a href="http://aclweb.org/anthology-new/D/D11/D11-1028.bib">bib</a>]: Amit Dubey; Frank Keller; Patrick Sturt A Model of Discourse Predictions in Human Sentence Processing</li>
</ul>Nicolas Hernandezhttp://www.blogger.com/profile/11685903401452574118noreply@blogger.com0tag:blogger.com,1999:blog-318866257749890342.post-30034240019863584042012-02-22T08:51:00.000-08:002012-04-12T06:45:41.751-07:00Listes de diffusion en TAL et disciplines cousinesCe post sert de complément et de correction à la liste que j'avais constituée des <a href="http://e.nicolas.hernandez.free.fr/pro/doku.php?id=misc:mailinglist#mailing_lists">listes de diffusion en Traitement Automatique des Langues (TAL) et disciplines cousines (Ingénierie des connaissances, ingénierie du document, sciences cognitives et linguistiques)</a> : Corpora-list, Elsnet-list, LN, LN-FORUM, RTP-DOC, Info-ic, parislinguists, RISC, Bull-I3, ARTIST, Orbital, Discours, Linguist<br />
<br />
RTP-DOC<br />
<ul><li><a href="http://listes.enssib.fr/listes/info/rtp-doc">http://listes.enssib.fr/listes/info/rtp-doc</a></li>
</ul><br />
<br />
EGC - extraction et de la gestion de connaissances<br />
<ul><li>http://www.egc.asso.fr/13-FR-Liste_de_diffusion</li>
</ul><br />
RISC - relais d'information sur les sciences de la cognition<br />
<ul><li>http://www.risc.cnrs.fr </li>
<li>Cette liste est modérée. Pour envoyer un message à la liste. : Pourinfos [ à ] risc.cnrs.fr </li>
</ul><br />
chercheurs_sdl - sciences du langage<br />
<ul><li>abonnement https://listes.univ-metz.fr/wws/info/chercheurs_sdl </li>
<li>https://listes.univ-metz.fr/wws/compose_mail/chercheurs_sdl</li>
</ul>Nicolas Hernandezhttp://www.blogger.com/profile/11685903401452574118noreply@blogger.com0tag:blogger.com,1999:blog-318866257749890342.post-81094893015843934802012-01-16T05:43:00.000-08:002012-06-19T08:52:12.726-07:00Animation des rencontres "Outils et instruments logiciels pour le TAL" au sein de l'équipe TALN<span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;">Depuis septembre 2010, j'anime au sein de l'équipe des <span class="il" style="background-attachment: initial; background-clip: initial; background-color: #70bd36; background-image: initial; background-origin: initial; color: #eeffe2;">rencontres</span> "<span class="il" style="background-attachment: initial; background-clip: initial; background-color: #70bd36; background-image: initial; background-origin: initial; color: #eeffe2;">Outils</span> <span class="il" style="background-attachment: initial; background-clip: initial; background-color: #70bd36; background-image: initial; background-origin: initial; color: #eeffe2;">et</span> <span class="il" style="background-attachment: initial; background-clip: initial; background-color: #70bd36; background-image: initial; background-origin: initial; color: #eeffe2;">instruments </span> <span class="il" style="background-attachment: initial; background-clip: initial; background-color: #70bd36; background-image: initial; background-origin: initial; color: #eeffe2;">logiciels</span> pour le TAL" connues aussi sous le nom de "réunions <span class="il" style="background-attachment: initial; background-clip: initial; background-color: #70bd36; background-image: initial; background-origin: initial; color: #eeffe2;">logiciels</span>".<br />
<br />
J'utilise ce post pour rappel du principe et les commentaires pour présenter les différentes interventions qui ont lieu.<br />
<br />
La motivation de ces <span class="il" style="background-attachment: initial; background-clip: initial; background-color: #70bd36; background-image: initial; background-origin: initial; color: #eeffe2;">rencontres</span> sont l'échange de connaissances<br />
<span class="il" style="background-attachment: initial; background-clip: initial; background-color: #70bd36; background-image: initial; background-origin: initial; color: #eeffe2;">et</span> l'entraide pour la prise en main d'un nouveau logiciel.<br />
<br />
L'objectif pour le présentateur est simple : faire connaître un<br />
logiciel <span class="il" style="background-attachment: initial; background-clip: initial; background-color: #70bd36; background-image: initial; background-origin: initial; color: #eeffe2;">et</span> donner un aperçu de l'utilisation de celui-ci. La présentation prend la forme d'une<br />
démonstration d'un cas d'utilisation. Suivant le logiciel, cela prend<br />
15 à 30 minutes questions comprises.<br />
<br />
Il faut prendre logiciel (au sens très large) [2] : cela peut concerner un<br />
développement personnel, une bibliothèque, une application, un analyseur<br />
particulier de données...<br />
<br />
Je vous invite à vous proposer pour présenter un logiciel que vous pensez être<br />
pertinent pour l'équipe (même si vous n'en connaissez que quelques fonctions),<br />
ainsi qu'à émettre des demandes de démonstration. Je me propose de<br />
coordonner pour trouver un intervenant dans le cas de demandes. On pourra<br />
discuter plus tard sur les modalités d'ouverture de ces réunions à des<br />
participants hors équipe.<br />
<br />
Les <span class="il" style="background-attachment: initial; background-clip: initial; background-color: #70bd36; background-image: initial; background-origin: initial; color: #eeffe2;">rencontres</span> sont au rythme d'une demi-heure tous les mois voire toutes les 6 semaines.<br />
Elles sont planifiées sur l'agenda de l'équipe (aussi consultable en ligne sur [1]).<br />
<br />
[1] Agenda des réunions de l'équipe TALN<br />
[2] Instrument, outil, utilitaire <span class="il" style="background-attachment: initial; background-clip: initial; background-color: #70bd36; background-image: initial; background-origin: initial; color: #eeffe2;">et</span> ressource<br />
<a href="http://www.revue-texto.net/Corpus/Publications/Habert/Habert_Portrait.html#2.1" style="color: #112508;" target="_blank">http://www.revue-texto.net/<wbr></wbr>Corpus/Publications/Habert/<wbr></wbr>Habert_Portrait.html#2.1</a>.</span>Nicolas Hernandezhttp://www.blogger.com/profile/11685903401452574118noreply@blogger.com7tag:blogger.com,1999:blog-318866257749890342.post-41205488677718690902012-01-05T09:18:00.001-08:002012-01-05T09:18:59.965-08:00Définition d'un descripteur primitif d'Analysis Engine<div><br />
<div><div>Ce post est en lien avec le post <a href="http://enicolashernandez.blogspot.com/2012/01/developper-son-premier-composant-uima.html">Développer son premier composant UIMA : l'Analysis Engine (AE)</a> </div></div><div></div><br />
La dernière étape consister à créer un descripteur indiquant au framework UIMA comment utiliser le composant. En particulier il définit la classe métier de l'Annotator, le Type System manipulé, les Types qui sont utilisés comme input et ceux qui seront des output. C'est aussi ici que sont déclarés les paramètres et les ressources partagées utilisés si il y a lieu.</div><div><br />
La création du descripteur du composant est facilitée à travers Eclipse et les plugins installés. Dans le répertoire <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">desc/opinionRecognizer</span> du projet (ou seulement desc si vous n'avez pas packagé votre projet) :<br />
<div><ul><li>Créer le fichier descripteur du composant, <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">opinionRecognizerAE.xml</span> en cliquant dessus avec le bouton droit et <i>New - Other - UIMA - Analysis Engine Descriptor File</i>.</li>
<li>Sur la première page (onglet <i>Overview</i> accessible au bas du cadre) spécifier le nom de la classe qui implémente votre code métier (i.e. <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">opinionRecognizer.O</span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">pinionRecognizerAE)</span>.</li>
<li>Sous l'onglet <i>Type System</i>, ajouter (<i>Add</i>) par nom (<i>by name</i>) le type system défini pour votre composant (i.e. <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">desc/opinionRecognizer/o</span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">pinionRecognizerTS.xml</span>).</li>
<li>Enfin sous l'onglet <i>Capabilities</i>, spécifiez les types des annotations qui doivent apparaître en sortie (i.e. <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">SentenceAnnotation, TokenAnnotation et Opinion</span>).</li>
</ul></div>Si en cliquant sur ce fichier pour l'ouvrir, vous n'accédez qu'à son contenu XML, alors demandez d'ouvrir avec le <i>Component Descriptor Editor</i> en cliquant sur le fichier avec le bouton droit.</div><div><br />
</div>Nicolas Hernandezhttp://www.blogger.com/profile/11685903401452574118noreply@blogger.com0tag:blogger.com,1999:blog-318866257749890342.post-38657820427663089392012-01-05T09:16:00.001-08:002012-01-06T08:18:22.355-08:00Implémenter le code métier d'un composant Analysis Engine<div><div><br />
<div><div>Ce post est en lien avec le post <a href="http://enicolashernandez.blogspot.com/2012/01/developper-son-premier-composant-uima.html">Développer son premier composant UIMA : l'Analysis Engine (AE)</a> </div></div><div></div></div><div><br />
La seconde étape correspond au développement du code métier du composant.<br />
<br />
</div><div>Le code métier d'un AE est <i>à minima</i> constitué d'une classe dite Annotator qui étend la classe <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">JCasAnnotator_ImplBase</span> du framework UIMA. En particulier, on trouve le code métier dans une méthode surchargée appelée <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">process</span> qui est automatiquement appelée à l'exécution pour chaque CAS traitée. La méthode <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">process </span>a accès au CAS et via l'API d'UIMA elle peut manipuler l'artifact ou les (index d') annotations qui ont été précédemment ajoutées ou bien en ajouter de nouvelles.</div><div><br />
</div><div><span class="Apple-style-span">La classe <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">JCasAnnotator_ImplBase </span>est une implémentation par défaut </span>de la classe <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">AnalysisComponent</span>. Cette implémentation par défaut <span class="Apple-style-span">implémente toutes les méthodes exceptée la méthode </span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">process</span><span class="Apple-style-span">. En général on travaille directement à partir de celle-ci quitte à surcharger les méthodes déjà implémentées. </span></div><div><span class="Apple-style-span">La classe </span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">AnalysisComponent </span><span class="Apple-style-span">a plusieurs méthodes dont les plus importantes sont <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">initialize, process</span> et <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">collectionProcessComplete</span>. La méthode </span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">initialize</span><span class="Apple-style-span"> est appelée une fois par le framework UIMA à la création de la première instance de la classe Annotator ; elle sert par exemple à récupérer la valeur de paramètres ou à charger des ressources qui seront partagées par les différentes instances de la classe. La méthode </span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">process</span><span class="Apple-style-span"> est donc appélée une fois par item traité. La méthode </span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">collectionProcessComplete</span><span class="Apple-style-span"> est appelée quand l'entière collection a été traitée et sert à produire des résultats relatifs à toute la collection.</span></div><div><br />
</div><div><span class="Apple-style-span">Dans cet exercice, vous n'aurez besoin que d'implémenter la méthode </span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">process</span><span class="Apple-style-span">.</span></div><div><span class="Apple-style-span"><br />
</span></div><div><b>Création de la classe Annotator</b></div><div><ol><li><span class="Apple-style-span">Dans le répertoire src, créer le package </span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">opinionRecognizer.</span></li>
<li>Au sein du package, créer la classe <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">OpinionRecognizerAE</span>. Par convention les classes Annotator se termineront par le suffixe AE.</li>
<li><span class="Apple-style-span">Faire étendre la classe de </span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">JCasAnnotator_ImplBase</span></li>
<li>et surcharger la méthode <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">process.</span></li>
</ol><div><span class="Apple-style-span" style="font-family: inherit;">Cela doit donner quelque chose comme :</span></div></div><blockquote class="tr_bq"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">package opinionRecognizer;<br />
import<br />
org.apache.uima.analysis_component.JCasAnnotator_ImplBase;<br />
import org.apache.uima.jcas.JCas;<br />
import opinionRecognizer.types.*;<br />
public class OpinionRecognizerAE extends JCasAnnotator_ImplBase{<br />
public void process(JCas aJCas) {<br />
// Faire quelque chose<br />
}<br />
}</span></blockquote><div><b>Création du code métier au sein de la méthode <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">process</span></b></div><div><br />
</div><div>La méthode <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">process</span> reçoit en argument une instance de <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">JCas</span> laquelle constitue le document analysé ainsi que toutes les annotations qui y ont été associées lors d'éventuelles précédentes analyses. Le <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">JCas</span> fournit une approche JNI (<i>Java Native Interface</i>) pour la manipulation des objets <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">CAS</span> et de leur propriétés (i.e.~avec des <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">new</span>, des <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">getter/setter</span>, ... Le framework UIMA se charge de passer le CAS d'un composant à un autre.</div><div><br />
</div><div>Pour cet exercice, l'analyseur devra ajouter une nouvelle annotation <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">Opinion </span>délimitée aux offsets (<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">begin </span>et <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">end</span>) de toutes les phrases <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">SentenceAnnotation </span>contenant des mots <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">TokenAnnotation </span>qui sont des verbes (<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">posTag</span> débutant par <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">"vb"</span> égal à <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">"bez"</span>) ou dont la forme de surface <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">coveredText </span>est "<i>we</i>" ou "<i>our</i>". On ajoutera aussi le nombre de mots contenu dans l'opinion <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">length.</span></div><div><br />
</div><div><div>L'algorithme que je propose d'implémenter est le suivant :</div></div><div><ol><li>récupération d'un index de phrases <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">SentenceAnnotation</span></li>
<li><span class="Apple-style-span" style="font-family: inherit;">parcourir l'index de phrases et pour chacune, </span></li>
<ol><li><span class="Apple-style-span" style="font-family: inherit;">récupérer un sous index de mots </span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">TokenAnnotation</span></li>
<li><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"><span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small;">parcourir l'index de mots et pour chaque mot</span></span></li>
<ol><li>définir un booléen à vrai si un mot a son trait <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">posTag </span>débutant par <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">"vb"</span> égal à <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">"bez"</span></li>
<li>définir un booléen à vrai si un mot a son trait forme de surface <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">coveredText </span>est "<i>we</i>" ou "<i>our</i>".</li>
<li>incrémenter un compteur de mots</li>
</ol><li>si les deux booléens sont vrais alors</li>
<ol><li>créer une nouvelle annotation <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">Opinion </span>aux offsets (<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">begin </span>et <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">end</span>) de la phrase courante</li>
<li>initialiser les valeurs <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">begin,</span> <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">end </span>et <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">length</span><span class="Apple-style-span" style="font-family: inherit;"> de cette annotation</span></li>
</ol></ol></ol></div><div><div><span class="Apple-style-span" style="font-family: inherit;">La </span>récupération d'un index de phrases <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">SentenceAnnotation</span> peut se réaliser à l'aide de la méthode <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">getAnnotationIndex</span> appliquée au <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">JCas</span> et qui prend en argument le type d'annotation souhaité. Le parcourir de l'index de phrases peut se réaliser à l'aider d'un <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">Iterator</span>. </div><div></div><div>Cela doit donner quelque chose comme :</div></div><blockquote class="tr_bq"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">AnnotationIndex<annotation> aSentenceAnnotationAnnotationIndex = aJCas.getAnnotationIndex(SentenceAnnotation.type);</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">Iterator<annotation> aSentenceAnnotationIterator = aSentenceAnnotationAnnotationIndex.iterator(); </span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">while (aSentenceAnnotationIterator.hasNext()) { </span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"> SentenceAnnotation aSentenceAnnotation = (SentenceAnnotation) aSentenceAnnotationIterator.next();</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"> // Faire quelque chose</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">}</span></blockquote></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-family: inherit;">L'ajout du précédent code lève des erreurs de dépendances non importées (</span></span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">AnnotationIndex, </span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">Iterator, </span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">SentenceAnnotation</span>). Elles se résolvent très facilement par un left-click sur la petite croix rouge dans la marge de gauche au niveau de chaque erreur détectée et en optant pour le bon import.<br />
Cette action sera à reproduire avec le code à venir.</div><div><br />
</div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-family: inherit;">La récupération d'un index d'annotations couvertes par une autre annotation peut se faire à l'aide de la méthode </span></span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">subiterator</span> qui s'applique sur un index d'annotations et qui prend en argument l'annotation recouvrante.<br />
Elle requiert la création d'un index d'annotations. Pour notre besoin, un index de mots <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">TokenAnnotation </span>peut suffire. Il se construit comme l'index de phrases vu ci-dessus. On décide de récupérer l'index de toutes les annotations pour varier les plaisirs. Il faudra alors ne considérer que les annotations mots qui nous intéressent.<br />
L'instruction suivante réalise cela. On la place au même niveau que la construction d'index de phrases.<br />
<span class="Apple-style-span"></span><br />
<span class="Apple-style-span"><span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">AnnotationIndex<annotation> anAnnotationIndex = aJCas.getAnnotationIndex();</span></span><br />
<span class="Apple-style-span"></span><br />
<div style="font-family: inherit;"><span class="Apple-style-span"><br />
</span></div><div><span class="Apple-style-span"><span class="Apple-style-span" style="font-family: inherit;">A l'intérieur de la boucle, pour chaque phrase on récupère un </span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">FSIterator</span><span class="Apple-style-span" style="font-family: inherit;"> (qui est un iterator un peu spécial sur ce type de structure) sur les annotations couvertes par la phrase courant </span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">aSentenceAnnotation</span><span class="Apple-style-span" style="font-family: inherit;">.</span></span></div><div style="font-family: inherit;"><span class="Apple-style-span">Cela donne </span></div><div><blockquote class="tr_bq"><span class="Apple-style-span"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">FSIterator<annotation> anySubSentenceAnnotationFSIterator = anAnnotationIndex.subiterator(aSentenceAnnotation);<br />
while (anySubSentenceAnnotationFSIterator.hasNext()) {<br />
Annotation aSubSentenceAnnotation = (Annotation) anySubSentenceAnnotationFSIterator.next();<br />
// Faire quelque chose<br />
}</span></span></blockquote></div></div><div><span class="Apple-style-span">Si l'annotation couverte courante </span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">aSubSentenceAnnotation </span><span class="Apple-style-span">est un</span><span class="Apple-style-span" style="font-family: inherit;"> </span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">TokenAnnotation </span>alors on teste si un mot a son trait <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">posTag </span>débutant par <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">"vb"</span> égal à <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">"bez" </span>et si un mot a son trait forme de surface <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">coveredText </span>est "<i>we</i>" ou "<i>our</i>" et l'on compte le mot.<br />
Cela correspond au code ci-dessous<br />
<br />
<blockquote class="tr_bq"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">if (aSubSentenceAnnotation.getClass().getName().equalsIgnoreCase("org.apache.uima.TokenAnnotation")) {<br />
TokenAnnotation aWord = (TokenAnnotation) aSubSentenceAnnotation;<br />
if (aWord.getPosTag().toLowerCase().startsWith("vb") || aWord.getPosTag().equalsIgnoreCase("bez")) {<br />
containsAVerb = true;<br />
}<br />
if (aWord.getCoveredText().equalsIgnoreCase("our") || aWord.getCoveredText().equalsIgnoreCase("we")) {<br />
containsAKeyword = true;<br />
}<br />
wordCounter++;<br />
}</span></blockquote><br />
Pour que ce code fonctionne il faut rajouter quelques déclarations de variables avant la boucle de parcours des annotations couvertes par l'annotation phrase courante.<br />
<br />
<blockquote class="tr_bq"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">boolean containsAVerb = false;<br />
boolean containsAKeyword = false;<br />
int wordCounter = 0;</span></blockquote></div><div><div><span class="Apple-style-span">Pour chaque phrase </span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">aSentenceAnnotation </span>parcourue on teste si les présences d'un mot clef et d'un verbe sont confirmées. Dans la positive, on créer une nouvelle annotation <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">Opinion</span>. On définit ses traits <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">begin</span> et <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">end</span> en fonction des <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">begin</span> et <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">end</span> de la phrase courante. On définit aussi la longueur <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">length</span> de l'opinion. Et au final on ajoute l'annotation ainsi créée à l'index des annotations à l'aide de la méthode <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">addToIndexes</span>.<br />
Ce qui donne le code suivant :<br />
<blockquote class="tr_bq"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"><span class="Apple-style-span">if ((containsAKeyword) && (containsAVerb)) {</span><span class="Apple-style-span"> Opinion aOpinion = new Opinion(aJCas);</span><span class="Apple-style-span"> aOpinion.setBegin(aSentenceAnnotation.getBegin());</span><span class="Apple-style-span"> aOpinion.setEnd(aSentenceAnnotation.getEnd());</span><span class="Apple-style-span"> aOpinion.setLength(wordCounter);</span><span class="Apple-style-span"> aOpinion.addToIndexes();</span><span class="Apple-style-span">}</span></span><br />
<div><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"><span class="Apple-style-span"><br />
</span></span></div></blockquote></div></div>Nicolas Hernandezhttp://www.blogger.com/profile/11685903401452574118noreply@blogger.com0tag:blogger.com,1999:blog-318866257749890342.post-29243772649994808052012-01-05T09:13:00.000-08:002012-01-05T09:13:14.894-08:00Définir les types de données (type system) à manipuler au sein d'un composant UIMA<div><div>Ce post est en lien avec le post <a href="http://enicolashernandez.blogspot.com/2012/01/developper-son-premier-composant-uima.html">Développer son premier composant UIMA : l'Analysis Engine (AE)</a> </div></div><div><br />
</div><div><div>La première étape pour développer un composant est de définir les types de données qu'il va manipuler. </div><div><b><br />
</b></div><div><b>Création du descripteur et des types de données à manipuler </b></div></div><div><br />
</div><div><span class="Apple-style-span">En lien avec notre exercice, nous allons définir le type d'annotation <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">opinionRecognizer.types.Opinion</span> qui correspondra au type des annotations produites par notre composant d'analyse. On lui ajoutera un trait (<i>feature</i>) <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">length</span> qui indiquera le nombre de mots contenu dans l'annotation </span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">Opinion</span><span class="Apple-style-span"> courante. Par simplicité nous ne rappellerons pas par la suite le nom de package (<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">opinionRecognizer.types</span>) qui précède le nom du type.</span></div><div><br />
</div><div><div>D'abord créons le fichier descripteur :</div><div>Les fichiers descripteurs de systèmes de types et d'AE se placent dans le répertoire <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">desc</span>. Pour s'y retrouver ultérieurement parmi les descripteurs qui seront disponibles dans le CLASSPATH, je vous conseille de créer un sous répertoire portant le nom de votre projet (en respectant les conventions de nommage Java), par exemple ici : <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">opinionRecognizer</span>.</div><div><ol><li>Faire un clic-droit sur le répertoire desc (ou sur le sous-répertoire que vous venez de créer si vous avez suivi mon conseil).</li>
<li>Choisir le menu 'New'-'Other...'-'UIMA'-'Type System Descriptor File'.</li>
<li>A l'écran suivant, donner un nom au fichier descripteur de types par exemple <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">opinionRecognizer</span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">TS.xml</span>. Là encore par convention et pour s'y retrouver plus tard je vous conseille d'utiliser le suffixe <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">TS</span> pour vos noms de fichier descripteur de systèmes de types.</li>
</ol></div><div>Ensuite, une fois le fichier créé, ajoutons le type désiré <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">opinionRecognizer.types.Opinion</span> : </div><div><ol><li>Dans l'onglet <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">Type System</span> du descripteur, ajouter un type avec le bouton <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">Add Type</span>.</li>
<li>Donner lui le nom de <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">opinionRecognizer.types.Opinion</span></li>
<li>Le faire hériter du type <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">uima.tcas.Annotation</span> défini par le framework UIMA et qui permet d'hériter des traits <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">begin</span>, <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">end</span> et <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">coveredText</span>. Le trait <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">coveredText</span> est un trait un peu particulier parce que l'on ne peut y accéder qu'en lecture. Il retourne le texte de l'artifact couvert entre les offsets délimités par les valeurs entières <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">begin</span> et <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">end</span>.</li>
</ol><div>Ajoutons aussi une <i>feature</i> au type :</div><div><ol><li>En sélectionnant le type, cliquer sur le bouton <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">Add..</span>.</li>
<li>Donner lui le nom de <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">length</span> qui indiquera le nombre de mots contenu</li>
<li>Faire hériter du type simple <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">Integer</span>.</li>
</ol><div>Puisque nous manipulons aussi les types mot, <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">org.apache.uima.TokenAnnotation</span>, et phrase, <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">org.apache.uima.</span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">SentenceAnnotation</span>, qui sont des <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">uima.tcas.Annotation</span> et le trait <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">posTag</span> (<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">String</span>) du type <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">TokenAnnotation</span> dont les annotations auront été produits par les composants de prétraitement, il nous faut aussi ajouter ces types. Le faire.</div></div></div><div><br />
</div><div><b>Génération automatique des l'API JAVA du système de types</b></div><div><b><br />
</b></div><div>Une fois le fichier de descripteur de systèmes de type créé et sauvé, une API java permettant de manipuler les types (et les traits) est automatiquement générée. </div><div><br />
</div><div>Si jamais vous craignez que cette API ne soit pas générer ou que vous vouliez forcer sa re-génération, cliquer sur le bouton <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">JCasGen</span> présent dans l'éditeur du fichier Système de Type.</div><div><br />
</div><div><span class="Apple-style-span">Les fichiers </span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">Opinion.java</span><span class="Apple-style-span"> et </span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">Opinion_Type.java</span><span class="Apple-style-span"> sont générés dans le sous répertoire </span> <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">opinionRecognizer.types </span><span class="Apple-style-span">du répertoire </span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">src </span>du projet. </div><div><span class="Apple-style-span">Le fichier </span><span class="Apple-style-span"> </span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">Opinion.java</span><span class="Apple-style-span"> contient le constructeur de type. </span><span class="Apple-style-span">Noter la présence d'accesseurs pour modifier la valeur des attributs du type </span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">Opinion</span><span class="Apple-style-span"> (par exemple les méthodes </span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">getLength() </span><span class="Apple-style-span">et </span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">setLength(int v)</span>).</div></div>Nicolas Hernandezhttp://www.blogger.com/profile/11685903401452574118noreply@blogger.com0tag:blogger.com,1999:blog-318866257749890342.post-19747507948314089122012-01-04T09:11:00.000-08:002012-01-05T09:20:01.641-08:00Développer son premier composant UIMA : l'Analysis Engine (AE)<b><span class="Apple-style-span" style="font-size: large;">Objectifs </span></b><br />
Ce post présente ce qu'est le composant élémentaire de toute chaîne de traitement d'analyse UIMA à savoir l'Analysis Engine (AE). Il explique de quoi il se compose techniquement, et comment développer ses différentes parties.<br />
Il s'agit entre autres de prendre en main l'API et les outils UIMA pour réaliser des opérations classiques : telles que définir des types d'annotation, générer automatiquement l'API pour manipuler les types d'annotations définis, récupérer des annotations posées par d'autres annotateurs, consulter et définir les valeurs de traits d'une annotation, créer une nouvelle annotation, créer un fichier XML descripteur et tester un composant.<br />
Pour illustrer cet exercice de développement on cherchera à développer la fonction de reconnaissance de phrases qui expriment une opinion. On posera l'hypothèse qu'une phrase qui contient des verbes et des mots dont la forme de surface comme "<i>we</i>" ou "<i>our</i>" est une expression d'opinion... On utilisera pour cela quelques AE disponibles dans les Apache Uima Addons. On testera l'AE sur les textes présents dans le répertoire <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">UIMA_HOME/examples/data</span> notamment <i>Apache_UIMA.txt. </i>De fait nous travaillerons sur l'anglais pour cet exercice.<br />
<i><br />
</i><br />
<b><span class="Apple-style-span" style="font-size: large;">Prérequis</span></b><br />
<div><br />
</div><div>Il est nécessaire d'avoir réaliser les tutoriels suivant :</div><ul><li>Savoir <a href="http://enicolashernandez.blogspot.com/2010/03/construire-une-chaine-de-traitement.html">construire une chaîne de traitement sous Eclipse sous la forme d'un <i>Aggregate d'Analysis Engine</i></a> (<i>AAE</i>)</li>
<li>Savoir<a href="http://enicolashernandez.blogspot.com/2009/12/comment-executer-des-chaines-de.html"> exécuter une chaîne de traitement</a> (sous Eclipse, en ligne de commande ou via le DocumentAnalyzer GUI)</li>
</ul><div>Tel que l'explique ces précédents posts, il faudra avoir au préalable construit et avoir à disposition une chaîne que nous appellerons de <i>pré-traitement</i> et qui sera composée des Apache UIMA addons suivant : </div><div><ul><li>WhiteSpaceTokenizer qui découpe en mots, TokenAnnotation, et phrases, SentenceAnnotation, un texte fourni en entrée</li>
<li>Tagger qui rajoute un trait posTag aux TokenAnnotation</li>
</ul><div><span class="Apple-style-span" style="font-size: large;"><b>Qu'est ce qu'un composant UIMA de type Analysis Engine et à quoi cela sert ?</b></span></div></div><div>Un <i>Analysis Engine</i> (AE) est le composant élémentaire d'une chaîne de traitements UIMA. Il a généralement pour objet une tâche d'<i>analyse</i> (par exemple reconnaître si une phrase est une expression d'une opinion) sur ce que l'on appelle un <i>artifact</i> (par exemple un texte). Il reçoit les <i>résultats d'analyse</i> de précédents composants (par exemple un découpage en phrases, en mots, la reconnaissance des étiquettes grammaticales (nom, verbe, adjectif...)) qui lui servent de base pour ses traitements afin qu'il puisse à son tour associer à l'artifact le résultat d'analyse qu'il produit (par exemple les opinions). On appelle les résultats d'analyse, des <i>meta-données ou des annotations</i>. L'ensemble formé par l'artifact et les méta-données constitue la <i>structure commune d'analyse (CAS ou Common Analysis Structure</i>) et est LA structure de donnée qui transite d'un composant à un autre.</div><div><br />
</div><div><span class="Apple-style-span" style="font-size: large;"><b>De quoi est constitué un composant UIMA ?</b></span></div><div>Un composant UIMA est logiquement constitué de trois éléments :</div><div><ul><li>la définition des types des données que le composant manipule (lit et crée), on appelle cela le<i> système de types (TS ou type system),</i></li>
<li>le code métier qui réalise la fonction souhaitée,</li>
<li>un descripteur indiquant au framework UIMA comment utiliser le composant.</li>
</ul></div><div>Le système de types et le descripteur du composant sont des fichiers XML que l'on peut éditer avec des interfaces graphiques via les plugins Eclipse de UIMA. La définition du système de type entraîne la génération automatique d'une API pour manipuler les types de données définis au sein du code métier.</div><div><br />
</div><div>L'ensemble de ces éléments doit se trouver accessible via le CLASSPATH de l'application qui exécute. En général, on encapsule ces éléments au sein d'une même archive Jar.</div><div><br />
</div><div><b><span class="Apple-style-span" style="font-size: large;">Préparer un projet Java sous Eclipse pour accueillir le développement de votre composant</span></b></div><div><b><span class="Apple-style-span" style="font-size: large;"><br />
</span></b></div><div>Il vous faut un projet Java sous Eclipse pour accueillir le développement de votre composant. Différentes options : </div><div><ul><li>vous pouvez utiliser celui précédemment créé pour la chaîne de prétraitement </li>
<li>ou bien vous <a href="http://enicolashernandez.blogspot.com/2010/03/creer-un-projet-eclipse-pour-le.html">créez un nouveau projet comme indiquer ici</a> mais il vous faudra alors déclarer une dépendance vers soit le projet qui contient votre chaîne de prétraitement soit vers le jar que vous aurez exporté à partir de celle-ci. Pour déclarer la dépendance au projet, <i>Click </i>droit sur le projet<i>, Build path, Configure build path, </i>Onglet<i> Projects, Add</i> les projets<i>, Ok, OK...</i></li>
</ul><div><b><span class="Apple-style-span" style="font-size: large;">Les étapes du développement</span></b><br />
<ol><li><a href="http://enicolashernandez.blogspot.com/2012/01/definir-les-types-de-donnees-type.html"><b><span class="Apple-style-span" style="font-size: large;">Définition des types de données (type system) à manipuler au sein d'un composant UIMA</span></b></a></li>
<li><span class="Apple-style-span" style="font-size: large;"><b><a href="http://enicolashernandez.blogspot.com/2012/01/implementer-le-code-metier-dun.html">Implémentation du code métier d'un composant Analysis Engine</a></b></span></li>
<li><b><span class="Apple-style-span" style="font-size: large;"><a href="http://enicolashernandez.blogspot.com/2012/01/definition-dun-descripteur-primitif.html">Définition d'un descripteur primitif d'Analysis Engine</a> </span></b></li>
</ol></div><div><br />
</div></div><div><div><div><div><span class="Apple-style-span" style="font-size: large;"><b>Exécuter votre AE au sein d'un Aggregate</b></span><br />
<br />
Au sein du répertoire <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">desc/opinionRecognizer </span>créer un descripteur aggregate qui ajoute en pipeline le descripteur de pretraitement et le descripteur de votre AE. N'oubliez pas de changer les capabilities.<br />
Et exécutez le.</div></div></div></div><div><b><span class="Apple-style-span" style="font-size: large;"><br />
</span></b><br />
<b><span class="Apple-style-span" style="font-size: large;">Pour aller plus loin</span></b></div><div><ul><li>la création et la récupération de vues,</li>
<li>la définition des paramètres au sein du descripteur et leur accès au sein du code, </li>
<li>la déclaration et la manipulation de ressources partagées par plusieurs instances d'un même AE,</li>
<li>le parcours d'index d'annotations à l'aide de contraintes</li>
</ul></div><div><span class="Apple-style-span" style="font-size: large;"><b>Remerciement</b></span></div><div>Le contenu décrit sur cette page s'inspire, adapte, étend le support créé pour le tutoriel qui a eu lieu à <a href="http://uima.apache.org/lsm09.html">UIMA@RMLL'09</a> ainsi que le <a href="http://uima.apache.org/d/uimaj-2.4.0/tutorials_and_users_guides.html#ugr.tug.aae.getting_started">tutoriel Getting started de la documentation d'Apache UIMA</a>.</div><div>Je vous invite à consulter ces différentes sources pour des informations complémentaires</div><div><br />
</div><blockquote class="tr_bq"><br />
</blockquote>Nicolas Hernandezhttp://www.blogger.com/profile/11685903401452574118noreply@blogger.com0tag:blogger.com,1999:blog-318866257749890342.post-84468853593418524342011-12-10T15:58:00.000-08:002011-12-11T05:53:32.084-08:00Mise en correspondance de vues via un Aggregate pour interconnecter des composants UIMA (view et sofa name mapping)Après avoir rappelé quelques notions (que le lecteur averti peut ne pas lire), le post expose brièvement le problème et présente avec un exemple la mise en oeuvre d'une solution de mise en correspondance de vues au sein d'un Aggregate.<br />
<br />
<b>Bref rappel de quelques notions</b><br />
<div>Les chapitres 5 et 6 de la documentation UIMA tutorials_and_users_guides [1;2] rappellent les définitions des notions d'<i>Artifact, Sofa et View</i>.<br />
Brièvement <i>l'Artifact</i> est la chose non structurée que l'on souhaite analyser. Le <i>Sofa (Subject of Analysis</i>) est une représentation de <i>l'Artifact</i> (e.g. HTML). Une <i>annotation metadata</i> est de l'information associée à un <i>Sofa</i> particulier pour en décrire une sous région. La notion de <i>View</i> simplifie les choses quand plusieurs versions de <i>l'Artifact</i> sont nécessaire à différentes étapes de l'analyse (e.g. une version sans balise d'un document XML). Les notions de <i>Sofa</i> et de<i> CAS View</i> sont liées. Dans l'implémentation Apache actuelle (2.4), à chaque <i>Sofa</i> est associé une seule <i>View</i> et à chaque <i>View</i> un seul <i>Sofa</i>. Le nom qui désigne une vue particulière est <i>Sofa</i> name pour des raisons historiques mais cela s'applique indifféremment à <i>View</i> aussi.<br />
<div>L'analyse d'un composant UIMA (AE - Analysis Engine) porte toujours sur une vue. Il peut y en avoir plusieurs. L'AE peut en créer. Les résultats d'analyse peuvent être associés sur les vues traitées ou bien sur les vues créées.</div><div>Un AE qui travaille seulement sur une seule vue est appelée "<i>single-view component"</i> et dans le cas contraire "<i>multi-view/multi-sofa component"</i>.<br />
Par défaut, si rien n'est spécifié il y a qu'une seule view et celle-ci a le sofa name de "<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">_InitialView</span>".<br />
<br />
<b>Problème d'interopérabilité pour interconnecter des composants développés indépendamment</b><br />
Le développeur d'AE est libre de choisir le nom qu'il souhaite pour désigner ses vues d'entrée et ses vues de sortie.<br />
Cela conduit naturellement à quelques petits soucis lorsque l'on veut interconnecter des composants ayant des noms de vue différents.<br />
<br />
<b>Le mécanisme de mise en correspondance des vues au niveau d'un Aggregate</b><br />
La section 6.4 de la documentation explique et présente différentes situations de mises en correspondance : au sein d'un Aggregate, d'un CPE, d'une application UIMA, pour des services distants. Je rapporte et illustre la solution au sein d'un AE Aggregate.<br />
<br />
Pour cela, j'utilise deux composants :<i> l'XmlDetagger</i> présent dans les exemples fournis avec Apache UIMA [4] et le <i>Whitespace Tokenizer</i> des addons de la Sandbox d'Apache UIMA [5].<br />
<br />
<i>L'XmlDetagger</i> est un composant multiple vues qui retire les balises d'un document XML. Il lit l'XML d'une vue input nommée "<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">xmlDocument</span>". Le contenu textuel est écrit dans une nouvelle vue output appelée "<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">plainTextDocument</span>".<br />
Le <i>Whitespace Tokenizer</i> est un composant simple vue qui travaille sur la vue par défaut (i.e. "<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">_InitialView</span>") et qui ajoute à celle-ci des annotations de phrases et de tokens.<br />
<br />
Rapidement, je mets en place un projet Java sous Eclipse. J'y ajoute la UIMA Nature, déclare les répertoires <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">desc</span> et <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">resources</span> dans le <i>build path</i> ainsi que les bibliothèques de UIMA [6]. Je rajoute au le <i>build path</i> les bibliothèques<i> uima-examples</i> [10] et <i>addon whitespace tokenizer</i> [9] qui vont servir pour notre chaîne.<br />
<br />
Je crée un descripteur d'AE Aggregate [7] et j'y ajoute <i>by name</i> en pipeline : d'abord <i>l'XmlDetagger</i> puis le <i>Whitespace Tokenizer </i>(je déclare les bons types à produire en output dans les <i>capabilities</i>).<br />
<br />
A la sauvegarde le message suivant s'affiche<br />
<blockquote class="tr_bq"><i>Error in AE Descriptor<br />
The Descriptor is invalid for the following reason:<br />
ResourceInitializationException: The output Sofa "plainTextDocument" in component "XmlDetagger" is not mapped to any output Sofa in its containing aggregate, "demoSofaNameMappingAAE". (Descriptor path ...) </i></blockquote><br />
Ce n'est pas réellement une erreur si l'on sait ce que l'on fait. Une vue qui n'est pas utilisée par exemple n'a pas besoin d'être mise en correspondance dans l'Aggregate.<br />
En l'état si on exécute cet AE avec le DocumentAnalyzer [8] sur un document XML quelconque, on obtiendra l'erreur suivante :<br />
<blockquote class="tr_bq"><i>org.apache.uima.analysis_engine.AnalysisEngineProcessException: Annotator processing failed. Caused by: org.apache.uima.cas.CASRuntimeException: No sofaFS with name xmlDocument found.</i> </blockquote>Vraissemblablement ici il y a des vues qui requièrent d'être mise en correspondance et cela va se faire au niveau de l'Aggregate.<br />
<br />
La première chose à faire est d'indiquer que la vue sur laquelle travaille en entrée <i>XmlDetagger,</i> à savoir <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">xmlDocument</span>, correspond à <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">_InitialView</span> dans l'Aggregate. Autrement dit, la vue d'entrée par défaut de l'Aggregate, <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">_InitialView, </span>doit être mise en correspondance avec la vue d'entrée, <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">xmlDocument, </span>de l'<i>XmlDetagger.</i><br />
Au sein du descripteur de l'Aggregate, c'est dans la section <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">capabilities</span> que l'on déclare les vues sur lesquelles on travaille (sous section<i> component capabilities</i>) et celles entre lesquelles on réalise des mises en correspondance (sous section<i> </i><i>sofaMappings</i><i>)</i>.<br />
On ajoute d'abord la vue <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">xmlDocument</span> comme input (entrée) en faisant un <i>add sofa</i> dans la<i> </i><i>component capabilities</i><i>.</i><br />
Ensuite on indique dans la sous section <i>sofaMappings</i> que pour le composant (<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">componentKey</span>) <i>XmlDetagger</i> sa vue (<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">componentSofaName</span>) <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">xmlDocument</span> correspond à la vue dans l'aggregate (<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">aggregateSofaName</span>) <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">_InitialView.</span><br />
Par les éléments <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">componentKey</span> et <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">componentSofaName</span> on désigne le composant et la vue souhaitée chez celui-ci comme devant intervenir dans un mapping. L'élément <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">aggregateSofaName</span> est la clé partagée entre les éléments sofaMapping.<br />
Cette dernière opération doit se faire pour partie à la main en éditant le source (personnellement je n'y arrive pas via l'éditeur du formulaire). Cela donne<br />
<blockquote class="tr_bq"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"><capability><br />
...<br />
<inputSofas><br />
<sofaName>xmlDocument</sofaName><br />
</inputSofas><br />
...</span></blockquote>et<br />
<blockquote class="tr_bq"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"> <sofaMappings><br />
<sofaMapping><br />
<componentKey>XmlDetagger</componentKey><br />
<componentSofaName>xmlDocument</componentSofaName><br />
<aggregateSofaName>_InitialView</aggregateSofaName><br />
</sofaMapping><br />
</sofaMappings></span></blockquote>Si on réexécute l'AE on se rend compte que ce n'est pas encore l'idéal car le <i>Whitespace Tokenizer</i> travaille sur l'<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">_InitialView</span> par défaut et traite donc ce qui correspond à l'<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">xmlDocument</span> au lieu du <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">plainTextDocument.</span><br />
On rajoute dans l'élément <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">inputSofas</span><br />
<blockquote class="tr_bq"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"><</span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">sofaName</span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">></span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">_InitialView</span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"><</span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">/sofaName</span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">></span></blockquote>et l'élément suivant<br />
<blockquote class="tr_bq"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"> <sofaMapping><br />
<componentKey>WhitespaceTokenizer</componentKey><br />
<componentSofaName>_InitialView</componentSofaName><br />
<aggregateSofaName>plainTextDocument</aggregateSofaName><br />
</sofaMapping></span></blockquote>La vue <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">plainTextDocument</span> du <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">XmlDetagger</span> n'a pas été redéfinie dans l'Aggregate, il n'y a pas d'ambiguité. Ce que produit le <i><span class="Apple-style-span" style="font-family: inherit;">XmlDetagger </span></i>au sein de sa vue output <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">plainTextDocument </span>est accessible sous ce même nom au sein de l'Aggregate qui le met en correspondance avec la vue input du<br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">WhitespaceTokenizer.</span> <br />
L'exécution fonctionne comme attendu finalement. <br />
<br />
<b>Quelques commentaires supplémentaires</b><br />
<br />
Au niveau de l'Aggregate après mise en correspondance, le nom de la vue du <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">componentSofaName</span><br />
sera renommé en le nom de la vue déclarée dans <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">aggregateSofaName.</span><br />
Les vues avec leur nom précédent ne seront plus accessibles. Une fois sérialisée en XMI, on constatera sela en cherchant la valeur de l'attribut <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">sofaID</span>.<br />
Les composants d'Apache OpenNLP sont des composants multiples vues et requièrent en général l'usage de mises en correspondance.<br />
<br />
<br />
<b>Liens</b><br />
<br />
[1] <a href="http://uima.apache.org/d/uimaj-2.4.0/tutorials_and_users_guides.html#ugr.tug.aas">5. Annotations, Artifacts & Sofas</a> <br />
[2] <a href="http://uima.apache.org/d/uimaj-2.4.0/tutorials_and_users_guides.html#ugr.tug.mvs">6. Multiple CAS Views</a> <br />
[3] <a href="http://uima.apache.org/d/uimaj-2.4.0/tutorials_and_users_guides.html#ugr.tug.mvs">6.4. Sofa Name Mapping</a><br />
[4] UIMA_HOME/examples/descriptors/analysis_engine/XmlDetagger.xml<br />
[5] <a href="http://uima.apache.org/sandbox.html#whitespace.tokenizer">http://uima.apache.org/sandbox.html#whitespace.tokenizer</a><br />
[6] <a href="http://enicolashernandez.blogspot.com/2010/03/creer-un-projet-eclipse-pour-le.html">Créer un projet Eclipse pour le développement d'un composant UIMA</a><br />
[7] <a href="http://enicolashernandez.blogspot.com/2010/03/construire-une-chaine-de-traitement.html">Construire une chaîne de traitement UIMA à partir de composants existants</a><br />
[8] <a href="http://enicolashernandez.blogspot.com/2009/12/comment-executer-des-chaines-de.html">Exécuter un traitement ou une chaîne de traitement sous UIMA (avec UIMAJ et en local)</a><br />
[9] UIMA_HOME/addons/annotator/WhitespaceTokenizer/lib/uima-an-wst.jar<br />
[10] UIMA_HOME/lib/uima-examples.jar</div></div>Nicolas Hernandezhttp://www.blogger.com/profile/11685903401452574118noreply@blogger.com0tag:blogger.com,1999:blog-318866257749890342.post-40166128016122019222011-12-07T15:04:00.000-08:002011-12-07T15:06:58.152-08:00Création d'un portail collaboratif "Texte, Discours et Document"<div style="background-color: transparent;"><div dir="ltr" id="internal-source-marker_0.3867933815345168" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"></div><div style="background-color: transparent;"><div dir="ltr" id="internal-source-marker_0.3867933815345168" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Arial; font-size: 16px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Partisan du </span><a href="http://fr.wikipedia.org/wiki/Travail_collaboratif"><span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 16px; vertical-align: baseline; white-space: pre-wrap;">travail collaboratif </span></a><span style="background-color: transparent; font-family: Arial; font-size: 16px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">au niveau scientifique, je tente la création d’un (Google) document publié sur le Web et visible en édition par tous (sans nécessité de compte) pour construire un </span><a href="https://docs.google.com/document/pub?id=1hKTG8PEH7EafYx8nr5tG2p5y6-616y5v3gIe5TMQGaE"><span style="background-color: transparent; font-family: Arial; font-size: 16px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">portail de ressources</span><span style="background-color: transparent; font-family: Arial; font-size: 16px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ayant trait à l</span><span style="background-color: transparent; font-family: Arial; font-size: 16px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">’étude, la modélisation, la reconnaissance automatique et les exploitations applicatives des mécanismes d’organisation de l’information au niveau du </span><span style="background-color: white; font-family: Arial; font-size: 16px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">”Texte, Discours et Document”</span></a><span style="background-color: white; font-family: Arial; font-size: 16px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">. </span></div><div dir="ltr" id="internal-source-marker_0.3867933815345168" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: white; font-family: Arial; font-size: 16px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Arial; font-size: 16px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Cette page est avant tout un outil personnel. Peut être cela servira t elle à d’autres ? J’invite dans tous les cas toute personne intéressée à contribuer ! </span></div><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Arial; font-size: 16px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Arial; font-size: 16px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Par ressources, j’entends appels à communication, journaux majeurs, (web|bibli)ographie, personnes, équipes, projets, outils, corpus, etc. </span></div><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Arial; font-size: 16px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Arial; font-size: 16px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Les objectifs sont la veille </span><span style="background-color: white; font-family: Arial; font-size: 16px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">au niveau national et international </span><span style="background-color: transparent; font-family: Arial; font-size: 16px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">et la cartographie du domaine selon les disciplines (traitement automatique des langues, linguistique, psycholinguistique, ingénierie des documents...) et courants théoriques.</span></div><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Arial; font-size: 16px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Les approches ayant une visée de traitement automatique seront privilégiées.</span><br />
<span style="background-color: transparent; font-family: Arial; font-size: 16px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br />
</span><br />
<span style="background-color: transparent; font-family: Arial; font-size: 16px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Le portail se trouve <a href="https://docs.google.com/document/pub?id=1hKTG8PEH7EafYx8nr5tG2p5y6-616y5v3gIe5TMQGaE">ici</a> !</span></div></div></div>Nicolas Hernandezhttp://www.blogger.com/profile/11685903401452574118noreply@blogger.com0tag:blogger.com,1999:blog-318866257749890342.post-82180307354919434662011-12-07T13:25:00.000-08:002011-12-07T13:25:14.572-08:00Ajouter un dépot (repository) Maven à votre forge Google Code grâce à Subversion<span class="Apple-style-span"><span class="Apple-style-span" style="font-family: inherit;"><span class="Apple-style-span" style="font-size: medium;"></span></span></span><br />
<div style="font-size: medium;"><span class="Apple-style-span"><span class="Apple-style-span" style="font-family: inherit;"><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span">Discutés aux deux adresses ci-dessous mais l'alternative d'utiliser un dépot public est conseillée</span></span></span></span></span></span></div><br />
<ol><li><span class="Apple-style-span" style="font-size: 12px;"><span class="Apple-style-span" style="font-family: inherit;"><span class="Apple-style-span" style="font-size: medium;"><a href="http://stackoverflow.com/questions/1280470/maven-repository-for-google-code-project">http://stackoverflow.com/questions/1280470/maven-repository-for-google-code-project</a></span></span></span></li>
<li><span class="Apple-style-span" style="font-size: 12px;"><span class="Apple-style-span" style="font-family: inherit;"><span class="Apple-style-span" style="font-size: medium;"><a href="http://www.thewebsemantic.com/2009/04/11/your-very-own-google-code-maven-repo/">http://www.thewebsemantic.com/2009/04/11/your-very-own-google-code-maven-repo/</a></span></span></span></li>
</ol>Nicolas Hernandezhttp://www.blogger.com/profile/11685903401452574118noreply@blogger.com0tag:blogger.com,1999:blog-318866257749890342.post-15852240733891255752011-12-07T13:20:00.000-08:002011-12-07T13:20:05.454-08:00Mesurer le nombre de visites sur votre projet hébergé sous Google Code grâce à Google AnalyticsCe post décrit la procédure pour "track visits to Google code projects in <a href="http://www.google.com/analytics/">Google Analytics</a>".<br />
<ol><li>Anyone may sign up for a free Google Analytics account. Once you have an account</li>
<li>Add a profile for a new domain and specify URL <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">http://code.google.com/</span></li>
<li>Edit the profile that you just created to change its Website URL to <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">http://code.google.com/p/votre-nom-de-projet/</span> </li>
<li>Paste your Google Analytics profile's Web Property ID below and save changes. </li>
<li>About 24 hours after you add your Web Property ID, your profile should begin to indicate that it is receiving data.</li>
</ol><ol></ol>Nicolas Hernandezhttp://www.blogger.com/profile/11685903401452574118noreply@blogger.com0tag:blogger.com,1999:blog-318866257749890342.post-55607094338803787712011-12-07T13:11:00.000-08:002011-12-07T13:11:58.160-08:00Publier une Javadoc sous forge Google CodeLa procédure est la suivante<br />
<ol><li><span class="Apple-style-span" style="font-family: inherit;">Récupérez la racine du projet</span></li>
<ul><li><span class="Apple-style-span" style="font-size: x-small;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">svn checkout</span></span><span class="Apple-style-span" style="font-size: x-small;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> </span></span><span class="Apple-style-span" style="font-size: x-small;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">https://</span></span><span class="Apple-style-span" style="font-size: x-small;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">votre-nom-de-projet</span></span><span class="Apple-style-span" style="font-size: x-small;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">.googlecode.com/svn/ votre-nom-de-projet --username votre.username</span></span></li>
<li><span class="Apple-style-span" style="font-size: x-small;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">cd </span></span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: small;">votre-nom-de-projet</span></li>
</ul><li>Ajoutez un répertoire javadoc au versionning</li>
<ul><li><span class="Apple-style-span" style="font-size: x-small;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">svn mkdir </span></span><span class="Apple-style-span" style="font-size: x-small;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">javadoc </span></span></li>
</ul><li>Réalisez l'export de la javadoc via Eclipse se sera plus simple<span class="Apple-style-span" style="font-family: inherit;"></span></li>
<li>Ajoutez les fichiers javadoc au versionning</li>
<ul><li><span class="Apple-style-span" style="font-size: x-small;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">svn add javadoc/*</span></span></li>
</ul><li>Ajoutez les propriétés adéquates pour que svn interprète les fichiers de la javadoc avec le bon type mime</li>
<ul><li><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">find javadoc -name "*.html" -exec svn propset svn:mime-type text/html {} + ;</span></li>
<li><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">find javadoc -name "*.css" -exec svn propset svn:mime-type text/css {} + ;</span></li>
<li><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">find javadoc -name "*.jpeg" -exec svn propset svn:mime-type image/jpeg {} + ;</span></li>
</ul><li><span class="Apple-style-span" style="font-family: inherit;">Commitez vos ajouts</span></li>
<ul><li><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">svn commit javadoc/ -m "ajout de la javadoc"</span></li>
</ul><li><span class="Apple-style-span" style="font-family: inherit;">Votre javadoc devrait être désormais accessible via l'url </span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="font-size: x-small;">http://votre-nom-de-projet.googlecode.com/svn/javadoc/index.html</span></span><span class="Apple-style-span" style="font-family: inherit;"> ; ajoutez ce lien dans la section de links de </span><i><span class="Apple-style-span" style="font-family: inherit;">Administer > </span></i><i><span class="Apple-style-span" style="font-family: inherit;">Project Summary</span></i></li>
</ol>Nicolas Hernandezhttp://www.blogger.com/profile/11685903401452574118noreply@blogger.com1