La vie multilingue de 'censure et 'tabou' sur le web

Les étapes ardues du script python

L'aspiration des pages web et l'encodage

Librairies utilisées : urllib2, gzip, chardet.

Le billet du blog correspondant se trouve ici.

L'aspiration de la page se fait en deux temps (pour chaque url), pendant lesquels on utilise la bibliothèque urrlib2. Premièrement, on fait une requête en utilisant urllib2.Request(), qui prend en argument l'url. Ensuite on stocke dans un buffer le contenu de la requête en utilisant urllib2.urlopen(), qui prend en argument le résultat de la requête.

La décomposition en deux étapes n'est pas absolument nécessaire en théorie, mais nous en avons eu besoin ici pour extraire l'encodage. L'aspiration et la récupération de l'encodage sont donc liées. Certains contenus html sont compressés sur le serveur au moyen d'un algorithme de compression gzip. C'est dans la requête qu'on doit préciser que l'on accepte le gzip, pour pouvoir ensuite décompresser le contenu et récupérer son encodage.

Ensuite on stocke le fameux contenu dans une variable 'data', qu'il soit ou non le résultat d'une décompression, et on récupère l'encodage. Pour ce faire, on utilise chardet.detect() qui prend en argument la variable 'data'. La fonction renvoie un objet de type dictionnaire, dont on extrait la valeur d'encodage.

Consultez le billet du blog pour plus de précisions et pour des illustrations.

Ecriture et nettoyage des dumps

Librairies utilisées : bs4, chardet.

Le billet du blog correspondant se trouve ici.

Dans un premier temps, on décode les données d'après l'encodage qu'on a récupéré. Ce n'est qu'après qu'on peut le réencoder en utf-8. Et l'écrire (en utf-8) dans un fichier dump.

La manoeuvre intéressante de cette étape réside dans le nettoyage du dump. Après de nombreuses tentatives infructueuses au moyen d'expressions régulières (supprimer les traces de javascript, typiquement), c'est l'utilisation de BeautifulSoup qui permet le nettoyage le plus complet. BeautifulSoup permet de supprimer les scripts, puis de récupérer le texte avec soup.get_texte() où 'soup' est un objet dans lequel il y a les données, parsées avec 'html.paser'.

Consultez le billet du blog pour plus de précisions et pour des illustrations.

Décompte du nombre d'occurrences

Le billet du blog correspondant se trouve ici.

Librairies utilisée : re.

Ici, on utilise les expressions régulières, par contre. Il s'agit de compiler l'expression matchant les mots dans différentes langues avant de lancer une recherche dans le dump nettoyé en ajoutant le flag re.IGNORECASE pour trouver aussi les occurrences qui commencent par une majuscule. Le flag précise qu'on ne tient pas compte de la casse.

On incrémente le compteur d'occurrences à chaque occurence trouvée par la recherche.

Consultez le billet du blog pour plus de précisions et pour des illustrations.

Extraction des contextes

Le billet du blog correspondant se trouve ici.

Rien de très compliqué ici. Il s'agit de récupérer le contexte lexical immédiat gauche et droite des mots-cibles. L'astuce est de transformer le contenu du dump en liste avec readlines() pour se servir des index de la liste comme de numéros de ligne.

Ensuite prévoit que, si dans la ligne se trouve un mot-cible, on sélection 3 lignes avant, la ligne dans laquelle se trouve le mot-cible, et trois lignes après (pour éviter de se retrouver avec des contextes faits de sauts de ligne). On écrit ces contextes dans des fichiers séparés ainsi que dans un fichier global qui sera utilisée dans la phase suivante du projet. On a un fichier global par langue.

Consultez le billet du blog pour plus de précisions et pour des illustrations.

Le script comme une fonction

Le billet du blog correspondant se trouve ici.

Le but de cette maoeuvre est de pouvoir traiter plusieurs fichiers d'URLs en une seule exécution de script. Concrètement, ça signifie transformer le script en une fonction, et appliquer cette fonction dans une boucle au contenu d'un dossier de fichiers URLS.

Consultez le billet du blog pour plus de précisions et pour des illustrations.