Scripts de chargement WoS / enrichissement pour l'étude GIEC du CNRS

data chore(data): Remove data extracts (-50) 1 year ago
.gitignore refactor(Makefile): Add stage numbers on output data files 1 year ago
Makefile refactor(Makefile): Add stage numbers on output data files 1 year ago
README.md docs: Find lines containing non-ASCII characters 1 year ago
corpus_WoS_vol1-50.json chore(corpus): Move corpus to the root directory 1 year ago
detect-cnrs.ini refactor(detect-cnrs): Remove two ezs statements 1 year ago
dois.txt chore(data): Use doi-vol2.txt as default input 1 year ago
enrich-etab.ini feat(enrich-institutes): Deduplicates ws.etab 1 year ago
enrich-institutes.ini feat(enrich-institutes): Deduplicate RNSR ids 1 year ago
enrich-pascal.ini refactor: Use redirection instead of FileLoad and FileSave 1 year ago
enrich-rnsr.ini perf(enrich-rnsr): Remove one level of expand 1 year ago
enrich-teeft-en.ini refactor: Use redirection instead of FileLoad and FileSave 1 year ago
extract-fields.ini fix(extract-fields): Sometimes, abstract item is not a string 1 year ago
extract-pascal-label.ini feat(extract-pascal-label): Improve script 1 year ago
harvest-from-doi.ini fix(harvest-from-doi): Prevent Request Header Fields Too Large 1 year ago
package-lock.json docs(packages): Add packages to config 1 year ago
package.json docs(packages): Add packages to config 1 year ago
README.md

Étude GIEC

Étude pour l'INSU, à partir de ~14000 DOI présents dans le WOS. À rendre pour mi-octobre 2022.

Voir https://wos-dumps.conditor.inist.fr/ et les .ini qui y sont.
Voir https://gitbucket.inist.fr/tdm/web-services/blob/master/biblio-tools/v1/wos/works/expand.ini.
Voir https://gitbucket.inist.fr/tdm/web-dumps.

Les DOI sont dans un .bib (BibTeX).

Décider sur quelle machine mettre ce dump.

WOS_API_KEY dans mon mail CNRS.

Workflow

graph TD
    A[(dois.txt)] --> B[[harvest-from-doi.ini]]
    B --> C[(corpus.json)]
    C --> D[[extract-fields.ini]]
    D --> E[(corpus-simple.json)]
    E --> F[[enrich-rnsr.ini]]
    F --> G[(corpus-simple-rnsr.json)]
    G --> H[[enrich-etab.ini]]
    H --> I[(corpus-simple-etab.json)]
    I --> J[[enrich-institutes.ini]]
    J --> K[(corpus-simple-instituts.json)]
    K --> L[[enrich-teeft.ini]]
    L --> M[(corpus-simple-teeft-en.json)]
    M --> N[[enrich-pascal.ini]]
    N --> O[(corpus-simple-pascal.json)]

Workflow

Potentiels

  • base du SAPPS (?): correspondance adresses WoS / unités du CNRS
  • alignement adresse / expression régulière pour le marquage labo
  • annotation de corpus avec un thésaurus (quel outil: XSLT ?)

Configuration ezMaster

Utiliser lodex-crontab@1.4+, avec cette configuration:

{
  "environnement": {
    "CRON_VERBOSE": true,
    "EZS_VERBOSE": false,
    "DEBUG": "ezs"
  },
  "packages": [
    "@ezs/core@2.1.0",
    "@ezs/basics@1.22.3",
    "@ezs/analytics@2.0.2"
  ],
  "files" : {
    "zip": "https://gitbucket.inist.fr/parmentf/giec-wos/archive/master.zip"
  },
  "tasks": [
    {
      "CronRule": "0 1 * * *",
      "Target": "data/corpus-simple-cnrs.json",
      "RunOnStartup": true
    }
  ]
}

Précautions préalables

Pour repérer les lignes du fichier de DOI contenant des caractères non ASCII:

perl -ne 'print "$. : $_" if /[^\0-\177]/o;' dois.txt

Décisions

  • 26/09/2022: ne pas récupérer instituts, ni enrichissement Pascal. Priorité: récupérer les notices pour tous les DOI (DOI originaux + manquants du chapitre 11)

