Accéder au contenu principal

#Première étape du projet : Création du corpus





Rappel du mot d’étude : geek
Rappel des langues étudiées : français, anglais, allemand, italien, japonais

L’analyse linguistique que nous comptons réaliser concernant le mot geek sur le web se fonde sur un corpus que nous allons construire. Mais avant de s’intéresser à la partie informatique du problème, il convient d’établir les limites et la nature de ce fameux corpus multilingue. 

Réflexion sur le corpus :
Premièrement, nous souhaitons que les urls sélectionnées aient été créées au cours des cinq dernières années. La raison de ce choix se base sur le fait que nous souhaitons réaliser une étude synchronique du mot geek et non pas diachronique. Nous pensons qu’une période de cinq ans représente une durée suffisamment longue pour avoir de nombreuses données, tout en limitant les risques de biais que représentent les stéréotypes qui circulaient sur les geeks par le passé tels que “les geeks sont des personnes asociales qui restent enfermées toute la journée pour jouer aux jeux vidéo”.

Deuxièmement, la définition du mot geek ne connaît pas de véritable consensus, mais nous espérons à travers notre étude, à défaut d’en donner une universelle, nous en approcher. Pour ce faire, nous aspirons à : 1) dans chaque langue, séparément, observer les co-occurrences du mot geek, d’une part dans les textes dont les auteurs considèrent appartenir au milieu “geek”, d’autre part dans les textes dont les auteurs sont extérieurs à ce milieu, 2) pour chacun des deux types d’auteurs, comparer les co-occurrences selon les langues, 3) dans chaque langue, comparer  les co-occurrences selon les types d’auteurs. 
Dans cette optique, nous avons l’intention de récolter par langue :
·         une vingtaine d’URLS provenant d’auteurs qui s’identifient à la culture geek
·          
·         une trentaine d’URLS provenant d’auteurs qui s’en distinguent
·          

→ comment déterminerons-nous si l’auteur d’un article s’identifie à cette culture?

Réflexion sur la méthode de constitution du corpus :
Avec la consigne de rassembler 50 urls par langues, nous pensions tout d’abord faire des recherches manuelles pour y parvenir. Mais lors du cours de “Programmation et Projet encadré 1” du 16 octobre 2019, nous avons appris que certains sites web protégeaient leurs données de telle manière qu’il nous était impossible de récupérer (aspirer) les pages HTML qui nous intéressaient (nous y reviendrons en détails un peu plus loin).
L’idée de trouver des pages web conformes à notre recherche qui puissent se révéler inutilisables était assez décourageante. 

“MAIS Solveig est arrivée et nous a tous sauvés !!! Pour Solveig, HOURRA !!!”

Solveig suit le cours de “linguistique de corpus”, et, durant cet enseignement, elle a étudié une manière “de récupérer” toutes les URLS d’une recherche web à partir d’un moteur de recherche. En combinant cela avec la commande bash “curl -SI nom_d’url” qui permet d’obtenir le protocole HTTP d’une page web si le code HTTP est 200 nous pouvons aspirer la page , et le script créé en cours de “Programmation et projet encadré 1”, nous allons pouvoir obtenir un tableau d’url où les urls inexploitables seront directement identifiées et il ne nous restera plus qu’à trier celles que nous souhaitons garder suivant que l’auteur se distingue ou non de la culture “geek”.
La liste d’url une fois créée, nous passerons alors à la prochaine étape : la création d’un tableau regroupant nos URL et les pages aspirées, et la résolution des problèmes d’encodage.

Méthode détaillée de l’extraction d’URLS pour la création du corpus :

Se rendre sur un moteur de recherche (Bing), et taper une requête de recherche, dans notre cas “geek”. 
La commande bash “curl” permet d’aspirer le contenu d’une page web que l’on peut par la suite rediriger dans un fichier du répertoire URLS de notre environnement de travail.
Cependant, seules les URLs nous intéressent sur cette page. Pour pouvoir les extraire, nous allons donc employer la commande “egrep” qui affichera les lignes correspondant à un motif donné, accompagné de l’option “-o” qui retourne seulement le motif cherché, et créer une expression régulière représentant un format d’URL “https?[^\’’]+
La commande pour extraire seulement les urls d’une page web est donc la suivante : egrep -o “https?[^\’’]+”.
À cela s’ajoute une commande egrep -v afin de retirer tous les mots susceptibles d’apparaître dans des URL inexploitables.
Vient ensuite la suite de commande “sort” et “uniq” qui permettent respectivement de trier les résultats de manière alphanumérique, et de supprimer les doublons.
Et enfin, on élimine les URLS « vides » avec la commande “egrep -v option -v qui inverse la mise en correspondance pour sélectionner les lignes ne correspondant pas au motif et l’expression régulière “http.?:/{1,2}$”.
Pour finir, on redirige les résultats vers un nouveau fichier urlgeekfr.

Cela me donne la commande suivante :


