12 ChatGPT pour la normalisation des données et la résolution d’entités

Par : Tanner Giroux et Chantal Branch

19 mars 2024 / Université d’Ottawa – École de Gestion des Affaires Telfer

L’Explorateur FinTech : Un Guide Complet

 

La normalisation des données fait référence à la transformation des données sous une forme standard que les ordinateurs et les utilisateurs peuvent mieux comprendre. Un bon exemple est la standardisation des dates entre les ensembles de données. Certaines régions géopolitiques ou entreprises formatent les dates au format mois/jour/année, qui ne peut pas être mélangé avec le format jour/mois/année utilisé par d’autres zones, nécessitant ainsi des outils d’analyse pour normaliser les données de date. La résolution d’entité est le processus qui détecte les relations et résout les entités, comme la suppression ou la combinaison d’entrées de données ou de comptes en double en détectant les identifiants clés dans l’ensemble de données. Les capacités de ChatGPT dans de multiples scénarios liés à la normalisation et à la résolution des divergences dans les données suscitent un intérêt croissant,

Par exemple, si une banque devait saisir le nom d’un client sans deuxième prénom pour une transaction et qu’une autre saisissait la date dans un format différent, cela entraînerait des incohérences dans les données et affecterait négativement la capacité de la banque à garantir l’exactitude des données des clients et des auditeurs. Une norme d’entrée réduirait les écarts. La résolution d’entité est le processus permettant de déterminer si les différentes entrées de données sont identiques (Pocock, 2023). Il peut souvent être source de confusion lorsqu’un client se voit attribuer deux numéros de client distincts ou qu’une facture est attribuée deux fois à la même personne, ce qui peut entraîner des déséquilibres comptables et de la confusion. La résolution d’entité joue un rôle clé pour garantir l’exactitude de la base de données d’une entreprise et est essentielle dans l’analyse financière, car les données faisant référence à un compte avec un doublon peuvent ne pas démontrer l’étendue complète de l’activité financière d’un client ou d’une entreprise. Les données non résolues et non standardisées contribuent à l’absence de détection des activités frauduleuses et créent des opportunités pour que la fraude passe inaperçue, permettant ainsi aux criminels de continuer à profiter de la négligence des entreprises et des systèmes.

 

Comment fonctionne le ChatGPT ?

Récemment, les systèmes d’IA ont été utilisés pour la normalisation des données et la résolution d’entités sous la forme de modules d’apprentissage en profondeur. Ils sont les mieux adaptés à cette tâche car ils peuvent utiliser des réseaux neuronaux qui fonctionnent plusieurs fois plus rapidement comme un cerveau humain (Wolfe, 2021). ChatGPT et d’autres grands modèles de langage sont principalement utilisés pour l’analyse de texte, et non pour le filtrage et le tri des données. Cela étant dit, si les données contiennent principalement du texte ou des processus non mathématiques, elles possèdent toujours la capacité d’être efficaces à la fois pour standardiser les données et pour détecter les anomalies et les doublons dans les données.

Quatre tests ont été effectués sur ChatGPT pour évaluer sa précision, son temps et ses coûts associés à un ensemble diversifié de tests de grammaire, de normalisation des données textuelles et d’identification et de résolution d’entités. Les entrées utilisées ont été conçues à l’aide d’une méthode appelée « ingénierie d’invite », utilisant deux méthodes différentes : l’invite Zero-Shot (souvent appelée « Entrée directe » dans ce rapport) et l’invite Chaîne de pensée (COT). L’invite Zero-shot consiste à saisir ou à demander directement au programme de faire quelque chose sans plus d’informations que nécessaire. D’un autre côté, l’incitation à la chaîne de pensée est la méthode qui aide l’IA à créer et à régurgiter ses processus de pensée. Cette méthode permet à l’utilisateur de mieux expliquer ce qu’il souhaite que l’IA fasse, et comme ChatGPT affichera son processus logique, il est plus facile de manipuler les étapes du processus global (Weng, 2023). Cela peut être fait en donnant des exemples avant le test pour renforcer les étapes logiques ou en saisissant une étape à la fois pour détecter rapidement les erreurs dans les résultats (Wei et al., 2023). Ces tests comparent les performances de trois humains à différents niveaux d’éducation à GPT 3.5 et GPT 4, et déterminent la méthode d’incitation la plus précise et la plus efficace à utiliser pour les tâches d’analyse de données en mesurant la précision, le temps nécessaire pour demander l’information et le temps nécessaire pour calculer, et le coût pour déterminer l’efficacité. Les sujets humains sont étiquetés comme suit : S.A., un étudiant de 3e année en informatique de l’Université Carleton ; J.B., étudiant de 1re année en éducation des jeunes du Collège Algonquin; et BR, étudiant de 4e année en finance de l’Université d’Ottawa. Chacun des trois volontaires a reçu une invite similaire à l’invite de chaîne de pensée donnée à ChatGPT pour réduire les écarts et éliminer tout avantage.

 

