TextUID : Propositions pour un identifiant unique d’un livre, commun à ses différentes éditions, générable automatiquement

Dans cet article, je propose des pistes pour une méthode facilement reproductible permettant de générer automatiquement un identifiant de texte. Ce n’est pas une méthode parfaite, mais plutôt la « moins mauvaise » méthode, aussi je suis ouvert à toute suggestion permettant de l’améliorer.

MAJ 08/06/2014 : ajout des règles 6 et 7 et de deux nouveaux exemples. Merci à @edasfr pour ces remarques.

Pourquoi ?

Lorsque je développe un site ou un outil pour les libraires, un besoin récurent celui est de pouvoir identifier les différents livres correspondant à un même texte (nouvelle édition, réédition en poche, version numérique ou audio, etc.).

Par exemple, le site de la librairie Scylla, sur chaque fiche livre, propose le même livre dans d’autres formats ou d’anciennes éditions épuisés disponibles d’occasion. Autre exemple, la librairie Charybde, pour le calcul de ses meilleures ventes, souhaite que les ventes d’un même texte chez différents éditeurs soient additionnés et pas considérés comme des livres différents.

Aujourd’hui, ce recoupement demande que les librairies (ou autres utilisateurs de Biblys) créent manuellement ces relations, opération fastidieuse qui peut être source d’erreur.

Cahiers des charges

La méthode de génération de l’identifiant doit :

  • être facilement à mettre en œuvre afin que n’importe qui puisse générer un identifiant sans passer par une autorité centrale ;
  • être suffisamment détaillée et prévoir tous les pièges possibles : deux acteurs générant un identifiant pour le même texte doivent parvenir systématiquement au même résultat.

D’autres (mauvaises) solutions

  • Le titre du livre, de toute évidence, ne peut convenir puisque que, si deux editions d’un livre ont a priori le même titre, il n’est pas rare que deux livres sans aucun rapport ait également le même titre. Par exemple, dans la base Biblys (qui est loin d’être exhaustive), il y a pas moins de cinq titres d’auteurs différents intitulé « Les Insoumis« …
  • Les ISBN sont propres à chaque édition d’un livre, il arrive parfois qu’un même livre chez un même éditeur puisse obtenir des ISBN différents au fil des réimpressions, ils ne peuvent donc convenir à cet usage.
  • La norme ISTC (pour International Standard Text Code) se rapproche de nos besoins, mais elle a deux désavantages. D’abord, elle ne nécessite de passer par une autorité centrale, une agence (en France, Électre) qui ne peut créer de nouveaux codes qu’à la demande d’un éditeur ou d’un ayant droit. De plus, elle semble peu utilisée aujourd’hui.

Description de la norme TextUID

Elle se présente sous la forme un ensemble de règles, dont le but est de décrire la méthode de génération de l’identifiant en tentant de prévoir un maximum de cas particuliers pour indiquer la marche à suivre le cas échéant. De nouvelles règles pourront donc être ajoutées si de nouveaux cas particuliers problématique sont découverts.

Règle 1

Le TextUID est une empreinte MD5 généré d’après une chaîne de caractères précises, encodé en UTF-8, en majuscules, contenant :
TITRE ORIGINAL du livre
barre oblique entouré d’espaces : ‘ / ‘
NOM PRÉNOM de l’auteur (ou NOM uniquement le cas échéant)

Soit : TITRE ORIGINAL / NOM PRÉNOM

Règle 2

Le titre du livre doit être dans la langue de publication originale, afin que les différentes traductions d’une oeuvre possèdent bien le même identifiant que l’original.

Règle 3

Si le livre a plusieurs auteurs, on les ajoute dans l’ordre alphabétique, l’un après l’autre, séparés par une virgule et une espace : NOM PRÉNOM, NOM PRÉNOM (ou NOM uniquement le cas échéant)

Soit : TITRE ORIGINAL / NOM PRÉNOM, NOM, NOM PRÉNOM

Règle 4

S’il existe plusieurs graphies pour un titre de livre, on utilise celui mentionné sur la couverture de la première édition.

Règle 5

S’il existe plusieurs graphies pour un nom d’auteur, on utilise celui mentionné sur la couverture de la première édition de son premier livre publié.

Règle 6

Si le livre fait partie d’une série, on utilise le titre du tome uniquement. Si le tome n’a pas de titre, on utilise le nom de la série, suivi d’un tiret et du numéro du tome.

Règle 7

Si le livre est un ouvrage collectif et qu’un ou plusieurs directeurs d’ouvrage sont mentionnés (« Sous la direction de… »), ce sont ces noms qui seront utilisés au lieu du nom des auteurs.

Quelques exemples :

Le Petit Prince

Chaîne : LE PETIT PRINCE / DE SAINT-EXUPÉRY ANTOINE
Empreinte MD5 : 31943e821c39ccd479441a2b0bdcf2b7

L’Attrape-coeurs

Chaîne : THE CATCHER IN THE RYE / SALINGER J. D.
Empreinte MD5 : 9c93c0d32ee994bddf65bb6f3bcfa421

Les Soldats de la mer

Chaîne : LES SOLDATS DE LA MER / RÉMY ADA, RÉMY YVES
Empreinte MD5 : d44c3bf585ee56cf1ae02f043492de81

À la recherche du temps perdu, tome 2

Chaîne : À L’OMBRE DES JEUNES FILLES EN FLEURS / PROUST MARCEL
Empreinte MD5 : 736ac35cc4ce8b67dfbaaa901c03f398

L’énergie à découvert, sous la direction de…

Chaîne : L’ÉNERGIE À DÉCOUVERT / JEANDEL CATHERINE, MOSSERI REMY
Empreinte MD5 : 97ff30f497e277265045e3cbdf08a37c

Exemples de code

PHP

<?php 
 
function textuid($title, $authors)
{
    foreach ($authors as $author)
    {
        if (!isset($authors_string)) $authors_string = NULL;
        else $authors_string .= ', ';
        $authors_string .= trim($author['last_name'].' '.$author['first_name']);
    }
    $string = mb_strtoupper($title.' / '.$authors_string, 'UTF-8');
    $hash = md5($string);
    return array('string' => $string, 'hash' => $hash);
}

$book_title = "Les Soldats de la mer";
$book_authors = array(
    array('first_name' => 'Ada', 'last_name' => 'Rémy'),
    array('first_name' => 'Yves', 'last_name' => 'Rémy')
);
 
var_dump(textuid($book_title, $book_authors));

Voir aussi ici le code en action.

Conclusion

J’utilise déjà cette méthode, à des fins de test, pour la base Biblys. Je la partage ici car je pense qu’elle pourrait être utile à d’autres en interne, mais aussi parce qu’elle prendrait un tout autre intérêt dans le cadre d’un échange de données entre des bases différentes.

Je suis conscient que cette méthode ne pourra jamais fonctionner à 100%, mais je pense que la première règle doit pouvoir couvrir 99% des cas et que les suivantes doivent pouvoir permettre de se rapprocher au maximum de la perfection… tout en sachant qu’on ne pourra jamais l’atteindre ! Mais c’est sans doute le prix à payer pour une génération automatique, sans vérification humaine.

Je suis donc bien entendu ouvert à toute question, remarque ou proposition de règles qui pourrait permettrait d’améliorer la méthode !