ERG::datagrab

De {}
Aller à la navigation Aller à la recherche

Data grab

Session du 24/09/2018

Objectif

À partir de la page wikipédia Liste de écoles d'art en Belgique. Sur base des écoles d'art à Bruxelles construire un générateur de page wiki d'école d'art.

Étapes

  • Télécharger les pages Wikipédia des écoles d'arts de Bruxelles

"Enregistrer sous", "Page web, complète" en HTML

  • Faire un programme qui va chercher les descriptions des pages des écoles d'arts pour mélanger ces textes et faire une sorte de description "moyenne" aléatoire d'une école d'art bruxelloise.

Pour ça on a besoin de javascript dans la page HTML que l'on va ouvrir à la fin. Javascript permet de faire une requête Ajax pour utiliser un programme en Python. C'est ce programme qui va faire tout le boulot, il va chercher dans le dossier les pages HTML que l'on a téléchargées, les analyser pour trouver seulement le texte de description (pas les balises, ni les titres ou les listes par exemple). Ensuite grâce à javascript ce programme va afficher le résultat dans une page HTML. À chaque fois que l'on ouvre le fichier HTML, une page aléatoire est générée à partir de la base de données que l'on a fourni au départ. 1datagrab 24 09 18.png

Sélectionner les blocs de textes de description. Il faut une bibliothèque pour que Python puisse analyser (parser) le contenu de la page HTML. On télécharge et on installe Beautiful Soup. Dans un éditeur de texte (comme Notepad++) on essaye d'ouvrir une page HTML dans Pyhton grâce cette nouvelle bibliothèque. Problème d'encodage des caractères : le script Beautiful Soup n'arrive pas à lire certains caractères UTF-8 qui sont présents dans la page Wikipédia. En fait le problème venait du terminal qui n'arrive pas à afficher certain caractères, pas de soucis si on les mets juste dans un variable ou si on écris dans un fichier .txt.

Session du 08/09/2018

Partie Grab / Côté client

Plutôt que de pré-télécharger dans un dossier les pages .html qui servent d'input au script, on utilise urllib: une librairie python qui permet de faire des requêtes http. Cela permet d'encoder une suite d'adresses URL de wiki et le programme va les chercher sur le net et en télécharge le code html. Le script python qui "grab" (va chercher) les datas et les mets dans une variable (ou ici un fichier .txt) est terminé:

import urllib
from bs4 import BeautifulSoup

#list of urls we use as source material

urls=['https://en.wikipedia.org/wiki/Soup',
	  'https://en.wikipedia.org/wiki/Rain']

#we request each of those url in a 'htmls' list
htmls=[]
for url in urls:
	html = urllib.urlopen(url)
	htmls.append(html.read())

#we create a 'soup' html parser objet for every html page requested
soup=[]
for html in htmls: 
	soup.append(BeautifulSoup(html, 'html.parser'))

#we put all the text between the <p> markups of those html in a .txt file
text = []
with open('text.txt', 'w') as f:
	for sp in soup:
		for tag in sp.find_all('p'):
			text.append(tag.get_text())
			f.write(tag.get_text().encode("utf-8"))

Algorythme de génération de texte

Communication entre l'algorithme et la partie Grab

Pour que l'algorithme de génération de texte en javascript puisse fonctionner, on doit passer le texte grabber en python à une variable du script javascript grâce à Ajax. Notons que le script python n'aurait pas pu être incorporer dans la partie javascript parce que javascript est côté serveur et ne permet donc pas de faire des requêtes pour récupérer les données de pages html sur le net, cette action est obligé de se trouver dans un script côté client.

Fonctionnement de l'algorithme

Pour faire un mashup des différents textes extirpés des pages html, on va utiliser un algorithme typique de NLP (Natural Language Processing - le domaine de l'informatique qui s’intéresse à l'analyse et à la synthèse de texte). L'algorithme fonctionne comme ceci:

  • Pour chaque groupe de n caractères qui se suivent (n-grammes) dans le texte source, associer le caractère qui suit. On a donc une database en 2 colonnes, avec à chaque fois d'un côté un n-grammes du texte source et de l'autre l'ensemble des caractères qui peuvent le suivre. Par exemple pour la phrase "Coucou c'est nous" et pour n=2, on a:
co -> {'u'}
ou -> {'c',' ','s'}
uc -> {'o'}
u_ -> {'c'}
c' -> {'e'}
...
  • Ensuite, afin de générer un texte nouveau, l'algorithme commence par prendre un de ces n-grammes au hasard. On va ensuite regarder dans la database quels sont les possibilitées de lettre qui peuvent suivre ce n-gramme. On en choisis une aléatoirement et on la rajoute derrière le n-gramme choisis. On a alors une nouvelle suite de n caractères qui finisse notre texte et on répète l'opération sur ce nouveau n-gramme. En répétant ce processus probabiliste, on écris lettre par lettre un nouveau texte grâce à la database du texte source. Les phrases seront semblable à celle qu'on trouve dans le texte source mais l'aspect probabiliste permet de générer des nouvelles suites de mots et donc de mélanger et restructurer ce texte.