diff --git a/orcid-disambiguation/README.md b/orcid-disambiguation/README.md index 7eec59a..1b0ae71 100644 --- a/orcid-disambiguation/README.md +++ b/orcid-disambiguation/README.md @@ -2,44 +2,54 @@ Cette instance propose un outil de de désambiguisation d'auteur orcid -## Description du programme - - -## Utilisation +## Description et utilisation du programme - [v1/orcidDisambiguation](#v1%2forcidDisambiguation) +Ce web service prend en entrée du JSON avec deux champs, 'id' et 'value', et renvoie un JSON avec un identifiant ORCID dans le champ 'value'. +Le champ 'value' doit contenir un json contenant au minimum les deux champs suivant: +- 'firstName' : Le prénom de la personne que l'on souhaite trouver +- 'lastName' : Le nom de la personne que l'on souhaite trouver +De plus, d'autres champs facultatifs (mais fortement recommandés d'utiliser pour plus de précision) sont disponibles : +- 'email' : Une liste [] d'emails de la personne que l'on souhaite trouver +- 'titles' : Une liste [] de titres de publication scientifique de la personne que l'on souhaite trouver +- 'coAuthors' : Une liste [] de co-auteurs de la personne que l'on souhaite trouver +- 'affiliations' : Une liste [] d'affiliations (présentes ou passés) de la personne que l'on souhaite trouver +Le programme fonctionne de la façon suivante : +- Il fait une requète ORCID pour le 'firstName' et 'lastName' donnés récupérant un nombre 'nameDepth' de personnes, 'nameDepth' étant un paramètre fixé à 20, et pouvant être modifié via l'url. +- L'algorithme va ensuite prendre ces personnes une à une et effectuer dans cet ordre : + - Si une liste d'emails a été fournie en entrée, il va effectuer une comparaison avec les emails disponibles pour la personne. Il s'arrète si il y en a un en commun, et renvoie l'orcid de la personne. + L'algorithme va ensuite faire une requète afin de récupérer un nombre 'worksDepth' maximum de publications de la personne, 'worksDepth' étant un paramètre fixé à 20, et pouvant être modifié via l'url. De ces publications il va en extraire les titres ainsi que tout les co-auteurs disponibles. + - Si une liste de titres a été fournie en entrée, l'algorithme va ensuite comparer les titres de ces publications avec la liste d'entrée. Si un titre de la liste d'entrée correspond à plus de 70% avec un titre de la liste des publications de la personne, l'algorithme s'arrète et renvoie l'orcid de cette personne. + - Si une liste de co-auteurs a été fournie en entrée, l'algorithme va ensuite comparer les co-auteurs de ces publications avec la liste d'entrée. Si un co-auteur de la liste d'entrée correspond avec un co-auteur de la liste des publications de la personne, l'algorithme s'arrète et renvoie l'orcid de cette personne. + - Enfin si aucune des étapes précédentes n'est validée, et si une liste d'affiliations a été fournie, l'algorithme va comparer la liste d'affiliations d'entrée avec les affiliations présentes et passés de la personne. Plus il y a d'affiliation en commun, plus la personne obtiendra un score élévé et sera susceptible d'être retenue à la fin. + - Pour finir, des points sont également ajoutés au score si la personne a le même nom, le même prénom ou la même initiale que le prénom de la personne que l'on souhaite retrouver. + Si au cour de cette boucle l'algorithme ne s'est pas arrété suite à un email, titre ou co-auteur, il renverra la personne ayant obtenu le plus gros score. + +Pour les combinaisons de prénom/nom très communes dans certains pays (Par exemple John Smith, Yue Chen), il est conseillé d'augmenter le paramètre 'nameDepth'. Cependant cela risque également d'augmenter le temps de calcul. +De plus l'algorithme renverra dans la majorité des cas un résultat, mais il est possible que celui-ci soit incorrect si aucun des arguments d'entrée n'a aidé à identifier la personne recherchée. +Remarque : On ne pourra pas trouver une personne à l'aide de titres, co-autheurs, emails et affiliations si cette personne n'a pas rentré ces données dans son compte orcid, par conséquent une personne étant sur orcid mais n'ayant mis aucune information à disposition peut ne pas être trouvée. ## Exemple ```bash -$ cat < 0.7: - print("matching title ",ratio) return [[orcid,["title "+tit],100]] if "coAuthors" in self.infoDic: #check coAuthors - print("Checking Co-authors") authorsPutcode = [] for putcode in worksInfo["putcode"]: authorsPutcode += self.getCoAuthorsFromPutcode(putcode,orcid) @@ -194,7 +182,6 @@ return [[orcid,["Co-authors "+choice],100]] if "affiliations" in self.infoDic: #check affiliations - print("Checking affiliations") for affiliation in self.infoDic["affiliations"]: if affiliation.lower() in [aff.lower() for aff in personInfos["affiliations"]]: matchArg.append("Affiliation "+affiliation) diff --git a/orcid-disambiguation/v1/orcidDisambiguation.ini b/orcid-disambiguation/v1/orcidDisambiguation.ini index 5a05812..ef8931b 100644 --- a/orcid-disambiguation/v1/orcidDisambiguation.ini +++ b/orcid-disambiguation/v1/orcidDisambiguation.ini @@ -18,10 +18,10 @@ post.parameters.2.schema.type = int post.parameters.2.description = Maximum number of people to check -post.parameters.2.in = query -post.parameters.2.name = worksDepth -post.parameters.2.schema.type = int -post.parameters.2.description = Maximum number of works we take for a person +post.parameters.3.in = query +post.parameters.3.name = worksDepth +post.parameters.3.schema.type = int +post.parameters.3.description = Maximum number of works we take for a person [use] plugin = @ezs/spawn diff --git a/orcid-disambiguation/v1/orcidDisambiguation.py b/orcid-disambiguation/v1/orcidDisambiguation.py index b988b6d..af639ad 100644 --- a/orcid-disambiguation/v1/orcidDisambiguation.py +++ b/orcid-disambiguation/v1/orcidDisambiguation.py @@ -3,6 +3,7 @@ import sys import json import plac +from ftfy import fix_encoding @plac.annotations( nameDepth = ("Maximum number of people to check" ,"option", "p", int ), @@ -11,12 +12,14 @@ def main(nameDepth = 20, worksDepth = 20): for line in sys.stdin: + line = fix_encoding(line) data = json.loads(line) infos = data['value'] - db = disambiguate(infos,nameDepth=nameDepth, worksDepth=worksDepth ) + info = infos[0].copy() + db = disambiguate(info,nameDepth=nameDepth, worksDepth=worksDepth ) result = db.disambiguation() if len(result)>0: - data['value'] = str(result[0][0]) + data['value'] = result[0][0] else: data['value'] = "None" sys.stdout.write(json.dumps(data))