Premier test : texte de base

Le premier test a déterminé la capacité de ChatGPT à suivre des invites très basiques en lui donnant un ensemble de 10 phrases anglaises de base (tableau 1) avec des erreurs de grammaire, d’orthographe, de majuscules et de ponctuation. Ce test a été utilisé comme base de référence pour évaluer la capacité du modèle à suivre les instructions et à comparer équitablement les sujets humains sur des tâches simples. Le test nous a également aidé à déterminer quelles invites étaient les meilleures à utiliser comme standard et à nous familiariser avec les capacités de base de chaque modèle.

 

Tableau 1. Premier test : données de test de base

Données de test: Corrections:
the dog hoped over the fence The dog hopped over the fence.
Are there hats on backwards? Are their hats on backwards?
whats up with him? What’s up with him?
Look at that plain fly Look at that plane fly.
“Hello there,” said susan. “Hello there,” said Susan.
I have a apple I have an apple.
I wood like a cheeseburger please. I would like a cheeseburger, please.
Youre not very good at this. You’re not very good at this.
My watch is made of sliver My watch is made of silver.
Math is a very difficult subject Math is a very difficult subject.

En raison de la nature simple du test lui-même, aucune grande différence n’était attendue entre les méthodes d’invite et leur modèle similaire. GPT 3.5 utilisant à la fois les invites Zero-Shot et Chain-of-Thought n’a pas réussi à obtenir un score parfait, ne corrigeant que 9 phrases sur 10, les deux fois étant incapable de détecter l’erreur dans la phrase « Y a-t-il des chapeaux à l’envers ? Le tir zéro a donné lieu à la sortie suivante : “Les chapeaux sont-ils à l’envers ?” ce qui est grammaticalement correct mais change le sens du texte. COT n’a trouvé aucune erreur dans le texte et a réédité la phrase sans modification. GPT 4.0 utilisant à la fois Zero-Shot et COT a obtenu des résultats parfaits, comme prévu.

Par rapport aux sujets humains, les deux modèles, quelle que soit la méthode d’invite, ont obtenu des résultats supérieurs à ceux des sujets et ont pris beaucoup moins de temps pour accomplir la tâche. SA a obtenu un score de 70 % à 3h12, plus rapide que GPT 3.5, pour parcourir la série de textes avec une invite COT à 3h21. BR a mis plus de temps (5 :40) et a marqué 80 %. JB a marqué le même score, en prenant beaucoup plus de temps (20 :43). ChatGPT 4.0 avec Zero-shot était de loin le plus efficace pour cette tâche, car il a obtenu des résultats parfaits et a pris le moins de temps (00:14,89) parmi tous les modèles ou méthodes d’invite. Le tableau 2 montre les résultats du test.

 

Tableau 2. Résultats du test 1

ChatGPT: Précision: Temps:
GPT 3.5 (Direct Entry) 90% 00:16.05
GPT 3.5 (COT & Self Consistency) 90% 03:21.49
GPT 4.0 (Direct Entry) 100% 00:14.89
GPT 4.0 (COT & Self Consistency) 100% 01:09:74

 

Deuxième test : texte avancé

Le deuxième test s’appuyait sur la logique précédemment établie de correction de la grammaire, de l’orthographe, des majuscules et de la ponctuation, mais le texte était désormais sous forme de paragraphes avec un langage plus avancé et un besoin de comprendre le contexte dans le texte pour corriger les phrases (Tableau 3). Le texte avancé a été utilisé pour déterminer sa capacité à capturer le contexte dans des séries d’informations plus longues et à conserver le contexte d’une utilisation plus large de jetons, ainsi qu’à évaluer les capacités des trois sujets humains concernant leurs capacités sur la même tâche.

