jeudi 10 février 2011

Installer LeJOS NXJ 8.5beta sous Linux Ubuntu 10.04 LTS (Lynx Lucide) via usb/bluetooth

Cette page décrit les opérations qu'il m'a fallu réaliser pour flasher ma brique lego NXT afin d'installer le firmware LEJOS à partir d'un système Linux Ubuntu 10.04. Le cas échant je précise les droits qu'il faut pour réaliser les opérations.

Attention bien que je décrive complètement toutes les opérations, il est important de consulter avant tout la page officielle
Outre la page officielle et mon expérience personnelle, cette page s'appuie aussi sur le site suivant
Les pages précédentes contiennent des éléments pour l'installation du plugin Eclipse. Voir aussi les liens suivant

Prérequis
 (requiert des droits sudo ou root pour installer)

1. Avoir un Java Development Kit (JDK) 1.5 ou 1.6 installé sur sa machine et non un Java Runtime Environment (JRE) qui n'est pas suffisant car ne vous permet pas de compiler des programmes java. Conseille le 1.6 pour certains exemples et testé seulement sur le JDK sun.
aptitude install sun-java6-jdk
Mettre à jour ces variables d'environnement PATH pour pointer vers le répertoire JDK bin (Setting up environment variables) ainsi que JAVA_HOME où se trouve installé le JDK

2. Le programme ant permettra la compilation de LeJOS (il peut être rapproché de make)
aptitude install ant
3. Afin de pouvoir compiler sans souci et utiliser les connexions usb et bluetooth, assurez vous aussi d'avoir les dépendances (principalement des driver/pilotes) suivantes installées
aptitude install libusb libusb-dev bluez libbluetooth-dev
A noter que 
Installation de Lejos
(ce qui suit peut se réaliser dans un simple compte utilisateur)

tar -xvzf lejos_NXJ_0_8_5beta.tar.gz
vous obtenez le répertoire lejos_nxj

2. Donnez les droits d'exécution au sous répertoire bin 
cd lejos_nxj 
chmod a+x bin
3. Puis compilez 
cd build
ant 
Cette opération copie deux drivers créés, libjbluez.so et libjlibnxt.so, dans le répertoire lejos_nxj/bin. D'autres résultats de compilation peuvent se trouver les répertoires lejos_nxj_native/src (jbluez libnxt  nxtvm).

4. Après compilation il vous faut déclarer et mettre à jour quelques variables d'environnement (si vous êtes toujours dans le répertoire lejos_nxj et que vous ne travaillerez que dans ce terminal jusqu'à sa fermeture
export NXJ_HOME=`pwd`
export PATH=${NXJ_HOME}/bin:${PATH}
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":${NXJ_HOME}/bin
Pour péreniser la modification, éditer votre fichier ~/.bashrc et rajouter les lignes ci-dessus en changeant la valeur de NXJ_HOME par la valeur réelle du chemin. Désormais ces variables seront définies pour tout nouveau terminal ouvert. N'oubliez pas de faire un source ~/.bashrc si vous souhaitez bénéficier de ces modifications dans le terminal où vous venez de faire ces manipulations.

5. L'étape suivante consiste à flasher votre brique lego, en tapant dans un terminal
nxjflash
Si vous obtenez le message suivant

VM file:/.../lejos_nxj/bin/lejos_nxt_rom.bin
Menu file: /.../lejos_nxj/bin/StartUpText.bin
VM size: 52752 bytes.
Menu size: 38016 bytes.
Total image size 91008/94208 bytes.
Locating device in firmware update mode.
No devices in firmware update mode were found.
Searching for other NXT devices.
No NXT found. Please check that the device is turned on and connected.
Alors branchez le cable usb de votre machine à la brique...

Si vous obtenez l'erreur suivante
Error Cannot load a comm driver
Alors réinitaliser la brique manuellement en pressant le bouton caché dans un des trous d'emboitement à l'arrière en haut à gauche de la brique. Puis tapez la commande pendant le toc répétitif.

Si maintenant vous obtenez l'erreur suivante
Error: Failed to open %%NXT-SAMBA%% in SAMBA mode
Alors réalisez l'opération en tant que root (n'oubliez pas de déclarer les variables d'environnement).

