banniere.png
Document Actions

02/25/2006

Normalisation, découpage et lemmatisation d'un texte en Python

Lorsque l'objectif d'un module est d'indexer du texte, que ce soit dans le cadre d'un moteur de recherche, d'un nettoyage de texte pour le textmining par exemple, le développeur procède en général en trois étapes pour préparer le texte:
  • normalisation du texte
  • découpage du texte en mots
  • lemmatisation

Andreas Jung développe depuis des années pour Zope l'outil TextIndexNG, qui propose des modules d'extension en C pour effectuer rapidement ces trois étapes.
Ces extensions peuvent être utilisées dans n'importe quel programme Python, même en dehors du cadre de Zope.

Installation des extensions Zopyx


Téléchargez la dernière version de TextIndexNG depuis sourceforge: http://sourceforge.net/projects/textindexng, et décompressez ce tarball sur votre système, dans un répertoire temporaire si vous ne souhaitez pas installer le produit pour Zope, ou directement dans le répertoire Products de votre instance Zope.

Le répertoire décompressé contient un répertoire 'extension_modules', qui contient un script d'installation. Avant de lancer ce script, assurez vous d'avoir un compilateur C (gcc sous Linux, Visual C++ ou Mingw sous Windows).

Le script est ensuite utilisé comme suit (sous Linux):
tziade@dabox:~$ sudo python setup.py install
running install
running build
running build_py
running build_ext
running install_lib
[ un tas de lignes... ]
Si l'installation se passe bien , les modules deviennent accessibles depuis Python:
>>> from zopyx.txng3 import normalizer
>>> dir(normalizer)
['__builtins__', '__doc__', '__file__', '__name__', '__path__']


Normaliser: zopyx.txng3.normalizer


Le module normalizer permet de retirer les accents et autres particularités de language, qui ne sont pas conservées dans des algorithmes de nettoyage classiques (même si c'est discutable).

Il prend en paramètre une table de correspondances:
>>> from zopyx.txng3.normalizer import Normalizer
>>> table = (('è', 'e'), ('é', 'e'), ('à', 'a'))
>>> normalizer = Normalizer(table)
>>> normalizer.normalize('yé danse lé yéyé')
u'ye danse le yeye'
>>> normalizer.normalize('à la queue leu leu')
u'a la queue leu leu'

Découper le texte en mots: zopyx.txng3.splitter


Le module splitter permet de découper un texte:

>>> from zopyx.txng3.splitter import Splitter
>>> tool = Splitter()
>>> tool.split("mon texte se coupe, d'habitude")
>>> [u'mon', u'texte', u'se', u'coupe', u'habitude']
  

Lemmatiser: zopyx.txng3.stemmer


La lemmatisation, ou stemming en anglais, permet d'extraire d'un mot sa racine commune, en retirant les préfixes et suffixes. Elle est spécifique à chaque langue bien sûr, et permet d'extraire d'un mot son essence, le lemme::
>>> from zopyx.txng3 import stemmer
>>> stemmer.availableStemmers()
['danish', 'dutch', 'english', 'finnish', 'french', 'german', 'italian', 'norwegian', 'porter', 'portuguese', 'russian', 'spanish', 'swedish']
>>> lemmatiseur = stemmer.Stemmer('french')
>>> texte = u"j'ai cherché à comprendre le sens de cette constitution"
>>> texte = texte.split()
>>> lemmatiseur.stem(texte)
[u"j'ai", u'cherch', u'\xe0', u'comprendr', u'le', u'sen', u'de', u'cet', u'constitu']
Cet outil est basé sur l'outil Snowball, qui est également utilisé dans Lucene ou Xapian.

Un exemple complet


Voici un exemple complet:
>>> from zopyx.txng3 import stemmer
>>> from zopyx.txng3 import normalizer
>>> from zopyx.txng3 import splitter
>>> def transforme(texte):
...   normalize = normalizer.Normalizer((('è', 'e'), ('é', 'e'), ('à', 'a')))
...   texte = normalize.normalize(texte)
...   texte = splitter.Splitter().split(texte)
...   texte = stemmer.Stemmer('french').stem(texte)
...   return ' '.join(texte)
...
>>> transforme("des études récentes ont démontré que le visionnage des épisodes de Benny Hill est bénéfique pour la circulation sanguine")
u'de etud recent ont demontre que le visionnag de episod de benny hill est benef pour la circul sanguin'

Notons que le paquet Zopyx propose aussi une implémentation de la distance de Levenshtein, qui permet de calculer la distance entre deux mots, c'est à dire le nombres de permutations de lettres pour passer d'un mot à l'autre.

02/12/2006

PythonMap

frenchy a posté sur les forums de l'Afpy un lien vers une googlemap-like qui présente une carte des programmeurs Python.

Ajoutez vous sur la carte
Categories: misc 0 comments - commenter | Trackbacks (370) |

02/10/2006

Interview sur le Journal du Net

Le journal du net m'a interviewé sur Python par téléphone. J'ai essayé d'y défendre en tant que développeur l'approche logiciel libre et Python bien sûr..

L'interview
Categories: documentation 0 comments - commenter | Trackbacks (446) |

02/09/2006

Python Quick Reference Card

Laurent Pointal a condensé l'essence de Python (pour ne pas dire l'huile) dans un refcard de quelques pages.


"Ca fait maintenant 8 pages complètes, écrit petit. Ca nécessite zapf-dingbats à l'impression, et une bonne imprimante couleur."  -- L.Pointal

Lien direct
Categories: documentation 0 comments - commenter | Trackbacks (474) |

02/05/2006

Solution Linux: mes slides

Voici mes slides présentés à Solutions Linux.

Ces slides avaient pour objectif de démontrer aux personnes présentes, qui utilisent en général d'autres langages et viennent découvrir Python, qu'il est taillé pour la programmation agile.

Pyrex et Psyco sont également présentés.



02/04/2006

TShirt AFPy et symbole de la francophonie

L'association est en train de se décider pour son T-Shirt. Le symbole de la francophonie qui a été proposé il y a quelques temps, revient au coeur des discussions, depuis que nous avons vu que PostgreSQLFr et GnomeFr avaient opté pour le logo, augmenté du cercle de la francophonie.

Dimitri, un des membres de PostgresSQLFr, évoquait même l'idée de standardiser toutes les assos francophones du libre par le biais de ce cercle.

Quoiqu'il en soit, je suis pressé d'avoir ce TShirt...

Symbole de la francophonie:
Categories: misc 0 comments - commenter | Trackbacks (879) |

Tarek Ziadé. Copyright 2006. Tous droits réservés. Licence contenu site
BuzTrucs
Add to Technorati Favorites