Nous avons émis l’hypothèse qu’en raison de la nature du test nécessitant des indices contextuels, suivre le processus logique étape par étape encouragerait de meilleurs résultats pour les deux modèles. Dans chaque cas, c’était vrai. GPT 3.5 a obtenu un score de 82,14 % avec Zero-Shot et de 86,90 % avec COT. GPT 4.0 avec Zero-shot a obtenu un score de 86,31 %, tandis que COT a réussi à l’augmenter à 95,24 %. Dans chaque cas, suivre la logique étape par étape a encouragé ChatGPT à produire des corrections plus réfléchies et à garantir que le contexte des paragraphes reste cohérent. Lors des tests sur l’homme, SA a obtenu un score de 39,1 % en 20 :08,26, JB un score de 82,74 % en 36 :41,16 et BR un score de 77,38 % en 17 :21,51. Dans tous les cas, ChatGPT a pris beaucoup moins de temps. GPT 3.5 et 4.0 avec invite Zero-Shot n’ont pris que 44,23 secondes et 43,83 secondes, respectivement. Leurs homologues COT ont réalisé des temps de 3:02.20 et 3:16.18, beaucoup plus rapides que les sujets testés. Nous pouvons facilement conclure que ChatGPT est plus efficace pour corriger les erreurs liées au texte à mesure que la longueur de la tâche liée au texte augmente. Le tableau 4 montre ces résultats dans un tableau.

 

Tableau 3. Test 2 : données de test avancées

Données de test: Corrections:
My name is Jay Hammond I am a firefighter. I live in 128 Pine Lane, in Jackson, Mississippi. I have two childs. One is a girl named Clair. The other is boy named Thatcher. His name after my father. I also have a wife named Jenna. She is beutiful. She has long, dark, soft hair. We also got a dog named Buck. He is very obedient but sometimes he barks at night and it upsets our neighbors! My name is Jay Hammond. I am a firefighter. I live at 128 Pine Lane, in Jackson, Mississippi. I have two children. One is a girl named Clair. The other is a boy named Thatcher. He is named after my father. I also have a wife named Jenna. She is beautiful. She has long, dark, soft hair. We also have a dog named Buck. He is very obedient but sometimes he barks at night and it upsets our neighbors!
Well, its another rainy day. I wonder what I will do? First, I think I’ll take a walk around the neyborhood to stretch my legs. Second I’ll cook a big breakfast with toast fruit eggs and bacon. After that, I might mow my lawn; it’s getting pretty long. I’m not sure what I’ll do after that. I guess I should go see my mother. I think she wants me to go grocery shopping with her. I have no idea why she can’t just go by herself. Or, better still, she could ask my dad to go with her! I doubt he will want to go with her though. He doesn’t like going to the grocery store as much as I do! Well, it’s another rainy day. I wonder what I will do. First, I think I’ll take a walk around the neighborhood to stretch my legs. Second, I’ll cook a big breakfast with toast, fruit, eggs, and bacon. After that, I might mow my lawn; it’s getting pretty long. I’m not sure what I’ll do after that. I guess I should go see my mother. I think she wants me to go grocery shopping with her. I have no idea why she can’t just go by herself. Or, better still, she could ask my dad to go with her! I doubt he will want to go with her though. He dislikes going to the grocery store as much as I do!
“To be, or not to be…that is the question” This wellknown utterance has been the source of both mystery and wonderment for students around the world since the turn of the 16th century—arguably the zenith of Shakespeare’s creative output. However, the mere ubiquity of this phrase fails to answer some basic questions about it’s rather context. Where did it come from what does it mean? The first of these questions (where does it come from?) can be answered fairly easily: from Shakespeare’s famous play Hamlet. As for the last of the two questions, a complete answer would require a more deep look at Shakespearean culture and nuance. “To be, or not to be…that is the question.” This well-known utterance has been the source of both mystery and wonderment for students around the world since the turn of the 16th century—arguably the zenith of Shakespeare’s creative output. However, the mere ubiquity of this phrase fails to answer some basic questions about its rather context. Where did it come from? What does it mean? The first of these questions can be answered fairly easily: from Shakespeare’s famous play Hamlet. As for the latter question, a complete answer would require a more in depth investigation of Shakespearean culture and nuance.

 

