Gestionnaire de publications :
Les chercheurs saisissent leur publications sur le site web et celles-ci sont affichées globalement, sur les pages des équipes et sur les pages personnelles des chercheurs.
Quelques tableaux de bord pour la direction.
Pour le rapport d'activité, les données ont été extraites de la base et gérées par un groupe dédié en charge du rapport (LaTeX).
Comme pour de nombreux laboratoires qui ont développé leur solution, les évolutions successives (changement d'organisation du laboratoire, changement de typologie de publication, besoin de transfert vers hal, ...) rendent ce gestionnaire compliqué à maintenir.
Il y a eu quelques échanges sur le sujet au moment des évaluations HCERES sur la liste "SI de laboratoire".
Migration décidée en 2015 : arrêt de la saisie dans notre gestionnaire de publications.
Les publications sont affiliées aux équipes de recherche du laboratoire, c'est la granularité de notre évaluation.
http://hal.archives-ouvertes.fr/rss.php?lab=umr5205
L'API HAL1 est une API REST2 dont la partie recherche est implémentée par Apache Solr et la partie dépôt via le protocole Sword.
L'intérêt, c'est une plus grande simplicité d'accès, un simple navigateur suffit pour explorer l'API. On dispose alors d'un plus grand nombre d'outils et de librairies contrairement au protocole SOAP employé précédemment.
Note
Une API REST est, en simplifiant, une API qui repose sur le protocole HTTP, ses verbes GET, POST, PUT, DELETE et qui est sans état.
Le protocole SWORD définit un ensemble de services Web basé sur Atom Publishing Protocol (APP), RFC5023.
L'API HAL permet des recherches :
On récupère les données au format JSON par défaut, mais de nombreux autres formats sont disponibles : XML, XML-TEI, BibTeX, CSV, ...
La documentation sur la recherche est très bien faite : https://api.archives-ouvertes.fr/docs/search/
On peut faire de la même façon des recherches dans les différents référentiels :
https://api.archives-ouvertes.fr/docs/ref
Note
Première étape : rechercher via l'API HAL, les publications qui sont déjà dans HAL : recherche de titre similaire, environ 1100 publications.
$searchhal = "http://api.archives-ouvertes.fr/search/";
$args = "fl=docid,halId_s,title_s&wt=json";
$url = $searchhal . "?q=title_st:\"" . rawurlencode(addcslashes($titre, "+-&|!(){}[]^\"~\\*?:")) . "\"&" . $args;
Les publications sont insérées dans une table de notre base de données pour pouvoir faire des requêtes et des tableaux de bord pour gérer le dépôt dans HAL.
mysql> select t.cd_production, count(t.cd_production) as nb, GROUP_CONCAT(hal_docid SEPARATOR ',') as publications_hal, L.titre from tmp_is_lirispublication_in_hal as t join L_PRODUCTION as L on L.cd_production=t.cd_production group by cd_production having nb > 3 and nb < 10 order by nb;
+---------------+----+------------------------------------------------------------------+--------------------------------------+
| cd_production | nb | publications_hal | titre |
+---------------+----+------------------------------------------------------------------+--------------------------------------+
| 11 | 4 | 324566,324652,544144,1101424 | Fouille de Données Spatiales |
| 1721 | 4 | 449749,518526,879356,1133967 | Classification automatique d'images |
| 2110 | 4 | 443664,834116,834127,1125674 | Systèmes d'information pervasifs |
| 394 | 5 | 575576,1065137,190436,252007,414376 | Functional specifications. |
| 2507 | 5 | 432167,437918,633533,1093684,1195856 | Access Control Models |
| 2727 | 5 | 788861,1060610,1060625,1128888,1165902 | Forensic Analysis |
| 5805 | 5 | 484354,758594,946469,952777,1155057 | Partitionnement de graphe |
| 4221 | 6 | 449299,449320,475917,1085255,28045,135021 | Distributed Databases |
| 3669 | 7 | 42809,279215,492058,746195,818985,946592,1122393 | Evolving Networks |
| 5481 | 7 | 67996,68014,140361,619091,872048,1004795,1134481 | Action recognition in videos |
| 885 | 8 | 113990,308643,316167,361087,377455,954629,1083153,1124872 | Les bases de données relationnelles |
| 2564 | 8 | 954629,1083153,1124872,113990,308643,316167,361087,377455 | Les bases de données relationnelles |
| 6231 | 8 | 667583,725593,726254,782188,782204,782207,782215,783066 | 3D Face Recognition |
| 4718 | 9 | 89771,297477,332536,622863,864842,980876,1011141,1063446,1181516 | LAD |
+---------------+----+------------------------------------------------------------------+--------------------------------------+
14 rows in set (0.00 sec)
Voici par exemple le tableau de bord des publications qui n'ont pas été trouvées dans HAL et que l'on peut filtrer par année ou par type.
Le dépôt des publications de notre gestionnaire qui ne sont pas dans HAL est un gros chantier en cours car environ 4800 publications sont concernées (sur 6000).
La première étape peut donc être schématisée ainsi.
Exemple de requête sur un titre :
$ curl -s -X GET -H "Content-Type:application/json"
'https://api.archives-ouvertes.fr/search/?q=title_st:"Graph%20Partitioning"&fl=docid,halId_s,title_s&wt=json' | jq '.'
{
"response": {
"numFound": 55,
"start": 0,
"docs": [
{
"docid": 652774,
"title_s": [
"Parallelization of Graph Partitioning"
],
"halId_s": "hal-00652774"
},
{
"docid": 676989,
"title_s": [
"Bootstrap clustering for graph partitioning"
],
"halId_s": "hal-00676989"
},
...
]
}
}
Un premier module de dépôt avait été développé pour le protocole Soap, il avait pour but de permettre aux chercheurs d'envoyer leur publication sur HAL via une succession de formulaires pour compléter les données requises (domaine scientifique, ...).
Ce module a du être recyclé / ré-écrit pour générer le XML-TEI attendu pour le dépôt.
Des scripts ont été développés en Python pour automatiser :
Générer les fichiers XMl-TEI pour les publications à exporter (succession de formulaires web).
Exemple d'informations enregistrées suite à la génération du XML-TEI dans SQLite.
sqlite> select * from liris_export_tei where length(filename) > 0;
cd_prod = 6996
type_inist = ARTACL
statut = PUB
filename = liris-tei-6996.xml
fileurl = xxxxxxxxxx/liris-tei-6996.xml
auteurs_liris = nnnnnnnn (Tabard Aurélien) s
auteurs_id_hal = aurelientabard
doublons_hal =
parametres_manquants =
pb_publication =
simplifie = 0
labo_exterieur =
reference_hal =
creation_date = 2016-04-11T15:15:34.277238
modification_date = 2016-04-11T15:15:34.847042
sqlite> select * from liris_export_tei where length(doublons_hal) > 0;
cd_prod = 5929
type_inist = ARTACL
statut = PUB
filename = liris-tei-5929.xml
fileurl = xxxxxxxxxx/liris-tei-5929.xml
auteurs_liris = nnnnnnnn (Tchounikine Anne) s,nnnnnnnn (Ahmed Usman),nnnnnnnn (Miquel Maryvonne)
auteurs_id_hal = anne-tchounikine,maryvonne-miquel
doublons_hal = hal-01256137 (https://hal.archives-ouvertes.fr/hal-01256137) Dynamic cubing for hierarchical multidimensional data space,tel-00876624 (https://hal.archives-ouvertes.fr/tel-00876624) Dynamic cubing for hierarchical multidimensional data space
parametres_manquants =
pb_publication =
simplifie = 0
labo_exterieur =
reference_hal =
creation_date = 2016-04-11T15:10:44.359391
modification_date = 2016-04-11T15:10:44.933038
sqlite> select * from liris_export_tei where length(parametres_manquants) > 0;
cd_prod = 6473
type_inist = OUV
statut = PUB
filename =
fileurl =
auteurs_liris = nnnnnnnn (Tougne Laure) s
auteurs_id_hal = laure-tougne
doublons_hal =
parametres_manquants = Première et dernière page
pb_publication =
simplifie = 0
labo_exterieur =
reference_hal =
creation_date = 2016-04-11T15:11:14.688117
modification_date = 2016-04-11T15:11:15.264018
sqlite> select * from liris_export_tei where length(erreurs_php) > 0;
cd_prod = 6888
type_inist = COLCOM
statut = PUB
filename = liris-tei-6888.xml
fileurl = xxxxxxxxxx/liris-tei-6888.xml
auteurs_liris = nnnnnnnn (Hassas Salima) s,nnnnnnnn (Armetta Frédéric),nnnnnnnn (Gueriau Maxime)
auteurs_id_hal = salima-hassas,frederic-armetta,maxime-gueriau
erreurs_php = (Severity: Warning|Message: DOMDocument::createElement(): unterminated entity reference Expo|Filename: models/publi_m.php|Line Number: 1812)
doublons_hal =
parametres_manquants =
pb_publication =
simplifie = 0
labo_exterieur =
reference_hal =
creation_date = 2016-04-13T14:59:26.986086
modification_date = 2016-04-13T15:12:15.217122
Pages HTML générées pour la comparaison entre la publication sur notre gestionnaire et la publication exportée sur HAL.
Des formulaires similaires sont générés pour la gestion des doublons.
Il faut itérer car si une partie des publications passe directement, pour les autres, il faut :
Les pdf ne sont pas déposés car on n'est pas sûr que la version présente sur notre site soit déposable.
On insère dans les métadonnées de HAL, notre identifiant de publication (référence interne).
Ainsi on peut facilement retrouver le PDF qui correspondait à la publication et passer la publication en texte intégral.
Les thèses et HDR ne sont donc pas déposées car le texte intégral est obligatoire, de plus l'ABES dépose les thèses actuelles.
On essaie de transférer la propriété aux membres dont on a les identifiants via l'en-tête On-Behalf-Of
au moment du dépôt. Ils sont alors prévenus par mail comme le déposant et peuvent corriger / compléter la publication déposée.
Une application de récupération des publications de HAL, inspirée du code ExtractionHAL a été développée et adaptée nos besoins, à notre Système d'Information.
Les données des publications sont récupérées via l'API HAL, http://api.archives-ouvertes.fr/, elles sont analysées, converties en HTML, triées/filtrées (laboratoire / membre / équipe) et affichées.
Les requêtes sont font en deux temps :
Si on ne procède pas ainsi, on obtient N réponses (N étant de 20 ou 30 environ),
et il faut ensuite refaire des requêtes pour avoir la suite des réponses, ce qui
est pénible
Il y a des requêtes construites :
``https://api.archives-ouvertes.fr/search/?q=collCode_s:LIRIS``
``https://api.archives-ouvertes.fr/search/?q=collCode_s:LIRIS%20AND%20rteamStructId_i:RTEAM``
``https://api.archives-ouvertes.fr/search/?q=collCode_s:LIRIS%20AND%20authIdHal_s:%22ID-HAL``
Le résultat de la requête, au format JSON, est conservé sur disque et constitue un cache de l'extraction des publications de HAL. En cas de problème ou s'il n'y a pas de résultat, une entrée vide est créée (sauf si le cache n'était pas vide) pour l'homogénéité de traitement.
Pour l'interaction avec une API REST, les plugins et / ou les applications suivantes sont intéressants :
Pour reformatter et valider le XML-TEI, utilisation de xmllint 1 avec le schéma XML fourni par le CCSD, https://api.archives-ouvertes.fr/documents/aofr-sword.xsd.
libxml2-utils
$ xmllint --format liris-tei-1234.xml > liris-tei-1234-pretty.xml
$ xmllint --schema aofr-sword.xsd liris-tei-1234-pretty.xml
Au démarrage, utilisation de l'application editix 2 pour étudier les contraintes décrites dans le schéma XMl