Seulement, cela ne permet de récupérer que la première page suite à une requête dans un moteur de recherche. Ce qui est loin d’être suffisant. 
Pour éviter de devoir répéter l’opération ci-dessus, il faut mettre en place une boucle
En effet, lorsque l’on passe de la page 1 à la page 2 d’une recherche Bing, on remarque que la mention « FIRST=1 », dans l’URL, devient « FIRST=11 », puis « FIRST=21 » à la page 3, etc. 
Il suffit donc de créer une variable “compteur = 1”, suivie d’une boucle qui s’arrêtera lorsque la variable “compteur” atteindra le nombre 211, avec “-le” signifiant « less or equal ». En Bash, la syntaxe d’une boucle est la suivante : 
 while + condition ( ici, [ $compteur -le 211] ) ;
 do + toutes les commandes à effectuer tant que la condition est remplie* ;
 done ;
* Ici, la commande à effectuer est celle détaillée ci-dessus pour extraire les urls d’une page web MAIS en remplaçant « FIRST=1 » par « FIRST=$Compteur » dans l’URL, et en incrémentant  le compteur de 10 de la manière suivante : compteur=$((compteur+10))
Cette fois, on crée deux fichiers : geekfr dans lequel on dirige le contenu des pages avant de le retravailler, et urlsgeekfr dans lequel on dirige ce qu’on a extrait du premier fichier grâce aux différentes opérations effectuées dessus (egrep, uniq…). On pourra par la suite supprimer le premier fichier.

Cela donne la commande suivante dans notre cas :



Cette commande permet bien de récupérer de nombreuses URLs en français.

Le cas de l'allemand : Problèmes rencontrés lors de l’extraction d’URLS en allemand
En essayant de répéter l’opération pour obtenir des résultats en langue allemande, Solveig a rencontré un problème.

En effet, l’URL reste la même, que les réglages de Bing soient en français ou en allemand. De ce fait, même si les résultats apparaissent bien en allemand sur Bing, curl n’aspire que des résultats en français. 
Solveig a donc demandé conseil à M. Daube qui l’a invitée à supprimer le « PERE » en fin d’URL et à le remplacer par « setmkt=de-de&setlang=de ». Il lui a également conseillé de préciser son navigateur internet avec l’option -A de curl  suivie du nom du navigateur et de sa version – pour passer outre d’éventuels paramètres de sécurité de Bing empêchant d’aspirer le contenu de ses pages.
La commande suivante a permis d’obtenir une liste d’URLs en allemand :  


Création d’un tableau HTML pour regrouper les URLS :
Avant de sélectionner les URLs qui nous intéressent, nous souhaitons créer un tableau html par langue avec, pour chacune des URLs récoltées, quatre colonnes contenant respectivement :
- Le lien pour permettre d’accéder rapidement au contenu des pages
- Le code retour http indiquant si l’aspiration du contenu html de la page est possible
- L’encodage de la page (lorsqu’il a été précisé par l’auteur du code html)
- Le lien vers le fichier de la page aspirée.

Pour cela, nous utiliserons le programme Bash suivant :


Ce programme contient deux variables qu’il faudra préciser en arguments lorsque nous souhaiterons l’exécuter : 
·         le répertoire d’où nous souhaitons extraire les URL : $1
·          
·         le répertoire où nous souhaitons créer les tableaux : $2
·          

Il contient également deux boucles for imbriquées. En effet, nous aspirons à créer : 
1) un tableau par langue, autrement dit un tableau par fichier présent dans le répertoire URLS, avec la boucle : for fichier in $(ls $1) 
2) et, au sein de chaque tableau, une ligne par URL, autrement dit par ligne de chaque fichier, avec la boucle : for line in $(cat «$1/$fichier»)

Ces deux boucles sont accompagnées de deux variables : la première pour numéroter les tableaux (numerotableau), à incrémenter à la fin de la première boucle ; la seconde pour numéroter les lignes (compteur), à incrémenter à la fin de la seconde boucle.

Pour chaque ligne, nous effectuons plusieurs opérations dont les résultats alimenteront les différentes colonnes du tableau. 
1) D’abord, nous souhaitons savoir si l’aspiration du contenu de chaque page est possible. Pour ce faire, nous devons obtenir le code retour http du protocole http de la page web. Avec la commande “curl -SI” où les options -SI correspond respectivement à Silent et Information du serveur, nous pouvons obtenir le protocole HTTP:


Pour extraire seulement  le code retour, nous effectuons la commande curl -SI -o fichier -w %{http_code} page_web qui redirige le code retour dans un fichier. Si celui-ci est de 200, l’aspiration de la page s’est bien passée. Sinon, peut importe le code obtenu, cela signifie qu’il y a eu un problème lors de l’aspiration de la page.
Explication de la commande : curl -SI -o fichier -w %{http_code} page_web 
La commande curl -SI (Silent et Information du serveur) permet d’afficher le protocole HTTP. 
L’option -o permet de stocker les informations dans un fichier et -w %{http_code} permet d’extraire uniquement le code retour (ici « 200 ») à la première ligne.

