CurvyBot

De Wikipast
Aller à la navigation Aller à la recherche

Résumés des fonctionnalités

L'objectif de ce bot est de créer pour chaque biographie un graphe avec en abscisse le temps (en années) et en ordonnée le nombre d'articles par année qui traitent du personnage de la biographie. Les événements mentionnés dans la biographie sont clairement indiqués. Le graphe doit donner une idée de la popularité médiatique du personnage au fil du temps, en fonction des événements marquants le concernant.

Description technique

Le bot se base sur les biographies existantes. La page de chaque biographie est analysée pour en extraire le nom du personnage, des mots remarquables qui seront utilisés pour l'évaluation de la performance et les événements biographiques qui seront affichés sur le graphe.

Le nom du personnage est utilisé pour effectuer une requête à la base de données Impresso, qui retourne pour chaque année le nombre d'article comprenant les mots cherchés. Ces données permettent directement de créer un graphe relatif. Chaque point indique le ratio normalisé entre le nombre d'articles total sur l'année et le nombre d'articles concernant les mots-clef. En effet, le nombre d'article total varie fortement selon les années, et un compte absolu ne serait pas représentatif de l'évolution.

Évaluation des performances

Fiabilité

L'usage de mots remarquables permet de générer plusieurs courbes en effectuant une requête plus précise. La comparaison de ces courbes permet d'évaluer leur fiabilité. On effectue notamment une recherche avec le nom complet du personnage, une recherche avec uniquement son nom de famille, et des recherches avec des mots remarquables. Plusieurs techniques d'extraction de mots remarquables sont proposées:

  • Extraction des mots à occurrences multiples dans les pages.
  • Extraction des fonctions générées par le SPARQLBot dans les mentions.

Initialement, 3 courbes sont calculées.

  • La courbe de confiance moyenne est calculée en recherchant les articles où le nom complet du personnage apparaît. C'est la courbe de référence.
  • La courbe de confiance basse est calculée en recherchant les articles où seul le nom de famille du personnage apparaît. On s'attend à trouver des pics parasites dans cette courbe. Son but est de représenter au mieux l'amplitude des courbes de confiances plus élevées en minimisant le nombre de faux négatifs.
  • La courbe de confiance haute est calculée en recherchant les articles où le nom complet ainsi qu'un mot remarquable apparaissent. On s'attend à ce que certains pics avérés manquent à cette courbe. Son but est de confirmer la présence des pics dans les courbes de confiance plus basses en minimisant le nombre de faux positifs. Cette courbe est la somme des résultats pour le nom complet + un mot remarquable, et son échelle n'est donc pas la même que les deux autres courbes, car certains articles sont comptés plusieurs fois.

Généralement, la correspondance entre la courbe de confiance élevée et la courbe de confiance moyenne est excellente. La courbe de confiance basse est souvent visiblement altérée par des homonymes.

Certains cas spéciaux donnent de mauvais résultats car le nom sélectionné par l'algorithme n'est pas pertinent pour les recherches, comme Otto von Bismarck ou Nicolas II. Ces cas ne sont malheureusement pas rares.

Ce bot est partiellement dépendant du SPARQLBot, qui lui permet d'affiner la sélection de mots remarquables. Toutefois, la présence ou non de mention ne semble pas affecter significativement la performance du bot.

Vitesse

En moyenne, le bot nécessite entre 5 et 10 secondes afin de créer un histogramme et de le téléverser sur wikipast. Un des plus gros problèmes de performance est celui du réseau qui provoque des erreurs après un trop gros nombre de connexions, le transfert des images demandant beaucoup de ressources.

Améliorations possibles

Les critères actuels de recherche occasionnent quelques difficultés. On citera

  • Le nom de famille est aussi un prénom courant (e.g. Louise Michel)
  • Le personnage est évoqué selon un titre accompagné de son nom de famille (e.g. général von Bismarck)
  • Le nom de famille est utilisé pour nommer une invention ou une marque (e.g. Ferrari)
  • Le nom de famille a un homographe (e.g. Breton, Lumière)

Le critère de définition d'un mot remarquable pourrait être revu. Actuellement, il s'agit juste d'une borne sur son nombre d'apparitions dans la biographie. Pour permettre une meilleure comparaison entre diverses personnalités il serait peut-être plus juste de choisir un nombre fixe de mots parmi les plus fréquents dans la biographie.

Le critère de recherche par le nom est donc parfois une borne peu, voir pas du tout, précise. On soulignera toutefois qu'elle prouve son efficacité dans une majorité de cas. On pourrait imaginer un premier affinage du critère de confiance bas en regardant, par exemple, si le nom se trouve dans un dictionnaire.

Certains personnages sont très peu mentionnés dans les médias et le graphe pourrait être reconstitué à partir des évènements wikipast (e.g. Yuri Gagarin)

Le format des pages est problématique. On citera

  • Le personnage n'a pas de nom de famille (e.g. Nicolas II)

De plus, le bot utilise considère le nom de famille comme étant tout les mots qui suivent le prénom. Il considèrera donc les autres prénoms comme une partie du nom de famille (e.g. Juan Manuel Fangio sera recherché par Manuel Fangio)

Exemple de résultats

Code

Une boucle principale itère sur toute les biographies

with closing(urlopen("http://wikipast.epfl.ch/wikipast/index.php/Biographies")) as html_biographies:
    soup = BeautifulSoup(html_biographies, 'html.parser')
    
    hrefs = []
    for table in soup.findAll('table'):
        for a in table.findAll('a'):
            if a.has_attr('href'):
                hrefs.append('http://wikipast.epfl.ch' + a.get('href'))

"""for each biography creates a new section with an histogram 
if the section doesn't exist and reuploads the histogram otherwise"""
times = {}
for i, bio in enumerate(hrefs):
    print(bio)
    timeout = True
    while timeout:
        try:
            start = dt.now()
            end = start
            bns = bio_needs_section(bio)
            fname, title = None, None
            if(bns):
                fname, title = create_histogram(bio)
                end = dt.now()
            add_histogram(fname, title, bns)
            timeout = False
            print('graph realisation and insertion took', end - start)
            times[bio] = end - start
        except TimeoutError:
            print("Timeout")
            time.sleep(PAUSE_TIME)

print(times)
 

Le code suivant gère la création de graphes à partir du nombre d'articles par année et des évènements wikipast