Tableau 4. Résultats du test 2

ChatGPT: Précision: Temps:
GPT 3.5 (Zero-Shot) 82.14% 00:44.23
GPT 3.5 (COT) 86.90% 03:02.20
GPT 4.0 (Zero-Shot) 86.31% 00:43.83
GPT 4.0 (COT) 90.07% 03:16.18

 

Troisième test : exemple d’ensemble de données

Pour le troisième test, un ensemble de données avec les colonnes « Nom », « Adresse », « Province », « Code postal », « Numéro de téléphone », « Courriel », « Numéro de client », « Montant de la transaction » et « Date de la transaction ». a été créé avec des données formatées de manière aléatoire. Les données du tableau (annexe 1A) contenaient des erreurs dans le formatage des colonnes ci-dessus qui peuvent être constatées dans un environnement de travail réel, telles que des noms saisis sous la forme « nom de famille, prénom » et « nom, nom de famille » ou adresse. lignes contenant le nom de la rue ayant le type de rue abrégé en « st » au lieu de « street », les provinces étant à la fois en format long et abrégé, les codes postaux étant en minuscules ou manquant un espace entre la région de tri d’acheminement (trois premiers chiffres) et l’unité de livraison locale (trois derniers chiffres), les numéros de téléphone étant dans plusieurs formats différents, tels que des parenthèses autour des indicatifs régionaux manquants, des traits d’union, des espaces ou rien entre les groupes de chiffres, les montants étant formatés pour contenir plus de deux décimales et les dates étant en jour/mois/année et en mois/jour/année. Les données contenaient également d’éventuels comptes en double avec des informations d’identification correspondantes, telles que des noms, adresses, numéros de téléphone et adresses e-mail.

Ce test visait à déterminer l’efficacité de ChatGPT dans sa capacité à lire des ensembles de données au format tabulaire, à évaluer son exactitude dans la normalisation de plus grandes quantités d’informations dans une conversation, et à identifier et corriger les entrées de compte en double en fusionnant les comptes. Ce test espérait déterminer le modèle le plus efficace entre GPT 3.5 et GPT 4.0, ainsi que le GPT d’analyse de données publié avec la mise à jour GPT personnalisée en novembre 2023. Les GPT sont tous comparés sur la base d’un score de précision basé sur la proximité de l’ensemble de données généré. correspondait à l’ensemble de tests standardisés, ainsi que le temps nécessaire à chaque modèle pour atteindre un résultat final et une estimation du coût qu’il en coûterait à une entreprise pour exécuter chaque modèle sur la base des prix des jetons à partir de novembre 2023. Le test a également déterminé l’efficacité. contre des sujets de test ayant fait des études postsecondaires pour déterminer comment les emplois de base en données pourraient bientôt être remplacés par des LLM. Contrairement aux tests précédents, la précision était mesurée par le nombre de corrections apportées aux erreurs présentes. Le test a mesuré l’exactitude de chaque colonne en fonction du nombre d’erreurs présentes à la fin et de l’exactitude moyenne des champs « Nom », « Adresse », « Province », « Code postal », « Montant de la transaction » et « Transaction ». Date” a dicté le score final pour ce modèle et cette méthode d’invite. Ce changement a été effectué en raison de la tendance de ChatGPT à halluciner fréquemment les lignes d’adresse, les noms et les chiffres lorsque les fichiers sont au format Excel. La résolution de l’entité est jugée sur sa capacité à signaler cinq doublons possibles, dont quatre sont définitifs, ainsi qu’à supprimer les doublons définitifs et à ajouter les montants des transactions sur un compte avec la date de transaction la plus récente.

 

Figure 1. Exemples de données pour le test 3

L’image ci-dessus (Figure 1) est la feuille de test utilisée dans cette expérience, où les couleurs correspondantes représentent les comptes qui pourraient être signalés comme des doublons. Les comptes nommés Anthony White doivent uniquement être signalés et non automatiquement modifiés, car seuls leurs noms sont des doublons. En revanche, les autres disposent d’informations d’identification clés telles que l’adresse et les coordonnées, ce qui pourrait signifier des erreurs de saisie de données lors de la création d’un nouveau compte pour la même entité.