Si la manipulation en tant que root ne fonctionne pas
Alors, avec l'aide du post suivant http://ubuntuforums.org/showthread.php?t=1123633, réalisez en tant que root les commandes suivantes
rmmod cdc_acm
nxjflash
modprobe -i cdc_acm
Vous obtiendrez un beau Lejos sur votre brique si tout a bien fonctionné.

Tester votre installation

Rajouter les lignes suivantes à la suite de votre ~/.bashrc en réalisant les opérations de pérénisation décrites ci-dessus.
export CLASSPATH=${NXJ_HOME}/lib/classes.jar:${NXJ_HOME}/lib/jtools.jar:${NXJ_HOME}/lib/pccomm.jar:${NXJ_HOME}/lib/pctools.jar:${CLASSPATH}
export CLASSPATH=${NXJ_HOME}/3rdparty/lib/bcel.jar:${NXJ_HOME}/3rdparty/lib/bluecove-gpl.jar:${NXJ_HOME}/3rdparty/lib/bluecove.jar:${NXJ_HOME}/3rdparty/lib/commons-cli.jar:${NXJ_HOME}/3rdparty/lib/cpptasks.jar:${CLASSPATH}
Compilez un programme (ici le programme View qui permet de tester les moteurs et les capteurs via une interaction directe sur la brique) avec
cd projects/samples/View 
nxjc View.java 
Téléchargez le programme compilé sur la brique avec
nxj -r View 
Si vous obtenez le message suivant via une connexion usb (en supposant que le bluetooth n'est pas activé)
leJOS NXJ> Linking...
leJOS NXJ> Uploading...
leJOS NXJ> Searching for any NXT using Bluetooth inquiry
BlueCove version 2.1.0 on bluez
leJOS NXJ> Failed to find any NXTs
leJOS NXJ> Failed to connect to any NXT
an error occurred: No NXT found - is it switched on and plugged in (for USB)?
BlueCove stack shutdown completed
Alors recommencer la manipulation en tant que root...
ou bien rajouter des un groupe qui a des droits sur le port usb (la doc officielle indique comment)
Il vous faudra recompiler le programme en tant que root (donner les droits d'écriture/exécution sur le répertoire et fichiers).

Via bluetooth, après avoir

  • installé les paquets bluez et libbluetooth-dev
  • compilé lego_nxt
  • déclaré les variables d'environnement ci-dessus
  • et allumé et activé le bluetooth > power et la visibility sur la brique

Cela (nxjc et nxj) fonctionnent en simple utilisateur...
... lors de l'upload avec nxj il faudra indiquer le pin (défini dans le menu bluetooth de la brique, par défaut 1234)
Et voilà

Pour utiliser le programme 


Sur la brique
  • Bouton orange pour allumer et sélectionner une option qui s'affiche sur l'écran (descend dans l'arborescence)
  • les flèches de gauche et de droite pour naviguer dans le menu
  • le bouton rectangulaire pour revenir en arrière (remonter dans l'arborescence) et éteindre si vous êtes au niveau le plus haut
Dans Files vous verrez les programmes disponibles sur la brique (il y en a 1 qui s'appelle "view"), il peut être mis en "default"

Quand vous exécutez "view", vous pourrez tester les sensors et les motors. Allez y ca marche !

Le mode bluetooth est à activer si besoin est !


Le volume du son peut être fixé et coupé.

Ne toucher à qu'il y a dans system si seulement vous savez ce que vous faites !!!

D'autres programmes
http://lejos.sourceforge.net/nxt/nxj/tutorial/WheeledVehicles/WheeledVehicles.htm

dimanche 21 novembre 2010

Nombre d'occurrences et fréquence d'un terme

Le nombre d'occurrences d'une forme (dans un document, une collection) correspond au nombre de fois que cette forme apparaît.

La fréquence (sous entendu d'occurrence) d'une forme d'un document correspond au nombre d'occurrences de la forme dans le document relativement à la somme du nombre d'occurrences de toutes les formes (éventuellement * 100 pour avoir un poucentage) du document (on pourrait changer document par collection)

Souvent la notion de fréquence est abusivement confondue avec le nombre d'occurrences.

La somme du nombre d'occurrences de toutes les formes constitue une normalisation du nombre d'occurrences.  Le nombre d'occurrence rend compte de "l'importance" d'un terme. La normalisation du nombre d'occurrences d'un terme rend possible la comparaison de deux documents de longueurs différentes.

On peut aussi normaliser par un $log_10$ : de [1 occurrence;+inf) dans [0;4[ (à peu près).

jeudi 21 octobre 2010

Alimenter son LinkedIn, Twitter, Dokuwiki... avec un flux RSS

Dernière mise à jour : vendredi 22 octobre 2010


En tant que chercheur il est important de communiquer sur ses activités aux différentes communautés auxquelles on appartient.

Le propre du Web 2.0 est de facilement diffuser du contenu et d'en construire de nouveaux à partir d'existants (ainsi que d'en modifier aisément leur forme). C'est le principe de base des réseaux sociaux. LinkedInTwitter et Dokuwiki font parties de ces vecteurs de communication du moment.

Néanmoins on ne peut passer son temps à alimenter ces vecteurs, a fortiori quand il s'agit de diffuser la même information sur chacun d'eux !

La solution que j'ai choisie pour communiquer et éviter de perdre du temps dans la recopie des informations que je souhaite communiquer est de tenir ce blog et d'offrir un accès à son contenu à l'aide d'une syndication RSS que j'inscris aux différents réseaux sociaux que j'utilise. 

Une seule entrée et autant de sorties que les applications le permettent. Une bonne application web 2.0 doit pouvoir se nourrir de flux RSS (éventuellement filtrés par le biais des tags) ainsi que pouvoir alimenter d'autres applications.
  • Pour LinkedIn : au moins deux moyens
    • soit avec l'application blog link
    • soit  en créant un groupe, et par le menu "Manage News Feeds" ajouter le flux RSS que vous souhaitez "manger" 
  • Pour twitter http://twitterfeed.com/
  • Pour Dokuwiki, il suffit d'insérer le code suivant {{rss>http://enicolashernandez.blogspot.com/feeds/posts/default 8 author date 1h }}

jeudi 14 octobre 2010

Conférences et journaux sur les aspects ingénierie de la langue

Une version statique et perenne de ce post ici.

Conférences 
  • ICTAI : International Conference on Tools with Artificial Intelligence 
  • IAAI: Innovative Applications in AI
  • DocEng: ACM Symposium on Document Engineering
  • LREC: Language Resources and Evaluation Conference
  • AIMSA: Artificial Intelligence: Methodology, Systems, Applications
  • IJAIT: International Journal on Artificial Intelligence Tools (rang 2)

Journaux

  • Natural Language Engineering meets the needs of professionals and researchers working in all areas of computerised language processing, whether from the perspective of theoretical or descriptive linguistics, lexicology, computer science or engineering. Its aim is to bridge the gap between traditional computational linguistics research and the implementation of practical applications with potential real-world use. As well as publishing research articles on a broad range of topics ¿ from text analysis, machine translation, information retrieval and speech analysis and generation to integrated systems and multi modal interfaces ¿ it also publishes special issues on specific areas and technologies within these topics, an industry watch column and book reviews. 
  • Language Resources and Evaluation is the first publication devoted to the acquisition, creation, annotation, and use of language resources, together with methods for evaluation of resources, technologies, and applications. Language resources include language data and descriptions in machine readable form used to assist and augment language processing applications, such as written or spoken corpora and lexica, multimodal resources, grammars, terminology or domain specific databases and dictionaries, ontologies, multimedia databases, etc., as well as basic software tools for their acquisition, preparation, annotation, management, customization, and use. Evaluation of language resources concerns assessing the state-of-the-art for a given technology, comparing different approaches to a given problem, assessing the availability of resources and technologies for a given application, benchmarking, and assessing system usability and user satisfaction. 
  • La revue Document Numérique publie des articles qui concernent la gestion des documents. Dans ce cadre, il s'agit des documents vus comme supports ou comme finalité d'un processus. Cet aspect concerne les étapes du processus éditorial technique de workflow et de groupware et de reengineering des processus… Les documents sont considérés sous leurs représentations les plus diverses : document image, document révisable, document structuré, document composé d'objets. Les supports jouent un rôle important. Les outils nécessaires à chacune des étapes du processus éditorial sont décrits, ainsi que les aspects juridiques des documents numériques et les méthodes de mise en oeuvre. http://dn.revuesonline.com/ (Hermes / Lavoisier - http://www.revuesonline.com/)
  • La revue d'Ingénierie des Systèmes d'Information (ISI) est constituée de numéros thématiques faisant chacun le point sur un aspect traditionnel ou émergent dans le domaine des bases de données et des systèmes d'information. Le domaine des systèmes d'information représente « l'étude des utilisations efficaces de l'information et de son impact potentiel sur les systèmes logiciels et sur les technologies de l'information sur le monde des humains, de l'organisation et du social » (Cushing et Lucas, 1990). La revue d'Ingénierie des Systèmes d'Information est donc destinée à faire le point plusieurs fois par an sur un aspect spécifique des systèmes d'information. Dans cette optique, une personnalité reconnue du domaine sera sollicitée pour prendre la responsabilité d'un numéro spécial. http://isi.revuesonline.com/Publication en français et en anglais (Hermes / Lavoisier - http://www.revuesonline.com/ ; Revues des Sciences et Technologies de l'Information (RSTI))
  • Revue pluridisciplinaire destinée à offrir un outil de synthèse aux chercheurs et industriels français en informatique, la revue de Technique et Science Informatiques (TSI) favorise la publication rapide des travaux et fournit un support de transfert bidirectionnel des connaissances entre recherche et industrie. Les articles sont regroupés en trois rubriques scientifiques : synthèse, application et recherche. TSI, la seule revue française de haut niveau en informatique scientifique et technique : rend compte plus rapidement des évolutions scientifiques, couvre de manière plus active les différents champs de connaissance : architectures, bases de données et de connaissances, intelligence artificielle, génie logiciel, concurrence, communication, parallélisme,… réalise des numéros thématiques qui présentent systématiquement des synthèses des domaines scientifiques concernés. http://tsi.revuesonline.com/ (Hermes / Lavoisier - http://www.revuesonline.com/ ; Revues des Sciences et Technologies de l'Information (RSTI))


Sélection d'articles de ACL'2010

Sélection d'articles d'ACL'2010 sur l'analyse du discours en général




Discours

  • P10-2028 [bib]: Minwoo Jeong; Ivan Titov Unsupervised Discourse Segmentation of Documents with Inherently Parallel Structure 
  • P10-1120 [bib]: Amit Dubey The Influence of Discourse on Syntax: A Psycholinguistic Model of Sentence Processing 
  • P10-1073 [bib]: WenTing Wang; Jian Su; Chew Lim Tan Kernel Based Discourse Relation Recognition with Temporal Ordering Information 
  • P10-5003 [bib]: Bonnie Webber; Markus Egg; Valia Kordoni Discourse Structure: Theory, Practice and Use

Co-reference
  • P10-1142 [bib]: Vincent Ng Supervised Noun Phrase Coreference Research: The First Fifteen Years 
  • P10-1144 [bib]: Marta Recasens; Eduard Hovy Coreference Resolution across Corpora: Languages, Coding Schemes, and Preprocessing Information 
  • P10-1143 [bib]: Cosmin Bejan; Sanda Harabagiu Unsupervised Event Coreference Resolution with Rich Linguistic Features 
  • P10-1128 [bib]: Ryu Iida; Syumpei Kobayashi; Takenobu Tokunaga Incorporating Extra-Linguistic Information into Reference Resolution in Collaborative Task Dialogue 


lundi 4 octobre 2010

Réutiliser des outils externes via des commandes shell dans un composant UIMA

Parce que de nombreux outils de TAL non-natifs UIMA sont utilisés par la communauté, parce que ces outils ont souvent requis des investissements conséquents en fonds financiers et en temps de développement, il est  nécessaire de se poser la question de la possibilité de réutilisation de ces outils au sein de chaînes de traitement UIMA avant d'en développer des équivalents en natif.


Le présent composant UIMA shell a pour objet l'implémentation d'un Analysis Engine permettant l'exécution d'une commande shell sur un élément du CAS (Common Analysis Structure) et l'enrichissement du CAS avec le résultat du traitement. L'entrée de la commande peut être soit le SofaDataString d'une vue spécifiée, soit le texte couvert par un type d'annotation (lesquelles elles-même apparaîssent optionnellement dans certains contextes marqués par un autre type annotation). La sortie peut être produite soit sous la forme d'un SofaDataString d'une nouvelle vue créée pour l'occasion ou bien comme valeur d'une feature de type String d'une annotation spécifiée elle aussi créée pour l'occasion.



Son principal objectif est donc de permettre d'utiliser au sein d'une chaîne UIMA des outils accessibles en ligne de commande, lesquels réalisent leur traitement soit sur l'entrée standard (stdin) soit sur un fichier via son nom passé en argument et produisent leur résultat sur la sortie standard (stdout).

L'implémentation présente les caractéristiques suivantes :
  • utilisation de l'API shell de F Martini (distribuée sous licence CeCILL-C), laquelle permet de simplifier l'exécution de programme et de ligne de commande depuis Java
  • gestion de multiples formats des commandes à exécuter où la donnée à traiter peut aussi bien provenir de l'entrée standard ou constituer un fichier texte passé en argument, être récupéré du système de fichier, pipé, redirigé... 
  • traitement de la commande shell sous forme d'un thread
  • paramétrage libre et générique des éléments du CAS (view/annotation/feature) d'entrée (à traiter) et de sortie (à créer) notamment à l'aide de l'API java.lang.reflect (constitue des exemples de code générique)
La suite de ce travail pourra être la conception d'un composant type connecteur permettant de récupérer sous forme de types des informations structurées contenues dans des fichiers au format CSV-like (Comma Separated Value), XML... quelle que soit la sémantique de leur structure.

Le code source du composant est disponible sur http://code.google.com/p/uima-shell/ 

dimanche 3 octobre 2010

UIMA Type mapping

Lorsque l'on souhaite développer un composant à l'aide de l'architecture Apache UIMA, celle-ci requiert de définir les types d'information que l'on souhaite manipuler ainsi que leur organisation ; on appelle cela définir son système de types. D'un point de vue conception de logiciel, cela permet notamment de réaliser un contrôle syntaxique des entrées et des sorties des composants.

Apache UIMA offre la liberté de définir son propre système de types et par conséquent plusieurs systèmes de types peuvent être proposés pour modéliser les mêmes informations. Cette liberté de définition de systèmes de types peut donc conduire à des problèmes d'interopérabilité entre des composants manipulant des informations conceptuellement identiques mais étant en pratique définies par des modélisations distinctes.
Par exemple, wordmot voire token sont des noms différents qui peuvent éventuellement être utilisés pour désigner le même type d'information.

Le uima-type-mapper est un composant qui offre un moyen de conversion d'annotations définies par un système de type donné (appelé type source) vers des annotations définies par un autre système de types (appelés types cibles). En pratique, il permet de faire le pont entre des composants manipulant des annotations ayant des types d'information conceptuellement identiques mais de noms distincts. Les annotations produites par un premier composant peuvent être utilisées en entrée d'un second via notre composant qui réalise la conversion.

Les conversions sont déclarées à l'aide de règles qui spécifient pour des types source donnés de réaliser une opération de création d'une ou plusieurs annotations de types cible aux offsets des annotations de type source rencontrées. Il est possible de spécifier des contraintes sur les caractéristiques de annotations de type source. La cohérence sémantique des types à convertir est laissée libre à l'utilisateur.
En pratique, l'implémentation repose sur
  • W3C XPath comme langage déclaratif d'expression des contraintes sur la structure des types des annotations source
  • Apache JXPath comme moteur qui implémente le traitement des règles
  • java.lang.reflect API pour rendre générique le composant en autorisant la désignation de tout type héritant de uima.tcas.Annotation pour faire l'objet de conversion
La fonction de spécification de contraintes sur les annotations à convertir peut conduire à utiliser ce composant comme un composant d'analyse à base de règles des structures sémantiques UIMA. En effet, le composant peut être utilisé pour réaliser de la reconnaissance de motifs d'annotations au sein d'une structure d'annotations UIMA et de la réalisation d'opérations sur les(/relativement aux) motifs reconnus telles que la création d'annotations, la mise à jour d'annotations, et la suppression d'annotations. Actuellement seule la première opération est gérée, mais les fonctions déjà implémentées dans le composant en font de lui une preuve de concept.

Si vous utilisez ce travail dans vos travaux de recherche, merci de citer l'article suivant 


Nicolas Hernandez, Fabien Poulard, Matthieu Vernier, Jérôme Rocheteau, "Building a French-speaking community around UIMA, gathering research, education and industrial partners, mainly in Natural Language Processing and Speech Recognizing domains", LREC 2010 Workshop 'New Challenges for NLP Frameworks', La Valleta : Malta 
Le code source du composant disponible sur http://code.google.com/p/uima-type-mapper/