co-deduplicate 1.0.2
conditor bibloigraphic record deduplication package
Requires Python: >=3.6
Keywords: python,bibliographic record deduplication package

# Fonctionnement de l'algorithme de dédoublonnage

Dans ce qui suit, nous décrirons le fonctionnement de l'algorithme de dédoublonnage.

### 1 - Choix des champs utiles
L'algorithme reçoit en entrée un couple de notices bibliographiques (Conditor) à valider automatiquement. </br> 
Une extraction des champs est effectuée. Les champs extraits sont ensuite regroupés en catégories. </br>
Ce sont entre autre :

| catégorie | champs utilisé |
| :---: | :---: |
| identifiant | doi, pmId, nnt |
| pagination | pageRange |
| volumaison | issue, volume |
| publication | issn, issn, eissn, title.meeting, title.journal, isbn, eisbn, teiBlob |
| titre |title.default, title.en, title.fr |

Avant la comparaison, un prétraitement des champ est effectué.</br>

**Remarque** : Le champ `idConditor` est rajouté automatiquement. 

### 2 - Comparaison des champs dans chaque catégorie

#### 2.1 La comparaison des champs
La comparaison entre les champs se fait selon 2 cas :

- **1er cas** : Les champs sont tous deux renseignés :</br>
    S'ils sont identiques, alors on retourne 1 sinon on retourne -1
- **2e cas** : Au moins un des champs n'est pas renseignés:</br>
    on retourne 0

On se retrouve pour chaque comparaison avec un nombre inclus dans {-1, 0, 1.

#### 2.2 La comparaison dans un catégorie
Dans chaque catégorie, les comparaisons se font selon une certaine hiérarchie. L'idée est de
commencer la comparaison avec les champs les plus pertinents vers les ceux qui le sont moins.</br>
On passe au champ suivant lorsque on a une donnée manquante dans l'un des champ en cours.</br>
Pour étayer, prenoms l'exmple de la catégorie `identifiant` (cf. tableau ci-dessous). le `DOI` étant un identifiant fort, c'est par celui-ci que nous commencerons les comparaisons.</br> Si les `DOI` sont renseignés identiques on retourne 1 s'ils ne sont pas identiques, on retourne -1. Si l'un des `DOI` n'est pas renseignés, on passe au champ suivant.</br>
On passe  au `pmId` (champ important mais d'une importance inférieur par rapport au `DOI`). On compare selon la règle définit plus haut; c'est à dire si les `pmId` sont renseignés et qu'ils sont identiques on retourne 1 sinon -1. </br> Si l'un des `pmId` n'est pas renseignés, on passera  au `nnt`.Il faut noter que le  `nnt` étant le dernier champ du group, si pour l'une des notices, il n'est pas renseigné, on retournera 0.

Ainsi, pour chaque catégorie, on a aussi un resultat qui peut être soit -1, soit 0 ou soit 1.
Après la compararison de toutes catégories, on a un quintuple de valeurs comprises entre -1, 0 et 1.

### 3 - La règle de décision
Une règle de décision disponible [ici](http://vxgit.intra.inist.fr:60000/RichText/co-deduplicates/blob/master/deduplicate/params.py)
a été éléboré. Elle valide ou pas le couple de notices suivant le quintuple cité plus haut. La règle de décision 
est un `objet` clé -valeur dans lequel les clés sont toutes les combinaisons possibles  de quintuple de -1, 0 et 1 et en valeur la décision prise par les experts metiers pour chaque quintuple.

### 5 - La décision finale
Selon la règle de décision, il en ressort soit la valeur `1` correspondant à doublon, `-1` non doublon et `0` à incertain.


## Comment utiliser ce repertoire

**Pré-réquis** : python version(3.x)

### 1 Cloner le repertoire

Sur un terminal shell, executer la commande suivante :

```shell
git clone http://vxgit.intra.inist.fr:60000/git/RichText/co-deduplicates.git
```
### 2 Entrer dans le repertoire

Puis se déplacer dans le repertoire co-deduplicates via la commande suivante : 
```shell
cd co-deduplicates
```

### 3 Installer les dépendances
Executer les dépendances nécessaires à l'exécution du fichier via la commande suivante : 

```shell
pip install -r requirements.txt
```

### Executer le script python 
Compte tenu de la migration prochaine des données `Conditor` sur `Corhal`, deux requêtes ont été mise en place pointant sur chacune des bases énumérées.

#### Requête `Conditor`

`main_conditor.py` est un point d'entré de l'algorithme de dédoublonnage sur la base de données `Conditor`. Il prend pour argument : 

- `-u` , `--url` : L'URL de la base elasticsearch dans laquelle effectué la recherche, il doit être renseigné.
- `--index` : index de la base elasticsearch, il doit être renseigné.
- `--login`, `-l` : Le login de connexion à la base elasticsearch s'il est demandé. Il n'est pas défini par défault
- `--password`, `-pw` : Le mot de passe de connexion à la base elasticsearch s'il est demandé. Il n'est pas défini par défault.
- `--http_proxy` : l'url sécurisée du proxy. Il n'est pas renseigné par défaut. À renseigner si besoin proxy.
- `--https_proxy` : l'url non sécurisée du proxy. Il n'est pas renseigné par défaut. À renseigner si besoin proxy.
- `-s`, `--size` : le nombre de document retourner par la requête elasticsearch. La valeur par défault est 100. Il peut varier en fonction du nombre de résultats qu'on souhaite retourner par la requête elasticsearch.
- `--input` : le corpus de notice à dédoublonner au format json.

NB : 
    - L'argument `-s` ou `--size` n'est pas le nombre de notice que retourne l'algorithme mais plutôt le nombre de notices la requête elasticsearch. 
    



Pour la recherche des automatiques des doublons, lancer le script ci-dessous, dans lequel `python` est l'interprèteur et `main.py` le script à éxecuter.

On pourras tester la requête ci-dessous pour s'assurer que l'installation s'est bien déroulé.

```shell
python main_conditor.py \
    -u http://vp-conditor-es.intra.inist.fr:9200 \
    --index records-202012 \
    --input data/records.json
```
#### Requête `Corhal`

`main_corhal.py` est un point d'entré de l'algorithme de dédoublonnage sur la base de données `Corhal`. Les arguments sont identiques que de la requête `Conditor`. Ci-dessous, un exemple de requête.

```shell
python main_corhal.py \
    -u https://vicorhales1.intra.inist.fr:9200 \
    --index records-fromconditor \
    --input corhal-test.json
```