ChatGPT s’est montré très prometteur dans sa capacité à standardiser les données dans de grands ensembles de données. ChatGPT a obtenu un score de 79 % ou plus dans tous les cas, les deux modèles ayant obtenu un score de 100 % avec l’invite de chaîne de pensée. GPT 3.5, avec une invite de tir zéro, a réussi une précision de 79 %, en seulement 30,32 secondes. L’ensemble de la conversation a généré environ 440 jetons d’entrée et environ 1 220 jetons de sortie, pour un coût total d’environ 0,006 USD (dollars américains). GPT 3.5 avec COT a obtenu un score parfait de 100 % dans les tâches de normalisation en 7 :27,06 minutes. En raison de la nature de la méthode d’invite, il a fallu plus de jetons pour obtenir un résultat positif, générant environ 704 jetons d’entrée et environ 2 233,33 jetons de sortie, pour un total de 0,011 USD, soit environ deux fois plus que son homologue sans tir. ChatGPT 4.0 avec invite zéro merde a pris beaucoup plus de temps à 2:58,15 pour atteindre une précision de 83,55 % tout en générant environ 444 jetons d’entrée et environ 1 264 jetons de sortie, ce qui correspond à un coût total de 0,178 USD. GPT 4.0 avec COT a également réussi à obtenir une précision parfaite, mais a pris plus de temps que GPT 3.5 avec COT, prenant 12 : 37,47 pour accomplir la même tâche. Cette méthode s’est également avérée la plus coûteuse, avec environ 750,67 entrées et environ 3 588 sorties, pour un total de 0,476 USD. Les 3 sujets testés ont tous obtenu des résultats très élevés. SA a atteint une précision de 96,88 % en 54 :29,29, JB a obtenu un score de 95 % en 1 :32 :10,03 et BR a réussi 98,75 % en 30 :03,42. Pour standardiser les données, ChatGPT 3.5 avec invite de chaîne de pensée est l’option la plus rentable et la plus rapide des options testées, surpassant les deux modèles zéro tir et étant nettement plus rapide que n’importe quel sujet humain.

 

Tableau 5. Résultats du test 3

ChatGPT: Standardisation: Détection ER: Résolution ER:
GPT 3.5 (Direct Entry) 79% 4/5 4/3 = 1 over
GPT 3.5 (COT) 100% 4/5 0/3
GPT 4.0 (Direct Entry) 83.55% 1/5 1/3
GPT 4.0 (COT) 100% 5/5 3/3

Les résultats de résolution d’entité n’ont pas suivi la tendance des tests précédents, où GPT 4.0 surpasserait 3,5 et COT surpasserait systématiquement Zero-shot. Dans ce cas, les résultats étaient plus irréguliers, GPT 3.5 détectant 4 des 5 entités possibles dans les tests Zero-shot et COT. Étonnamment, la version 3.5 avec Zero-shot a supprimé les trois doublons confirmés et l’un des doublons non confirmés, ce qui, dans un contexte réel, pourrait entraîner la perte de données clés pour le client et la banque donnés. GPT 3.5 avec COT a détecté 4 comptes sur 5 mais n’a pu en supprimer aucun, devenant peu coopératif lors des étapes, demandant la suppression du compte et l’ajout des montants des transactions aux données les plus récentes liées au compte. GPT 4.0 avec Zero-shot n’a pu détecter et corriger qu’un seul des cinq comptes, ce qui en fait le moins performant. GPT 4.0 avec COT a réussi à détecter les cinq comptes, à supprimer avec succès les 3 comptes en double confirmés et à fournir une logique solide dictant pourquoi les étapes de suppression de chaque compte ont été prises. Les participants humains ont apparemment mieux réussi, SA trouvant les cinq comptes possibles mais corrigeant également les cinq, dont deux ne sont pas des doublons. J.B. et BR ont tous deux trouvé les trois bons comptes, mais JB n’a corrigé qu’un seul récit, tandis que BR a été capable de corriger les trois bons qu’ils ont trouvés.

 

L’avenir de l’IA dans la gestion des données financières