Procédure actuelle de l'équipe

  • Vérifier le nombre de publis
  • récupération des DOI dans le rapport du GIEC (outil qui va chercher les liens dans le PDF (voir Ségia))
  • interrogation du WOS par API pour récupérer le corpus en JSON
  • identifier les pays:
    • aligner les pays avec dénominations Français en majuscules (à terme avec les hiddenLabels dans Loterre)
    • regrouper les pays éclatés (England, Welsh), (France et Outre Mer (Guadeloupe, French Guiana, ...)), table de correspondance
    • récupération du code ISO3 du pays homogénéisé (table WoS_PaysENG_Correction_Correspondance) pour la cartographie dans LODEX
  • repérage du CNRS:
    • unités internationales (anciennement UMI, maintenant IRL): ~40
    • adresses France:
      • alignement UT / base consolidée du SAPPS (2012-2020): UT -> oui/non CNRS (si oui: labo et institut) (pas les collections de SHS)
      • reliquat d'adresses non repérées: tables d'expressions régulières (lots par zones géographiques, par année pour éviter les homonymes)
      • homogénéisation des unités CNRS selon leur intitulé le plus récent (infos Grafilabo, sous forme de fichier)
  • part France / Europe: regrouper par continent
  • adresses françaises non CNRS: pas les universités, pas les tutelles, mais les autres organismes français présents hors CNRS
    • aligner avec le RNSR (web service)
    • retrouver INRIA, INSERM, INRAE, IRD, CEA, BRGM, IFREMER, Météo France:
      • trouver les tutelles des labos non CNRS (à partir du RNSR)
      • homogénéiser selon la forme des tutelles dans le RNSR (IRSTEA, INRA => INRAE)
      • filtre "big 10" (table)
  • dédoublonnage des labos (les paires UT/organisme (organisme = Identifiant + année))
  • rassemblement des organismes par UT (une colonne multivaluée des organismes)
  • organismes mondiaux: à partir du JSON (plus d'infos), voir https://trello.com/c/l0aLODjn/25-ajouter-les-organismes-au-niveau-mondial (forme normalisée par le WoS dans "Records Records Rec Static_Data Fullrecord_Metadata Addresses Address_Name Address_Spec Organizations Organization Content", si c'est le préférentiel (Pref = Y) et dans les Reprint_Addresses)
  • thématiques
    • catégories WoS subheadings (/publi)
    • ne pas prendre les keywords plus: moins pertinents
    • mots-clés d'auteur (keywords): pertinents mais peu présents
    • (interroger Incites pour récupérer les classifications)
    • Nathalie et Majid ont aligné (projection) avec le vocabulaire changement climatique (plusieurs outils); titre + résumé + mots-clés: recherche de termes (+ générique)
    • enrichissement catégories Pascal (concaténation niveau 2 et 3) sur titre + résumé (problèmes: Psychologie apparaît, noms de bases comme BGI PRODIG)
  • DOI / chapitre (MyCORE: Volume 1)

DEBUG

corpus 50 notices

Les items 25,26, 27, 29 ,30, 31, 32, 34, 35, 39, 41 ont un tableau dans le champ abstract, ce qui pose problème au web service. Il faut donc s'arranger pour n'envoyer qu'une chaîne.

corpus 12643 notices (vol1, sans le dernier chapitre)

L'enrichissement RNSR n'a rien retourné pour ces 61 UT:

$ fx < data/corpus-simple-rnsr.json '.map(n => ({uri: n.uri, rnsr: n.ws.rnsr?.[0]}))' '.map(n => ({ ok: Array.isArray(n.rnsr), ...n}))' '.filter(n => !n.ok)' '.map(n => n.uri).join("\n")'  | sort -u       
WOS:000087687000034
WOS:000201991500005
WOS:000202541600015
WOS:000259592400005
WOS:000278783300013
WOS:000297080200009
WOS:000303246100021
WOS:000307031000011
WOS:000326102600010
WOS:000328962700024
WOS:000330731300004
WOS:000336983900012
WOS:000351469300002
WOS:000358138100001
WOS:000368910100002
WOS:000369014100030
WOS:000371481700005
WOS:000375767000046
WOS:000376443100012
WOS:000382134800021
WOS:000403527800002
WOS:000415909900003
WOS:000416761600042
WOS:000417409700018
WOS:000419033400048
WOS:000425514300054
WOS:000432597400029
WOS:000433901600021
WOS:000437255400003
WOS:000437362800003
WOS:000440301400006
WOS:000446187900022
WOS:000449897200002
WOS:000451164300002
WOS:000451785200002
WOS:000462592200001
WOS:000493421500001
WOS:000515035400001
WOS:000578319700001
WOS:000598066100006
WOS:000616977100020
WOS:000620058900026
WOS:A1945XY75400007
WOS:A1949UA83200002
WOS:A1954YH20800003
WOS:A1955WU68300004
WOS:A1955ZQ16500003
WOS:A1957XF83300002
WOS:A1960XF81800012
WOS:A19614744A00031
WOS:A1961WY83500001
WOS:A1961XG98500003
WOS:A19656660700020
WOS:A19656993100009
WOS:A19679381400001
WOS:A1969E372700020
WOS:A1969E761200001
WOS:A1969F336900001
WOS:A1970H335700006
WOS:A1971I822800004
WOS:A1971J729400017

