lundi 24 mai 2010

Moteur de recherche, Lémmatisation , pretraitement ...


J'ai bossé ces deux derniers jours sur un nouvel outil fonctionnel en C, j'ai finalement réussi à ecrire une mini-librairie qui se charge de pré-traiter des articles, si je vous parle de pré-traitement c'est qu'il y aura forcement du traitement derrière, avant d'introduire cette librairie parlons d'abord un peu du context dans lequel ce travail a été effectué ...

Nous nous sommes interessés dans le cadre d'un projet à l'INSA à l'élaboration d'un module de traitement et de classification de textes. Quand je parle de classification, je fais allusion à tout ce qui utilise une base de donnnée d'articles, de templates, de models dans un but bien précis, celui par exemple d'identifier l'appartenance d'un article à une catégorie ... Nous travaillons à plusieurs sur ce projet, et la repartition des tẽches a voulu que je travaille sur la partie la plus générique, celle du pré-traitement,

En quoi consiste ce prétraitement ou encore en quoi consiste cette généricité?

Les moteurs de recherches actuels se base sur des algorithmes sémantiques qui parsent tout type de contenu disponible sur le web, principalement du texte, quand je dis texte, ça peut aussi bien aller du contenu réel d'un site que de méthadonnées decrivants le contenu du site. Quelque soit le type de traitement qu'on devra effectuer sur un contenu, ce dernier devra forcement subir auparavant un filtrage.

Avant de parler plus en detail de ce filtrage, je reviens sur le concept de généricité dont j'ai parlé un petit peu plus haut.
Quelque soit le type de traitement qu'on veut effectuer : recherche de mots clefs, classification et catégorisation de données (sites ou documents par exemples), ou autre chose
le pré-traitement effectué reste le mẽme, on s'interesse d'abord à ne prendre en considération que le contenu utile au traitement. Si on parle de contenu utile là ,c'est qu'il existe des mots inutiles, je vous donne un exemple. Lorsqu'un parseur d'un SearchEngine ^^ (désolé pour le franglais) parse un contenu ecrit en anglais, il tombera sur des mots qui ne lui seront pas d'une grand utilité, encore plus qui faussent l'operation, pour la recherche de mots clefs par exemple, on commencera par chercher les mots les plus redondants en prenant aussi en considération les synonymes. Le moteur tombera forcement sur des determinants, des pronoms qui se repetent très souvent dans n'importe quel contenu, une premiere operation de pré-traitement consistera à filtrer tout le contenu et à ne garder que l'information utile.

Dans notre cas, nous disposions d'une base de données d'articles (au format XML), provenant d'hyperGéo, en deux langues, francais et anglais, nous avions tout d'abord pensé à referencer tout ce qui peut constituer un terme inutile dans les deux langues, technologiquement parlant et vu que je disposais à la base d'article au format xml, j'ai préféré travailler sur le meme format : (lien vers les fichiers)

Aussi j'avais parlé au debut de mini-librairie, mini; car car elle se base elle aussi sur d'autres libraries, libXml2 utilisée pour parser, lire et modifier tout contenue au format xml et StemmerLibrary http://snowball.tartarus.org/texts/stemmersoverview.html qui comme son nom l'indique effectue toute opération de lémmatisation plus que necessaire, pour que notre moteur puisse detecter et reperer des relations entre plusieurs termes appartenant à des contenus differents. Il ne devra prendre en considaration que le lemme de ces termes sinon, vous modifiez juste le temps auquel le verbe est comjugé ou tout simplement en mettant un mot au pluriel et il ne considerera plus le mot comme le mẽme.

voilà, donc en gros, et puisqu'on bosse toujours dessus, j'arrive pour l'instant à l'aide de cette nouvelle librarie (celle sur laquelle je bosse) à effectuer des différentes operations, il ne nous reste plus qu'à synchroniser toutes ces operations en vue de lancer une chaine d'operations de pre-traitements pour alimenter une base ou constituer une requẽte qui sera traitée par notre moteur.

Structuration de la librarie :

-libXmlIO
-libClean_

80% du travail a déja été effectuer, si vous lancez le script principal d'execution vous pourrez déja palper un exemple fonctionnel de traitement d'un contenu provenant d'HyperGeo.
N'hesitez surtout pas à aller voir sur le site officiel de libxml2 pour adapter ces portions de codes à vos propres traitements. je vous conseille aussi de commmencer à tester dès maitenant la deuxieme librarie, elle est très riche, juste pour vous donner des chiffres; elle gere pas moins de 15 langues et son utilisation reste très simple: ne vous prenez pas trop la tẽte à essayer de dechiffrer tout le code source, jettez juste un petit coup d'oeil sur libstemmer.h et impregnez vous des méthodes proposées, et utilisez les boites noires proposées, "don't reinvent the weel" :)

Il nous reste maintenant à completer notre algorithme principal pour qu'il soit capable de lancer deux operations, la constitution d'une requẽte, c'est à dire prendre en consideration un et un seul contenu de telle sorte à pouvoir soit le classer, l'identifier par suite, ou bien encore lancer ce qu'on n'appelle la phase d'apprentissage pour tout ce qui concerne la classification de contenus.

Je vous re-donne donc rendez-vous dans une semaine sur ce mẽme article pour une librarie totalement autonome et fonctionnelle
PS : Le projet est actuellement terminé. Les fichiers sources sont maintenant dispo ICI .

Voila, si vous bossez sur un projet pareil ou si jamais vous avez déja bossé sur du sémantique n'hesitez surtout pas à partager votre experience :)

2 commentaires:

  1. Greetings from USA!
    Please visit me at:
    http://blog.sina.com.cn/usstamps
    Thanks!
    -Tong

    RépondreSupprimer
  2. bonjour, MERCI pour billet, Je vous ai envoyé un email sur msn, pourriez vous le consulter SVP.

    RépondreSupprimer