Pour utiliser le wrapper, il faut tout d'abord installer Tree Tagger. Pour Linux et le français, la démarche est la suivante :

  1. Télécharger l'archive contenant l'outil ;
  2. La décompresser dans un répertoire dédié ;
  3. Télécharger le fichier de paramètre pour le français (utf-8)
  4. Le décompresser et le déplacer dans un répertoire lib à la racine du répertoire contenant Tree Tagger en le renommant french.par

Vous pouvez alors tester le bon fonctionnement de l'étiqueteur en vous plaçant dans ledit répertoire, puis :

shell$ echo -e "Ceci\nest\nun\ntrès\ncourt\ntexte\nà\nétiqueter\n."\
  |bin/tree-tagger -token -lemma -quiet lib/french.par
Ceci	PRO:DEM	ceci
est	VER:pres	être
un	DET:ART	un
très	ADV	très
court	ADJ	court
texte	NOM	texte
à	PRP	à
étiqueter	VER:infi	étiqueter
.	SENT	.

La signification des étiquettes est expliquée ici.

Une fois l'étiqueteur installé sur le système, il faut récupérer le wrapper Python. Il n'en existe pas de version directement téléchargeable à ma connaissance. Il faut donc le récupérer depuis le dépôt du projet par subversion :

svn co https://subversion.cru.fr/ttpw/trunk/treetaggerwrapper.py

La version présente sur le dépôt au moment de la rédaction de cet billet n'est pas fonctionnelle. J'ai remonté un bug à ce sujet à l'auteur. Il suffit d'appliquer le patch que j'ai proposé pour rendre le wrapper fonctionnel.

L'utilisation est ensuite assez simple, il suffit d'importer le module dans le code Python, puis de préciser la langue (TAGLANG) et le répertoire d'installation (TAGDIR). Par défaut, le wrapper est configuré pour exploiter l'encodage latin1. Le fichier de paramètre pour le français est en utf-8, tout comme mon environnement de développement. J'ai donc également précisé que je voulais utiliser cet encodage (TAGINENC et TAGOUTENC) :

import treetaggerwrapper
# Construction et configuration du wrapper
tagger = treetaggerwrapper.TreeTagger(TAGLANG='fr',TAGDIR='/tmp',
  TAGINENC='utf-8',TAGOUTENC='utf-8')
# Utilisation
tags = tagger.TagText(u"Ceci est un très court texte à étiqueter.")
print tags

Le résultat du traitement est une liste des triplets mot, rôle grammatical et lemme.

[u'Ceci\tPRO:DEM\tceci', u'est\tVER:pres\t\xeatre', 
 u'un\tDET:ART\tun', u'tr\xe8s\tADV\ttr\xe8s', 
 u'court\tADJ\tcourt', u'texte\tNOM\ttexte', u'\xe0\tPRP\t\xe0',
 u'\xe9tiqueter\tVER:infi\t\xe9tiqueter', u'.\tSENT\t.']

Voici un petit morceau de code qui permet de structurer un petit peu mieux cette sortie :

class TreeTaggerWord:
  def __init__(self, triplet):
    self.word,self.postag,self.lemma = triplet
def formatTTG(output):
  words = []
  for w in output:
    words.append(TreeTaggerWord(w.split("\t")))
  return words

Les données en sortie sont alors accessibles comme des attributs de la classe TreeTaggerWord :

import treetaggerwrapper
# Construction et configuration du wrapper
tagger = treetaggerwrapper.TreeTagger(TAGLANG='fr',TAGDIR='/tmp',
  TAGINENC='utf-8',TAGOUTENC='utf-8')
# Utilisation
tags = tagger.TagText(u"Ceci est un très court texte à étiqueter.")
data = formatTTG(tags)
print data[0].word
print data[0].postag
print data[0].lemma