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.