Newer
Older
giec-wos / 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](http://www.bibtex.org/)).

Décider sur quelle machine mettre ce dump.

`WOS_API_KEY` dans mon mail CNRS.

- [x] concaténer titre et abstract pour teeft
- [x] ajouter les reprint_addresses (affiliations)
- [x] enrichissement service web base Pascal
  <https://domains-classifier.services.inist.fr/v1/en/classify>,
  [doc](https://openapi.services.inist.fr/?urls.primaryName=Classification%20en%20domaines%20scientifiques#/default/post_v1_en_classify)
- [ ] récupérer les organismes

## Workflow

```mermaid
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](https://mermaid.ink/img/pako:eNpd0l1rgzAUgOG_IrnaoBZ268Vgrf3urjoYTKWkepwZmoTkZGyU_vdlxyqqV9G854FgrixXBbCIfRquq-AtTmXgn5fkIVdGO3t-V6fzt6qf5l9WyccsCMPnYJEk8IOG5xiWAurCzoUUWdaOLihZdkBoRaNruI-3yZKS2CvSiLwKjbRmSMS0v5oQbTZ0VtSteweQX4bOmvY3U4eyobOhbts7QloU6BBGB9tStZtqXWxH5I7ifU8iQIlDbU_BYapRF4IcYQdqjz2muc15PdSOVLxOtXvYWWzGGjANF4X_4df_yZRhBQ2kLPLLAkruakxZKm8-5Q7V6VfmLELjYMacLjhCLLi_Kg2LSl5b_1Vz-aFU9377A316wPA)](https://mermaid-js.github.io/mermaid-live-editor/edit#pako:eNpd0l1rgzAUgOG_IrnaoBZ268Vgrf3urjoYTKWkepwZmoTkZGyU_vdlxyqqV9G854FgrixXBbCIfRquq-AtTmXgn5fkIVdGO3t-V6fzt6qf5l9WyccsCMPnYJEk8IOG5xiWAurCzoUUWdaOLihZdkBoRaNruI-3yZKS2CvSiLwKjbRmSMS0v5oQbTZ0VtSteweQX4bOmvY3U4eyobOhbts7QloU6BBGB9tStZtqXWxH5I7ifU8iQIlDbU_BYapRF4IcYQdqjz2muc15PdSOVLxOtXvYWWzGGjANF4X_4df_yZRhBQ2kLPLLAkruakxZKm8-5Q7V6VfmLELjYMacLjhCLLi_Kg2LSl5b_1Vz-aFU9377A316wPA)

## 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+](https://github.com/Inist-CNRS/ezmaster-apps/tree/main/applications/lodex-crontab), avec cette configuration:

```json
{
  "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:

```bash
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](https://www2.cnrs.fr/graflabo/accueil.php), 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:

```bash
$ 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)

```json
{
    "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

```json
{
    "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).

```bash
$ 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`).