Bibliographie avec Python depuis une liste de livres

Dans cet article, je te présente comment construire une bibliographie avec Python à partir d’une liste de livres et d’auteurs qui n’est pas nécessairement structurée. Dans cet exemple, je vais utiliser une liste de livres publiée dans une publication sur le réseaux social LinkedIn par Rachelle Houde Simard.

Voici comment j’ai fait pour traiter cette liste et arriver à une bibliographie structurée sans faire aucune recherche manuellement, ni en ayant à utiliser un outil génératif.

J’ai commencé par mettre le texte brut dans une variable texte.

book_titles = """
<texte ici>
"""

La bibliothèque isbnlib

J’ai ensuite cherché sur un moteur de recherche s’il y avait une bibliothèque de code Python pour convertir des titres et auteurs vers le code ISBN, qui est un identifiant unique pour les livres publiés par un éditeur.

Je suis tombé sur le logiciel isbntools écrit en Python, qui est un utilitaire en ligne de commande. Comme je voulais avoir quelque chose qui fonctionne depuis un interpréteur Python, j’ai été voir le code source de ce logiciel et j’ai remarqué que la plupart des fonctionnalités proviennent de la bibliothèque isbnlib.

import isbnlib

Cette bibliothèque permet d’extraire, de valider et de nettoyer des données relatives aux codes ISBN. Il y a une fonction, isbn_from_words, qui permet de rechercher diverses sources de données telles que Google Books ou Wikipedia pour trouver un ISBN depuis un titre et un auteur, dans un bloc de texte non-structuré.

isbn_list = [isbnlib.isbn_from_words(x) for x in book_titles]

Cette fonction utilise la technique de la recherche approximative (appelée fuzzy search) qui compare la similarité des résultats de recherche pour trouver la correspondance la plus probable.

Extraire les métadonnées depuis un ISBN

Une fois qu’on a obtenu un numéro ISBN, on peut alors obtenir plusieurs informations sur le livre.

Avant, on va utiliser la fonction clean sur les ISBN. C’est une façon de corriger les entrées de notre liste et d’avoir une bibliographie propre.

isbn_list_clean = [isbnlib.clean(x) for x in isbn_list if x is not None]

La fonction meta permet d’extraire des métadonnées depuis plusieurs sources de données. Par défaut, elle utilise Google Books.

Tu remarqueras que j’utilise la fonction tqdm. Elle sert simplement à mettre une barre d’avancement dans la fenêtre d’exécution pour voir l’avancement du code et avoir une estimation du temps total d’exécution.

from tqdm import tqdm

Ces métadonnées sont:

  • Le titre
  • Les autrices et auteurs, dans une liste
  • La maison d’édition
  • L’année de publication
  • La langue
  • Le numéro ISBN corrigé à 13 chiffres
isbn_meta = []
for x in tqdm(isbn_list_clean):
    try:
        isbn_meta_item = isbnlib.meta(x,"goob")
        isbn_meta.append(isbn_meta_item)
    except Exception as e:
        isbn_meta.append({})

On peut aussi créer un lien vers Worldcat, qui est un catalogue mondial des bibliothèques publiques, principalement universitaires, qui contient la majorité des livres publiés dans le monde. C’est une source de référence agnostique qui n’appartient pas à une entreprise privée.

Enfin, la fonction desc permet d’obtenir le résumé du livre tel qu’il se trouve sur une source de données. Encore une fois, par défaut, ça utilise Google Books.

Préparer un tableau de données

Enfin, pour rassembler ces données dans un tableau, j’utilise Pandas.

import pandas as pd

Je pars des métadonnées, qui sont déjà dans une liste de dictionnaires.

books_df = pd.DataFrame(isbn_meta)

Puis j’ajoute la colonne de l’URL et celle de la description.

books_df["URL"] = [f"https://search.worldcat.org/fr/search?q={isbn}&offset=1" for isbn in books_df["ISBN"]]
books_df["description"] = [isbnlib.desc(x) for x in tqdm(isbn_list_clean)]

J’en profite aussi pour changer le type de la colonne ISBN vers caractères, parce que par défaut, c’est une valeur numérique, et lors de l’exportation, ça va écrire le nombre sous forme de notation scientifique arrondie, ce qui nous fait perdre de l’information.

books_df["ISBN"] = books_df["ISBN"].apply(str)

Enfin, j’exporte le tableau dans un chiffrier Excel avec la fonction to_excel

books_df.sort_values("Title").to_excel("liste_livres.xlsx", index=False)

Listing complet pour construire une bibliographie avec Python

Voici le listing complet de ce programme qui permet de construire une bibliographie avec Python depuis une liste de livres.

import pandas as pd
import isbnlib
from tqdm import tqdm

book_titles = """
<texte ici>
"""

isbn_list = [isbnlib.isbn_from_words(x) for x in book_titles]
isbn_list_clean = [isbnlib.clean(x) for x in isbn_list if x is not None]

isbn_meta = []
for x in tqdm(isbn_list_clean):
    try:
        isbn_meta_item = isbnlib.meta(x,"goob")
        isbn_meta.append(isbn_meta_item)
    except Exception as e:
        isbn_meta.append({})

books_df = pd.DataFrame(isbn_meta)

books_df["ISBN"] = books_df["ISBN"].apply(str)

books_df["URL"] = [f"https://search.worldcat.org/fr/search?q={isbn}&offset=1" for isbn in books_df["ISBN"]]

books_df["description"] = [isbnlib.desc(x) for x in tqdm(isbn_list_clean)]

books_df.sort_values("Title").to_excel("liste_livres.xlsx", index=False)

Boni: Exporter vers BibTeX

Avec la bibliothèque isbnlib, c’est aussi possible d’exporter les données vers BibTex et plusieurs autres gestionnaires de bibliographie. On utilise pour ça un module de formatage dans le dictionnaire registry.bibformatters

bibtex = isbnlib.registry.bibformatters["bibtex"]

Pour exporter, on utilise la fonction bibtex et on écrit directement dans un fichier texte

with open("isbn_meta.bib", "w") as f:
    for x in isbn_meta:
        if x != {}:
            f.write(bibtex(x))

J’espère que tu vas apprécier utiliser isbnlib pour tes projets de données avec une bibliographie.

Ces articles vont aussi t’intéresser

DéconstruIT ⛏️🧱

Mastermind techno rebelle

Un accompagnement de six mois pour enfin réaliser tes projets technos tout en développant ton autonomie.

Libérons ensemble ton entreprise, ta clientèle et toi de l’oppression numérique.

Travaillons de manière durable et alignée sur tes valeurs dans un environnement sécuritaire, intime et engagé.

Tout en ayant bien du fun !