2) A présent, nous voulons connaître l’encodage de la page, qui se trouve à la fin de la 2e ligne après « charset= ». Nous tapons pour cela la commande curl -SI page_web | head -2 | cut -f2 -d”=” | tail -1 que nous décomposons ainsi : head -2 pour sélectionner les 2 premières lignes, cut -f2 -d«=» pour sélectionner pour chaque ligne le 2e champ (f = field), les champs étant séparés par « = » grâce à -d”=”. Enfin, nous ne souhaitons que le résultat de la 2e ligne, que nous obtenons avec tail -1.


Toutes ces informations - code retour et encodage de la page - sont stockées dans des variables et ainsi ajoutées au code html servant à construire le tableau que l’on dirige vers le fichier tableau.html grâce à la commande echo et l’opérateur >>.

Pour exécuter ce programme, il faut écrire :



Nous obtenons ainsi le tableau souhaité dont voici un extrait :



Il ne reste plus qu’à ne conserver que les urls dont le code retour est égal à 200 puis à sélectionner parmi les urls restantes les plus pertinentes pour notre projet. Nous verrons cela lors d’un prochain billet.

Découverte de dernière minute : 
En vérifiant le protocole http de certaines url pour lesquelles nous n'avions pas réussi à extraire l'encodage, nous nous sommes rendu compte que : dans le protocole HTTP d’une page web, la ligne sur laquelle apparaît l’encodage de la page (quand elle est précisée par l’auteur) n’est pas systématiquement la deuxième. De ce fait, notre commande pour extraire les encodages : curl -SI page_web | head -2 | cut -f2 -d”=” | tail -1, ne sera pas couronnée de succès à chaque utilisation.

Nous réfléchirons à ce problème dans un prochain billet.


Commentaires

Posts les plus consultés de ce blog

#Article 10 : Création du Site Web

Ce dixième et dernier article du blog aura pour objet la création de notre site web associé au projet. Nous avons choisi une mise en forme personnalisée, sur la base d'un modèle trouvé en ligne, et, ayant tous les trois quelques connaissances en HTML/CSS, nous avons ajouté et modifié nous-mêmes les pages dudit site. Il reprend certaines parties de ce blog: présentation de l'équipe, du projet. Nous y avons ajouté une section traitant des programmes utilisés tout au long de notre recherche, ainsi qu'une page dédiée aux données traitée. Par la suite, une section se consacre au script et à son écriture, une aux résultats obtenus, et enfin une à l'analyse de ces résultats. Contrairement à ce blog, le site contiendra plus de visuels et sera probablement un peu plus agréable dans sa navigation. Pour pouvoir travailler ensemble sur les fichiers, ceux-ci ont été partagés sur un drive commun. En effet, il serait autrement compliqué d'y avoir accès aisément depuis différentes

#Article2 Présentation de l’équipe

Avant de vous présenter le projet lui-même et de vous expliquer ce qui nous a amenés à choisir le mot « geek » pour notre étude, laissez-nous vous faire une rapide présentation de l’équipe. Aurore : (langues : français et anglais) : Je suis titulaire d’une licence en Sciences du Langage à Nanterre. En dernière année, avec le parcours Traitement Informatique de Corpus j’ai pu suivre une initiation à la linguistique informatique et la linguistique de corpus. Ayant apprécié l’expérience, j’ai décidé d’entreprendre le Master TAL. En 3ème année de licence, dans le cadre d’une enquête sociolinguistique, mes camarades et moi-même avions travaillé sur les anglicismes dans les jeux vidéos. C’est l’envie d’entreprendre un projet sur un sujet connexe qui m’a conduite à vouloir travail sur un thème proche du gaming. Corentin : (langues : français, japonais, italien) Titulaire d’une Licence en Science du Langage à Nanterre, passionné par langues et la linguistique, et versé dans l’informatique,

#Article 7 : Finalisation du script

Lors de notre dernier billet, nous avons cherché une manière d’obtenir les encodages de toutes les pages et de convertir en UTF-8 celles qui ne l’étaient pas déjà. Nous avons vu en cours une manière plus simple et efficace que celle que nous avions trouvée : egrep -io "charset=\"?[^\",]+\"?" ./PAGES-ASPIREES/$numerotableau-$compteur.html | cut -f2 -d"=" | tr -d '("|\\|>)' | sed "s/'//g" | tr '[a-z]' '[A-Z]' L’expression régulière charset=\"?[^\",]+\"? permet de trouver l’encodage, puis nous nous débarrassons de « charset= » grâce au cut -f2 -d"=" , ainsi que des éventuels guillemets (simples et doubles) encadrant l’encodage et autre signes (barres obliques et balises) avec tr -d '("|\\|>)' | sed "s/'//g" | , et enfin nous passons le résultat en majuscules avec tr '[a-z]' '[A-Z]' .   Nous   avons ajouté à cette commande les inst