Premier cas: pas d'adresse d'affiliation (35 occurrences)

{
    "uri": "WOS:000087687000034",
    "title": "A North Atlantic climate pacemaker for the centuries",
    "abstract": "",
    "publication_year": 2000,
    "source": "SCIENCE",
    "affiliations": [],
    "countries": [],
    "subjects": [
        "Multidisciplinary Sciences",
        "Science & Technology - Other Topics"
    ],
    "subheadings": [
        null
    ],
    "headings": [
        "Science & Technology"
    ]
}

Deuxième cas: tout semble normal

{
    "uri": "WOS:000259592400005",
    "title": "On avoiding dangerous anthropogenic interference with the climate system: Formidable challenges ahead",
    "abstract": "The ... degrees C.",
    "publication_year": 2008,
    "source": "PROCEEDINGS OF THE NATIONAL ACADEMY OF SCIENCES OF THE UNITED STATES OF AMERICA",
    "affiliations": [
        "Univ Calif San Diego, Scripps Inst Oceanog, La Jolla, CA 92093 USA",
        "Univ Calif San Diego, Scripps Inst Oceanog, 9500 Gilman Dr, La Jolla, CA 92093 USA"
    ],
    "countries": [
        "USA"
    ],
    "keywords": [
        "EMISSIONS",
        "TRENDS",
        "CHINA"
    ],
    "subjects": [
        "Multidisciplinary Sciences",
        "Science & Technology - Other Topics"
    ],
    "subheadings": [
        null
    ],
    "headings": [
        "Science & Technology"
    ]
},
{
    "uri": "WOS:000278783300013",
    "title": "Compensation between Model Feedbacks and Curtailment of Climate Sensitivity",
    "abstract": "The ... of the intermodel spread.",
    "publication_year": 2010,
    "source": "JOURNAL OF CLIMATE",
    "affiliations": [
        "Harvard Univ, Cambridge, MA 02138 USA",
        "Harvard Univ, 20 Oxford St, Cambridge, MA 02138 USA"
    ],
    "countries": [
        "USA"
    ],
    "keywords": [
        "GENERAL-CIRCULATION MODELS",
        "CLOUD FEEDBACK",
        "SURFACE-TEMPERATURE",
        "SIMULATIONS",
        "PROJECTIONS",
        "MECHANISMS",
        "CYCLE"
    ],
    "subjects": [
        "Meteorology & Atmospheric Sciences"
    ],
    "subheadings": [
        "Physical Sciences"
    ],
    "headings": [
        "Science & Technology"
    ]
}

En cherchant ces deux exemples à la main, le service ne trouve aucune structure (logique, elles sont à l'étranger).

$ curl -X 'POST' \
  'https://affiliations-tools.services.inist.fr/v1/rnsr/info' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '[
  {
    "id": 1,
    "value": {
      "year": 2010,
      "address": "Harvard Univ, Cambridge, MA 02138 USA"
    }
  },
  {
    "id": 3,
    "value": {
      "year": 2010,
      "address": "Harvard Univ, 20 Oxford St, Cambridge, MA 02138 USA"
    }
  },
  {
    "id": 4,
    "value": {
      "year": 2008,
      "address": "Univ Calif San Diego, Scripps Inst Oceanog, La Jolla, CA 92093 USA"
    }
  },
  {
    "id": 5,
    "value": {
      "year": 2008,
      "address": "Univ Calif San Diego, Scripps Inst Oceanog, 9500 Gilman Dr, La Jolla, CA 92093 USA"
    }
  }
]'
[{
    "id": 1,
    "value": []
},
{
    "id": 3,
    "value": []
},
{
    "id": 4,
    "value": []
},
{
    "id": 5,
    "value": []
}]

Donc le service est capable de traiter ces adresses, et de retourner un tableau vide pour chacune. Ça n'explique pas le comportement sur ces 61 - 35 = 26 notices.

Mais comme ça n'arrive que pour 26 notices sur plus de 12000, on va juste faire en sorte que ça ne fasse pas planter le script suivant (enrich-etab.ini).