Fantomas’side

Weblog open-source

♪ Je lui dirais des mots vides ♫

Depuis des temps reculés, j'essaye en composant avec mon temps et mon inspiration de toujours développer et maintenir Zinnia. Or un des points que j'essaye d'améliorer ces derniers temps, tant au niveau des résultats, que des performances, c'est la comparaison du contenu des articles, afin de retrouver les articles les plus similaires entre eux.

Une des étapes pour comparer le contenu entre les articles, va être de soustraire dans le texte l'ensemble des mots vides de sens (ou stop words en anglais), tel que "le, la, les", afin de limiter le nombre de mots à comparer, tout en travaillant sur des mots dirons-nous "qualifiés". 

Prenons un exemple concret en français :

Maître Corbeau sur un arbre perché,
Tenait en son bec un fromage.
Maître Renard par l’odeur alléché
Lui tint à peu près ce langage :
Et bonjour, Monsieur du Corbeau.

Une fois soustrait de ses mots vides, cet extrait de fable donnera :

Maître Corbeau XXX XX arbre perché,
Tenait XX XXX bec XX fromage.
Maître Renard XXX X’odeur alléché
XXX tint X XXX XXXX XX langage :
XX bonjour, Monsieur XX Corbeau.

On voit donc que l'on conserve les mots essentiels du texte, même si l'on perd le sens des phrases. Et on comprend aussi l'intérêt d'améliorer ce processus, qui peut fortement jouer sur la qualité des résultats et des performances.

Revenons à Zinnia, j'essaye donc d'améliorer cette étape du filtrage, car actuellement seuls les mots vides anglais sont pris en compte par défaut, chose peu pratique pour un blog écrit autrement qu'en langue de Shakespear. 

En faisant un petit tour du Web, je constate qu'il existe bien des collections de mots vides dans différentes langues, le tout parfois même accessible en Python !

Mais les API fournies sont un peu trop optimiste, simpliste et/ou ne supportent pas Python3... De plus les collections de mots vides fournis sont parfois légères et disparates. 

C'est pourquoi je me suis lancé dans mots-vides, une librairie Python dont les objectifs sont triples :

  1. Faciliter la maintenance des collections de mots vides.
  2. Fournir des collections de mots clefs les plus extensives possible.
  3. Fournir 2 APIs pour les développeurs, une bas niveau et une beaucoup plus élevée.

Petit exemple de l'API haut niveau, pour récupérer et soustraire des mots vides dans un texte en français, comme dans notre précèdent exemple :

from mots_vides import stop_words

french_stop_words = stop_words('fr')
print french_stop_words.rebase('Le lion est mort ce soir.')
'XX lion XXX mort XX soir.'
print french_stop_words.rebase('Le lion est mort ce soir.', '').split()
['lion', 'mort', 'soir.']

L'API de plus bas niveau peut permettre de gérer des collections de mots vides personnalisées. Prenons par exemple que nous voulons créer une collection de langages exotiques tirés de la science-fiction, en commençant par le Klingon :

from mots_vides import StopWord
from mots_vides import StopWordFactory

klingon_stop_words = StopWord('klingon')
klingon_stop_words += ["HIja'", "ghobe'", 'naDev', 'nuq']
factory = StopWordFactory('mes/collections/de/mots/vides')
filename = factory.get_collection_filename(klingon_stop_words.language)
factory.write_collection(filename, klingon_stop_words)  
# La collection est enregistrée # Plus tard je peux récupérer mes mots vides klingon factory = StopWordFactory('mes/collections/de/mots/vides') klingon_stop_words = factory.get_stop_words('klingon')

L'API de bas niveau m'a surtout permis de construire les outils nécessaires à la compilation des différentes collections glanées çà et là sur le net. Grâce à ces outils, la librairie supporte 39 langues différentes, et la mise à jour ou l'ajout de langues peut se faire rapidement.

Le support de toutes ces langues est un bon début, et va donc me permettre d'améliorer ce léger détail qu'est le filtrage des mots vides dans Zinnia. Bien sûr d'autres utilisations sont envisageables. :)

Pour contribuer : https://github.com/Fantomas42/mots-vides