Inist-CNRS / lodex

Linked Open Data EXperiment
https://www.lodex.fr/
Other
54 stars 12 forks source link

Le transformer Mapping ne fonctionne pas correctement #2139

Closed AnaelKremer closed 2 months ago

AnaelKremer commented 2 months ago

Copie du message d'origine de @yanngui23 dans le canal mattermost :

j'ai une question au sujet du transformer 'MAPPING" car celui-ci agit plusieurs fois sur les valeurs. Alors, peut-être que cela a été prévu comme cela pour une raison que je ne connais pas (s'il n'y en a pas, je fais une issue), mais cette fonction agit sur des valeurs déjà mappées une fois. Par exemple, si je mets dans la liste entre autres ["BD":"BGD";"BG":"BGR","GR":"GRC"], "BD" se retrouve transformé en "BGRCD". La question est donc : est-ce un bug ou est-ce prévu pour couvrir des besoins particuliers ?

Le transformer Mapping transforme effectivement plusieurs fois >

image

Je pense que cela est dû à l'utilisation de la fonction reduce dans le code et surtout au split effectué

return Object .keys(list) .reduce((currentValue, searchValue) => currentValue .split(searchValue) .join(list[searchValue]), value); };

dans l'exemple "US" a une équivalence, il transforme donc en "USA", qui devient le nouvel accumulateur. .split(searchValue) va ensuite découper "USA" en ["U","SA"] car "SA" est également dans le dictionnaire. Il remplace donc "SA" puis le join renvoie le "U" devant.

Ces segmentations créent donc des "occurences imbriquées", qui peuvent donc être transformés x fois.

AlasDiablo commented 2 months ago

Après analyse, le problème est plus compliqué qu'il y parais, car il faut prendre en compte le contexte d'utilisation, car il peut être utilisé pour modifier une phrase donc le problème soulevait ici n'est pas forcément valide, mais dans le cas d'un tableau de référence qui ne marche pas le problème cité et pertinent, je préférer par m avant sur un fixe. Je l'aise la désistion à @touv

AnaelKremer commented 2 months ago

Il faut peut être spécifier (et décider de ) l'utilisation des différents transformers.

Pour modifier des mots ou des phrases je pense que replace et replaceregex sont davantage pertinents que mapping, que je vois plus comme utile pour de la verbalisation de codes ou d'identifiants.

touv commented 2 months ago

De mémoire, le Transformer mapping a été ajouté pour verbaliser des codes, d'ailleurs la documentation est écrite dans ce sens https://www.lodex.fr/docs/documentation/principales-fonctionnalites-disponibles/transformer-des-donnees/

sauf pour l'exemple, qui laisse à penser à des remplacements de mots !!!

La correction de ce problème devrait faire en sorte d'éviter les remplacements en cascade.

AnaelKremer commented 2 months ago

Suite à notre discussion en live et donc sans pouvoir tester correctement mon code dans le bon environnement , je propose cette correction

return Object .keys(list) .reduce((currentValue, searchValue) => { const regex = new RegExp(\b${searchValue}\b, 'g'); return currentValue.replace(regex, list[searchValue])}, value);

On ajoute une regex avec un délimiteur de mot qui permet de ne pas découper les chaînes en sous-chaînes. Mais la déclaration de ma constante n'est peut être pas au bon endroit...