Cette étude confirme l’efficacité de ChatGPT, en particulier lorsqu’il est amélioré par des invites de chaîne de pensée, en tant qu’outil puissant pour les tâches de standardisation des données. Il gère habilement les corrections textuelles et numériques, ce qui indique son fort potentiel pour rationaliser les tâches de gestion de données traditionnellement gérées par les analystes humains. Bien que ChatGPT excelle dans ces domaines, sa capacité à automatiser des tâches complexes de résolution d’entités continue d’évoluer. Cela indique un modèle hybride dans lequel l’IA soutient les analystes humains plutôt que de les remplacer, optimisant ainsi la précision et l’efficacité des processus de gestion des données.

 

Implications stratégiques pour l’intégrité des données financières

L’intégration d’une IA comme ChatGPT dans la gestion des données offre des avantages stratégiques substantiels, notamment des gains de temps et des réductions de coûts importants. Ces avantages sont cruciaux pour les institutions financières où l’intégrité des données est primordiale. En automatisant les tâches de normalisation des données de routine, les entreprises peuvent allouer des ressources humaines à des initiatives plus complexes et stratégiques, améliorant ainsi l’innovation commerciale globale et leur avantage concurrentiel.

 

Défis et recommandations pour la mise en œuvre

Malgré les résultats prometteurs, le remplacement complet par l’IA de la surveillance humaine dans la gestion des données financières est prématuré. Les limites de la technologie en matière de prise de décision nuancée et de résolution de problèmes complexes nécessitent une implication humaine continue. Pour maximiser les avantages de l’IA, les entreprises doivent envisager des mises en œuvre progressives, en commençant par des projets pilotes permettant des tests et une intégration itératifs. Cette approche permet aux organisations de calibrer les applications d’IA en fonction de besoins opérationnels spécifiques et d’ajuster leurs stratégies en réponse à l’évolution des capacités de l’IA.

 

Naviguer dans l’avenir de l’IA en entreprise

À mesure que les technologies d’IA comme ChatGPT continuent de progresser, leur rôle dans les processus métier va probablement s’étendre, rendant impératif un investissement continu dans le développement et la formation de l’IA. Les organisations doivent rester agiles, mettre à jour et adapter leurs stratégies d’IA pour tirer parti des capacités émergentes et garantir l’alignement avec les objectifs commerciaux. De plus, la promotion d’une culture d’innovation et d’apprentissage continu sera essentielle pour exploiter tout le potentiel de l’IA.

ChatGPT représente une avancée technologique significative avec le potentiel de transformer les pratiques de gestion des données. En intégrant l’IA de manière responsable et stratégique, les entreprises peuvent améliorer leurs processus analytiques, améliorer l’intégrité des données et garder une longueur d’avance dans un paysage numérique en évolution rapide. Les recherches futures devraient se concentrer sur le dépassement des limites actuelles et sur l’expansion des capacités de l’IA pour automatiser entièrement les tâches complexes d’analyse de données, garantissant ainsi que les entreprises puissent atteindre les normes les plus élevées en matière de précision des données et d’efficacité opérationnelle.

 

Références

Di Cicco, V., et al. (2019). Interprétation des modèles d’apprentissage profond pour la résolution d’entités : un rapport d’expérience utilisant LIME. Association for Computing Machinery, Article 8, 1-4. https://doi.org/10.1145/3329859.3329878

Pocock, K. (20 mai 2023). Qu’est-ce que ChatGPT et à quoi sert-il ? PC Guide. https://www.pcguide.com/apps/what-is-chat-gpt/

Quantexa. (23 juin 2022). Résolution d’entités. Quantexa. https://www.quantexa.com/entity-resolution/#chapter-4

Wei et al. (10 janvier 2023). La chaîne de pensée incite le raisonnement dans les grands modèles de langage. Google Brain Team. https://doi.org/10.48550/arXiv.2201.11903

Weng, L. (15 mars 2023). L’ingénierie de l’invite. Github. https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/#references

Wolfe, M. (14 septembre 2021). L’apprentissage profond dans la science des données. Medium. https://towardsdatascience.com/deep-learning-in-data-science-f34b4b124580

License

Icon for the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License

The FinTech Explorer: A Comprehensive Guide to Case Studies, Course Notes, and Emerging Trends Copyright © by Qianru (Cheryl) Qi; Shaista Jaffer; and Adelphe Ekponon is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License, except where otherwise noted.

Share This Book