{"id":20673,"date":"2025-09-18T19:18:38","date_gmt":"2025-09-18T19:18:38","guid":{"rendered":"https:\/\/www.directimpactsolutions.com\/ia-et-filemaker-la-correspondance-dentites-partie-1-2\/"},"modified":"2025-11-06T03:54:35","modified_gmt":"2025-11-06T03:54:35","slug":"ia-et-filemaker-la-correspondance-dentites-partie-1-2","status":"publish","type":"post","link":"https:\/\/www.directimpactsolutions.com\/fr\/ia-et-filemaker-la-correspondance-dentites-partie-1-2\/","title":{"rendered":"IA et FileMaker : la correspondance d\u2019entit\u00e9s \u2013 Partie 1"},"content":{"rendered":"<h4 class=\"wp-block-heading\">Une approche technique pour exploiter Semantic Find afin de r\u00e9soudre le probl\u00e8me complexe du \u201cfuzzy matching\u201d<\/h4><div class=\"wp-block-uagb-info-box uagb-block-1c3842f4 uagb-infobox__content-wrap  uagb-infobox-icon-above-title uagb-infobox-image-valign-top\"><div class=\"uagb-ifb-content\"><div class=\"uagb-ifb-icon-wrap\"><svg xmlns=\"https:\/\/www.w3.org\/2000\/svg\" viewbox=\"0 0 512 512\"><path d=\"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM371.8 211.8C382.7 200.9 382.7 183.1 371.8 172.2C360.9 161.3 343.1 161.3 332.2 172.2L224 280.4L179.8 236.2C168.9 225.3 151.1 225.3 140.2 236.2C129.3 247.1 129.3 264.9 140.2 275.8L204.2 339.8C215.1 350.7 232.9 350.7 243.8 339.8L371.8 211.8z\"><\/path><\/svg><\/div><div class=\"uagb-ifb-title-wrap\"><h3 class=\"uagb-ifb-title\"><strong>\u00c9V\u00c9NEMENT \u00c0 VENIR : \u201cUsing AI to Handle Duplicates in FileMaker\u201d <br\/>(Audio en anglais avec sous-titres simultan\u00e9s en fran\u00e7ais)<\/strong> <\/h3><\/div><p class=\"uagb-ifb-desc\">Rejoignez Direct Impact Solutions pour un webinaire en direct exclusif et d\u00e9couvrez comment l\u2019IA peut simplifier la recherche dans vos donn\u00e9es, d\u00e9tecter et nettoyer les doublons, et les pr\u00e9venir avant qu\u2019ils ne surviennent.<br\/><br\/>\ud83d\udcc5 <strong>Date :<\/strong> 30 septembre 2025<br\/>\u23f0 <strong>Heure : <\/strong><strong>11h00 Pacifique \/ 14h00 Heure de l\u2019Est \/ 20h00 Europe Centrale<\/strong><br\/>\ud83d\udd17 <strong>R\u00e9servez votre place ici:<\/strong> <a href=\"https:\/\/zoom.us\/webinar\/register\/WN_iI0mOhzDRNGzCWZAgtOqBQ\" target=\"_blank\" rel=\"noreferrer noopener\">Inscription au webinaire<\/a><br\/><br\/><strong>Animateur : <\/strong>David Weiner, d\u00e9veloppeur s\u00e9nior et charg\u00e9 de projet chez Direct Impact Solutions<br\/><strong>Langues : <\/strong>Audio en anglais avec sous-titres simultan\u00e9s en fran\u00e7ais<br\/><br\/>Ne manquez pas cette occasion unique d\u2019interagir avec nos experts et d\u2019explorer tout le potentiel de l\u2019IA dans FileMaker pour votre organisation !<\/p><\/div><\/div><figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"975\" height=\"357\" src=\"https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image.png\" alt=\"\" class=\"wp-image-20645\" srcset=\"https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image.png 975w, https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-300x110.png 300w, https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-768x281.png 768w, https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-600x220.png 600w\" sizes=\"auto, (max-width: 975px) 100vw, 975px\" \/><\/figure><p><a href=\"https:\/\/www.directimpactsolutions.com\/fr\/ia-et-filemaker-la-correspondance-dentites-partie-1\/\">Dans la partie 1 de cet article<\/a>, j\u2019ai d\u00e9crit en quoi la fonction <strong>Recherche s\u00e9mantique<\/strong> (Semantic Find) de FileMaker diff\u00e8re de la recherche classique, ce qu\u2019est la <a href=\"https:\/\/neo4j.com\/blog\/graph-database\/what-is-entity-resolution\/\" target=\"_blank\" rel=\"noreferrer noopener\">correspondance d\u2019entit\u00e9s<\/a> (Entity Matching) (et pourquoi elle est importante pour les utilisateurs de FileMaker) et comment la Recherche s\u00e9mantique peut faciliter les t\u00e2ches de d\u00e9duplication. Ici, dans la partie 2, je vais aborder en d\u00e9tail une approche de correspondance d\u2019entit\u00e9s dans FileMaker en utilisant la Recherche s\u00e9mantique pour effectuer un fuzzy matching. Je ne traiterai que bri\u00e8vement la mise en place de la Recherche s\u00e9mantique dans une solution FileMaker (de <a href=\"https:\/\/blog.beezwax.net\/filemaker-semantic-search-part-1-fundamental-power\/\" target=\"_blank\" rel=\"noreferrer noopener\">nombreux<\/a> <a href=\"https:\/\/medium.com\/transforming-digital\/a-deep-dive-into-filemaker-2024s-new-semantic-search-functionality-e24b2ed24ffd\" target=\"_blank\" rel=\"noreferrer noopener\">autres<\/a> <a href=\"https:\/\/www.teamdf.com\/blogs\/semantic-search\/\" target=\"_blank\" rel=\"noreferrer noopener\">articles<\/a> couvrent d\u00e9j\u00e0 ce sujet en profondeur), mais <em>je<\/em> pr\u00e9senterai les choix de conception sp\u00e9cifiques \u00e0 la correspondance d\u2019entit\u00e9s.<\/p><h2 class=\"wp-block-heading\">Qu\u2019est-ce que la correspondance d\u2019entit\u00e9s ?<\/h2><p>La correspondance d\u2019entit\u00e9s consiste \u00e0 d\u00e9terminer si deux enregistrements se rapportent \u00e0 la m\u00eame entit\u00e9 r\u00e9elle. C\u2019est indispensable dans de nombreux contextes et crucial pour la d\u00e9duplication des donn\u00e9es. C\u2019est aussi un probl\u00e8me r\u00e9current et difficile dans les syst\u00e8mes FileMaker que je c\u00f4toie au quotidien.  <\/p><p>Le probl\u00e8me de base consiste \u00e0 pouvoir comparer deux (ou plusieurs) enregistrements et \u00e0 d\u00e9terminer, de mani\u00e8re programmatique, s\u2019ils font r\u00e9ellement r\u00e9f\u00e9rence \u00e0 la m\u00eame chose. Est-ce que \u00ab Hanna C Beuler \u00bb est la m\u00eame personne que \u00ab Hannah Bueler \u00bb ? <\/p><p><strong>Enregistrement 1 : Hanna C Bueler, n\u00e9e le 03\/12\/1990<\/strong><\/p><p>Enregistrement 2 : <strong>Hannah Beuler, n\u00e9e le 12\/03\/1990<\/strong><\/p><p>Dans FileMaker, en utilisant la recherche classique \u00ab correspondance exacte \u00bb, il serait difficile de <em>rep\u00e9rer<\/em> ces deux enregistrements pour les comparer (leurs orthographes et dates de naissance diff\u00e8rent), sans parler de d\u00e9terminer s\u2019ils correspondent. Un utilisateur humain verrait rapidement qu\u2019il s\u2019agit probablement de la m\u00eame personne, mais une recherche FileMaker simple ne le peut pas. C\u2019est l\u00e0 que la Recherche s\u00e9mantique entre en jeu.  <\/p><h2 class=\"wp-block-heading\">Rechercher une correspondance<\/h2><p>Le processus habituel de recherche de doublons consiste \u00e0 interroger plusieurs champs (ou un champ calcul\u00e9 concat\u00e9n\u00e9) pour une correspondance exacte :<\/p><pre class=\"wp-block-code\"><code>Enter Find Mode &#91; Pause: Off ]\nSet Field &#91; Person::FirstName ; \u201cHanna\u201d ]\nSet Field &#91; Person::LastName ; \u201cBueler\u201d ]\nSet Field &#91; Person::DOB ; \u201c3\/12\/1990\u201d ]\nPerform Find &#91; ]<\/code><\/pre><p>Cela va sans dire : si vous trouvez ce que vous cherchez par ce type de recherche standard, vous n\u2019avez pas besoin de la recherche s\u00e9mantique ! Vous avez trouv\u00e9 une correspondance et pouvez passer \u00e0 la suite. Cependant, si votre recherche initiale ne donne aucun r\u00e9sultat exact, il est temps d\u2019utiliser la recherche s\u00e9mantique pour rep\u00e9rer une correspondance proche (mais non exacte). La recherche s\u00e9mantique change la donne pour retrouver des enregistrements difficiles \u00e0 apparier une fois la recherche \u00ab exacte \u00bb \u00e9puis\u00e9e.   <\/p><h2 class=\"wp-block-heading\">Configurer FileMaker pour la correspondance d\u2019entit\u00e9s<\/h2><p>Pour effectuer une correspondance d\u2019entit\u00e9s \u00e0 l\u2019aide de la Recherche s\u00e9mantique dans FileMaker, nous devons d\u2019abord cr\u00e9er des <strong>vector embeddings<\/strong> pour nos donn\u00e9es d\u2019appariement.<\/p><h2 class=\"wp-block-heading\">Embeddings<\/h2><figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"975\" height=\"487\" src=\"https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-1.png\" alt=\"\" class=\"wp-image-20648\" srcset=\"https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-1.png 975w, https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-1-300x150.png 300w, https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-1-768x384.png 768w, https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-1-600x300.png 600w\" sizes=\"auto, (max-width: 975px) 100vw, 975px\" \/><\/figure><p>Un embedding vectoriel est une repr\u00e9sentation num\u00e9rique de donn\u00e9es qui en capture le sens s\u00e9mantique. Nous stockons les embeddings de nos donn\u00e9es de recherche dans un champ conteneur. La Recherche s\u00e9mantique de FileMaker compare ensuite ces vecteurs \u00e0 votre requ\u00eate et renvoie un score de similarit\u00e9. La premi\u00e8re \u00e9tape consiste donc \u00e0 d\u00e9cider quelles donn\u00e9es vous souhaitez apparier et \u00e0 ajouter des champs conteneurs pour stocker leurs embeddings.   <\/p><p>Bien que les embeddings puissent \u00eatre stock\u00e9s dans la table de recherche elle-m\u00eame, je pr\u00e9f\u00e8re les conserver dans une table distincte en relation un-\u00e0-un avec leur table de donn\u00e9es. Avec FileMaker 22 et son support int\u00e9gr\u00e9 d\u2019OpenAI, Anthropic ou Cohere, c\u2019est aussi simple qu\u2019utiliser l\u2019\u00e9tape de script \u00ab Ins\u00e9rer un embedding dans l\u2019ensemble trouv\u00e9 \u00bb et choisir les champs \u00e0 vectoriser : <\/p><pre class=\"wp-block-code\"><code>Insert Embedding in Found Set &#91; Account Name: \u201cMy_Semantic_Find\u201d ; Embedding Model: $$loaded_model ; Source Field: Person::ConcatenatedFirstLastDOB ; Target Field: EmbeddingTable::VectorizedFirstLastDOB ; Replace target contents ]<\/code><\/pre><p>J\u2019ai choisi d\u2019utiliser le mod\u00e8le d\u2019embedding <a href=\"https:\/\/ai.google.dev\/gemini-api\/docs\/embeddings\" target=\"_blank\" rel=\"noreferrer noopener\">Gemini de Google <\/a>au lieu de l\u2019un des fournisseurs int\u00e9gr\u00e9s, car :<\/p><ol style=\"list-style-type:lower-alpha\" class=\"wp-block-list\"><li>J\u2019aime les outils Google<\/li>\n\n<li>Les performances et la pr\u00e9cision du mod\u00e8le sont excellentes<\/li>\n\n<li>Les embeddings font la moiti\u00e9 de la taille de ceux d\u2019OpenAI (6k contre 12k)<\/li>\n\n<li>Leur mod\u00e8le d\u2019embedding est <a href=\"https:\/\/ai.google.dev\/gemini-api\/docs\/pricing#gemini-embedding\" target=\"_blank\" rel=\"noreferrer noopener\">gratuit<\/a><\/li><\/ol><p>Utiliser Gemini demande un peu plus de travail, car il faut faire un appel REST avec l\u2019\u00e9tape \u00ab Ins\u00e9rer \u00e0 partir de l\u2019URL \u00bb, analyser les donn\u00e9es du vecteur obtenu et stocker l\u2019embedding dans un champ conteneur sous forme de fichier binaire (en utilisant la fonction \u00ab GetEmbeddingAsFile \u00bb), mais ce n\u2019est pas difficile si vous \u00eates familier avec les appels API dans FileMaker.<\/p><figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"481\" src=\"https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-2-1024x481.png\" alt=\"\" class=\"wp-image-20651\" srcset=\"https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-2-1024x481.png 1024w, https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-2-300x141.png 300w, https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-2-768x361.png 768w, https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-2-600x282.png 600w, https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-2.png 1054w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><p>Une fois nos embeddings ajout\u00e9s, nous pouvons commencer \u00e0 interroger notre table de donn\u00e9es avec la Recherche s\u00e9mantique.<\/p><h2 class=\"wp-block-heading\">Consid\u00e9rations pour les embeddings<\/h2><p>La correspondance d\u2019entit\u00e9s est diff\u00e9rente d\u2019une recherche s\u00e9mantique ordinaire, car nous ne cherchons pas tant la similarit\u00e9 de<em> sens <\/em>qu\u2019une simple similarit\u00e9. Nous voulons apparier \u00ab<strong> Hannah Beuler<\/strong> \u00bb avec \u00ab <strong>Hanna C Bueler<\/strong> \u00bb, pas avec [<em>plusieurs paragraphes sur la vie de Hanna C Bueler<\/em>]. Ainsi, il suffit de cr\u00e9er des embeddings d\u2019une s\u00e9lection de champs utilis\u00e9s pour l\u2019appariement. Et comme ces champs sont g\u00e9n\u00e9ralement courts, le <a href=\"https:\/\/medium.com\/@bishalmukherjee2\/llm-tokens-what-they-are-and-why-you-should-care-7d97c2130141\" target=\"_blank\" rel=\"noreferrer noopener\">nombre de tokens<\/a> reste faible.   <\/p><p>Pour choisir quoi vectoriser pour la correspondance d\u2019entit\u00e9s, la m\u00e9thode que j\u2019ai utilis\u00e9e avec succ\u00e8s consiste \u00e0 cr\u00e9er un champ calcul\u00e9 de courte phrase d\u2019appariement qui, si identique \u00e0 votre requ\u00eate, repr\u00e9senterait une correspondance parfaite. Par exemple, si vous cherchez une personne, vous pouvez cr\u00e9er un champ calcul\u00e9 compos\u00e9 du Pr\u00e9nom, Nom, Date de naissance et Num\u00e9ro de t\u00e9l\u00e9phone. Si vous cherchez une organisation, vous pouvez utiliser Nom de l\u2019organisation, Adresse et Num\u00e9ro de t\u00e9l\u00e9phone. Pour un produit de catalogue, vous pouvez utiliser Description de l\u2019article et Taille. Voici quelques directives de base :<br\/>     <\/p><ul class=\"wp-block-list\"><li>Choisir des champs discrets qui peuvent varier l\u00e9g\u00e8rement par rapport \u00e0 une correspondance exacte, mais qui identifient bien une entit\u00e9 sp\u00e9cifique.<\/li>\n\n<li>Utiliser de petits champs texte plut\u00f4t que de longues cha\u00eenes de texte pour obtenir un pourcentage de correspondance plus \u00e9lev\u00e9.  <\/li>\n\n<li>La Recherche s\u00e9mantique est sensible \u00e0 la casse ; pour plus de pr\u00e9cision, \u00e9liminez les diff\u00e9rences de casse lorsque cela n\u2019a pas d\u2019importance.<\/li><\/ul><h2 class=\"wp-block-heading\">Fuzzy Matching : \u00e9tape par \u00e9tape<\/h2><p>Une fois vos champs d\u2019appariement choisis et leurs embeddings cr\u00e9\u00e9s, le processus de correspondance d\u2019entit\u00e9s avec la Recherche s\u00e9mantique se d\u00e9roule ainsi :<br\/><\/p><ol class=\"wp-block-list\"><li><strong>Blocking<\/strong> \u2013 Effectuer une recherche FileMaker standard sur un seul champ pour cr\u00e9er un sous-ensemble d\u2019enregistrements plus susceptibles de contenir la correspondance recherch\u00e9e.<\/li>\n\n<li><strong>Recherche s\u00e9mantique<\/strong> \u2013 Effectuer la Recherche s\u00e9mantique sur ce sous-ensemble d\u2019enregistrements, en collectant les correspondances dans une variable.<\/li>\n\n<li><strong>R\u00e9p\u00e9tition<\/strong> \u2013 Boucler sur les \u00e9tapes 1 et 2 plusieurs fois, en <em>changeant de champ<\/em> de blocage \u00e0 chaque fois, et ajouter les nouveaux r\u00e9sultats (en \u00e9vitant les doublons).<\/li>\n\n<li><strong>Traitement<\/strong> \u2013 Exploiter les r\u00e9sultats comme vous le souhaitez.<\/li><\/ol><p>Ce processus doit produire un ou plusieurs enregistrements correspondant exactement \u00e0 <em>une partie de la requ\u00eate<\/em>, mais de fa\u00e7on floue au reste. Id\u00e9alement, l\u2019un d\u2019eux aura un score suffisamment \u00e9lev\u00e9 pour que vous puissiez le consid\u00e9rer comme une correspondance.<\/p><figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"974\" height=\"712\" src=\"https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-3.png\" alt=\"\" class=\"wp-image-20654\" srcset=\"https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-3.png 974w, https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-3-300x219.png 300w, https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-3-768x561.png 768w, https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-3-600x439.png 600w\" sizes=\"auto, (max-width: 974px) 100vw, 974px\" \/><\/figure><h2 class=\"wp-block-heading\">\u00c9tape 1 \u2013 Blocage<\/h2><p>Comme la performance de la Recherche s\u00e9mantique peut \u00eatre lente sur de grands ensembles de donn\u00e9es, il est g\u00e9n\u00e9ralement n\u00e9cessaire de r\u00e9duire la taille de l\u2019ensemble trouv\u00e9 initial. C\u2019est ce qu\u2019on appelle le <a href=\"https:\/\/towardsdatascience.com\/entity-resolution-identifying-real-world-entities-in-noisy-data-3e8c59f4f41c\/#:~:text=Cluster%20Evaluation-,Overview%20of%20Entity%20Resolution,records%20that%20share%20similar%20attributes%2C%20making%20the%20subsequent%20comparison%20more%20efficient.,-2.%20Block%20Processing\" target=\"_blank\" rel=\"noreferrer noopener\">blocking <\/a>et cela vise \u00e0 r\u00e9duire le nombre d\u2019enregistrements \u00e0 rechercher pour trouver ce que nous cherchons. <\/p><blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Le blocage est la premi\u00e8re \u00e9tape de la r\u00e9solution d\u2019entit\u00e9s. Il consiste \u00e0 regrouper les enregistrements similaires en fonction de certains attributs. Ce faisant, le processus limite sa recherche aux comparaisons \u00e0 l\u2019int\u00e9rieur de chaque bloc, plut\u00f4t que d\u2019examiner toutes les paires possibles dans l\u2019ensemble de donn\u00e9es.<br\/>Cela r\u00e9duit consid\u00e9rablement le nombre de comparaisons et acc\u00e9l\u00e8re le processus de r\u00e9solution d\u2019entit\u00e9s. Comme de nombreuses comparaisons sont ainsi \u00e9cart\u00e9es, il est toutefois possible que certains vrais doublons soient manqu\u00e9s. C\u2019est pourquoi le blocage doit trouver un bon \u00e9quilibre entre efficacit\u00e9 et pr\u00e9cision. (<a href=\"https:\/\/towardsdatascience.com\/entity-resolution-identifying-real-world-entities-in-noisy-data-3e8c59f4f41c\/#:~:text=the%20subsequent%20steps.-,Blocking,Therefore%2C%20Blocking%20should%20achieve%20a%20good%20balance%20between%20efficiency%20and%20accuracy.,-In%20this%20section\" target=\"_blank\" rel=\"noreferrer noopener\"> <em>Tomonori Masui, Sept 21, 2023 \u2013 Towards Data Science<\/em> <\/a>) Il faut en effet beaucoup moins de temps pour effectuer une recherche s\u00e9mantique sur 1 000 enregistrements que sur 100 000 enregistrements, ce qui rend ce processus essentiel.<\/p><\/blockquote><p>Il faut <em>beaucoup moins <\/em>de temps pour effectuer une Recherche s\u00e9mantique sur 1 000 enregistrements que sur 100 000, donc ce processus est essentiel.<\/p><figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"975\" height=\"491\" src=\"https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-4.png\" alt=\"\" class=\"wp-image-20657\" srcset=\"https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-4.png 975w, https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-4-300x151.png 300w, https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-4-768x387.png 768w, https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-4-600x302.png 600w\" sizes=\"auto, (max-width: 975px) 100vw, 975px\" \/><\/figure><p>Commencez par identifier une m\u00e9thode pour \u00e9liminer le plus grand nombre d\u2019enregistrements de votre ensemble trouv\u00e9 initial. Le plus grand compromis entre efficacit\u00e9 et pr\u00e9cision peut se situer dans la fa\u00e7on dont vous d\u00e9cidez de le faire. L\u2019id\u00e9e est d\u2019obtenir un ensemble plus petit d\u2019enregistrements ayant une plus grande probabilit\u00e9 de contenir la correspondance recherch\u00e9e, dans lequel nous pourrons rechercher plus loin avec la Recherche s\u00e9mantique. Exemples :   <\/p><ul class=\"wp-block-list\"><li>Si vous recherchez dans une table Contacts et que vous savez que le contact recherch\u00e9 est dans la cat\u00e9gorie \u00ab Facturation \u00bb, commencez par r\u00e9duire votre ensemble trouv\u00e9 \u00e0 ces enregistrements.<\/li>\n\n<li>Si vous essayez de trouver un doublon pour \u00ab Hanna Beuler \u00bb, commencez par r\u00e9duire votre ensemble trouv\u00e9 \u00e0 tous les enregistrements dont le Pr\u00e9nom est \u00ab Hanna \u00bb ; la deuxi\u00e8me fois, recherchez tous les enregistrements dont le Nom est \u00ab Bueler \u00bb ; une troisi\u00e8me passe pourrait limiter aux personnes n\u00e9es en 1990.<\/li>\n\n<li>Dans une table Organisations, vous pourriez limiter votre premier blocage par Ville, le deuxi\u00e8me par Code postal et le troisi\u00e8me par Type d\u2019organisation.<\/li><\/ul><h2 class=\"wp-block-heading\">\u00c9tape 2 \u2013 Effectuer la Recherche s\u00e9mantique sur chaque bloc<\/h2><p>Dans chaque ensemble trouv\u00e9 issu d\u2019un blocage, effectuez la Recherche s\u00e9mantique sur votre champ d\u2019embedding. Comme vous voulez comparer votre texte de d\u00e9part avec le champ d\u2019embedding, vous devez cr\u00e9er un embedding \u00e0 la vol\u00e9e de votre texte de d\u00e9part. Dans notre exemple \u00ab Hanna Beuler \u00bb, les embeddings dans notre grande table de 100k Personnes sont cr\u00e9\u00e9s \u00e0 partir d\u2019un champ concat\u00e9n\u00e9 compos\u00e9 du Pr\u00e9nom, Initiale du milieu, Nom et Date de naissance (au format ISO) comme ceci :  <\/p><p><strong>Hannah C Bueler 1990-12-03<\/strong><\/p><p>Quand nous lan\u00e7ons notre recherche s\u00e9mantique, nous devons prendre notre cha\u00eene de recherche \u00ab Hanna Beuler, 3\/12\/1990 \u00bb et cr\u00e9er un embedding \u00e0 partir de celle-ci en utilisant exactement le m\u00eame format que celui de nos champs d\u2019embedding, pour que cela donne :<br\/><\/p><p><strong>Hanna Beuler 1990-03-12<\/strong><\/p><p>L\u2019embedding doit aussi \u00eatre cr\u00e9\u00e9 avec le m\u00eame mod\u00e8le que celui utilis\u00e9 pour cr\u00e9er tous les embeddings dans votre table de recherche. Utilisez l\u2019\u00e9tape de script \u00ab Ins\u00e9rer embedding \u00bb sur cette seule cha\u00eene de recherche et, au lieu de la stocker dans un champ conteneur d\u2019une table, stockez cet embedding dans un champ conteneur global :<br\/> <\/p><figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1017\" height=\"234\" src=\"https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-5.png\" alt=\"\" class=\"wp-image-20660\" srcset=\"https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-5.png 1017w, https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-5-300x69.png 300w, https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-5-768x177.png 768w, https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-5-600x138.png 600w\" sizes=\"auto, (max-width: 1017px) 100vw, 1017px\" \/><\/figure><p>\u2026et utilisez ensuite ce champ global dans la Recherche s\u00e9mantique comme param\u00e8tre \u00ab Vecteur \u00bb dans l\u2019\u00e9tape de script \u00ab Ex\u00e9cuter la recherche s\u00e9mantique \u00bb :<\/p><figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1017\" height=\"190\" src=\"https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-6.png\" alt=\"\" class=\"wp-image-20663\" srcset=\"https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-6.png 1017w, https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-6-300x56.png 300w, https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-6-768x143.png 768w, https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-6-600x112.png 600w\" sizes=\"auto, (max-width: 1017px) 100vw, 1017px\" \/><\/figure><p>Param\u00e8tres recommand\u00e9s pour l\u2019\u00e9tape \u00ab Ex\u00e9cuter la recherche s\u00e9mantique \u00bb :<\/p><pre class=\"wp-block-code\"><code>Query by: Vector Data\t\nVector: &#91;your global embedding field]  \/\/this is the search query\nRecord Set: Current Found Set  \/\/this is the set of records reduced by blocking\nTarget field: &#91;your embedding field]  \/\/this is where your embeddings are stored\nReturn count: 10 \/\/this may vary, but keep it relatively small\nCosine similarity condition: greater than\nCosine similarity value: .85 \/\/my tests indicate that &lt; 85% match is not very good\nSave result: $result_variable  \/\/store results in a variable<\/code><\/pre><h2 class=\"wp-block-heading\">\u00c9tape 3 \u2013 R\u00e9p\u00e9ter le processus de blocage<\/h2><p>Maintenant que vous avez recherch\u00e9 sur un champ et effectu\u00e9 une Recherche s\u00e9mantique dans cet ensemble trouv\u00e9 sur le champ vectoris\u00e9 et stock\u00e9 les r\u00e9sultats dans une variable, r\u00e9p\u00e9tez ce processus avec un nouveau champ d\u2019appariement. Chaque fois que nous obtenons un ensemble trouv\u00e9 r\u00e9duit, nous effectuons une Recherche s\u00e9mantique sur cet ensemble trouv\u00e9, en utilisant le m\u00eame champ global d\u2019embedding, et nous ajoutons les nouveaux r\u00e9sultats \u00e0 notre variable <strong>$Results<\/strong> (en sautant les doublons). <\/p><p>Nous esp\u00e9rons qu\u2019au cours de ces multiples recherches (aucune ne donnant \u00e0 elle seule une correspondance forte), au moins l\u2019un des ensembles trouv\u00e9s contiendra une correspondance partielle avec l\u2019enregistrement r\u00e9el \u00ab <strong>Hannah C Bueler<\/strong> \u00bb que nous pourrons alors apparier \u00e0 l\u2019aide de la Recherche s\u00e9mantique.<\/p><p>Si, apr\u00e8s ce processus, nous n\u2019avons toujours trouv\u00e9 aucune correspondance proche, nous pouvons supposer soit a) que les doublons \u00e9ventuels sont peut-\u00eatre trop diff\u00e9rents pour \u00eatre facilement localis\u00e9s, soit b) qu\u2019il n\u2019y a pas de doublons \u00e0 trouver.  <\/p><h2 class=\"wp-block-heading\">\u00c9tape 4 \u2013 Traiter les r\u00e9sultats de la Recherche s\u00e9mantique<\/h2><p>\u00c0 ce stade, le processus doit nous laisser avec une variable JSON contenant un tableau de correspondances qui ressemble \u00e0 ceci :<\/p><pre class=\"wp-block-code\"><code>&#91;\n  {\"recordId\":\"99920\",\"similarity\":0.988967784539129},\n  {\"recordId\":\"87405\",\"similarity\":0.829515648500795},\n  {\"recordId\":\"49850\",\"similarity\":0.802658597565103},\n  {\"recordId\":\"45721\",\"similarity\":0.817432345089549}\n]<\/code><\/pre><p>Ce que vous choisissez de faire de ces r\u00e9sultats d\u00e9pendra de votre cas d\u2019utilisation sp\u00e9cifique. Puisque le but de la correspondance d\u2019entit\u00e9s est de rechercher des doublons, leur traitement d\u00e9pendra de votre logique m\u00e9tier. Le score de similarit\u00e9 cosinus vous indique \u00e0 quel point les embeddings vectoriels \u00e9taient proches et donne une bonne indication d\u2019une correspondance probable. Alors que tous les grands mod\u00e8les de langage ont des variations, parmi ceux que j\u2019ai test\u00e9s (<g id=\"gid_0\">Gemini \u00ab text-embedding-004 \u00bb,<\/g> <g id=\"gid_1\">OpenAI \u00ab text-embedding-3-small \u00bb<\/g> et <g id=\"gid_2\">JinaAI \u00ab jina-embeddings-v4-vllm-text-matching<\/g> \u00bb), un score de similarit\u00e9 inf\u00e9rieur \u00e0 ~85 ne semble pas du tout utile pour la correspondance d\u2019entit\u00e9s. Compte tenu de cela, vous pourriez envisager l\u2019une des actions suivantes pour les correspondances sup\u00e9rieures \u00e0 0,85 :    <\/p><ul class=\"wp-block-list\"><li>Afficher les correspondances \u00e0 l\u2019utilisateur dans une liste virtuelle.<\/li>\n\n<li>Cr\u00e9er une table de jointure reliant l\u2019enregistrement de recherche initial \u00e0 ses enregistrements correspondants dans une table s\u00e9par\u00e9e.<\/li>\n\n<li>Fusionner imm\u00e9diatement les doublons ayant un score de similarit\u00e9 suffisant.<\/li>\n\n<li>Cr\u00e9er automatiquement un nouvel enregistrement si aucun score \u00e9lev\u00e9 n\u2019est renvoy\u00e9.<\/li>\n\n<li>Marquer les enregistrements pour un examen manuel ult\u00e9rieur.<\/li><\/ul><h2 class=\"wp-block-heading\">Ce que j\u2019ai fait (preuve de concept)<\/h2><p>J\u2019ai construit et test\u00e9 un proof-of-concept de correspondance d\u2019entit\u00e9s dans Claris FileMaker 22 pour trouver des Personnes dans une base de ~102 000 enregistrements. L\u2019id\u00e9e est bas\u00e9e sur un cas d\u2019utilisation dans lequel des r\u00e9sultats de laboratoire entrants, contenant des informations sur des patients, doivent \u00eatre appari\u00e9s \u00e0 une grande table d\u2019enregistrements Personne pour une enqu\u00eate de sant\u00e9 publique.<br\/> <\/p><figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"843\" height=\"560\" src=\"https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-8.png\" alt=\"\" class=\"wp-image-20669\" srcset=\"https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-8.png 843w, https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-8-300x199.png 300w, https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-8-768x510.png 768w, https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/image-8-600x399.png 600w\" sizes=\"auto, (max-width: 843px) 100vw, 843px\" \/><\/figure><h2 class=\"wp-block-heading\">Environnement<\/h2><p>Le fichier de test contient quatre tables :<\/p><ul class=\"wp-block-list\"><li><strong>Patient <\/strong>\u2013 contient nos donn\u00e9es d\u2019entr\u00e9e<\/li>\n\n<li><strong>Personne<\/strong> \u2013 l\u2019ensemble complet des enregistrements Personne \u00e0 interroger<\/li>\n\n<li><strong>Embeddings<\/strong> \u2013 contient les embeddings vectoriels des enregistrements Personne<\/li>\n\n<li><strong>SearchJoin<\/strong> \u2013 une table de jointure pour relier les r\u00e9sultats de notre recherche \u00e0 l\u2019enregistrement d\u2019entr\u00e9e<\/li><\/ul><p>Il y a aussi quelques champs globaux dans leur propre table, mais ils pourraient se trouver n\u2019importe o\u00f9.<br\/><\/p><p>Le fichier est h\u00e9berg\u00e9 sur un serveur FM version 22.0.1, r\u00e9cemment optimis\u00e9 sp\u00e9cifiquement pour la Recherche s\u00e9mantique sur le serveur. J\u2019ai essay\u00e9 cela sur des versions de serveur ant\u00e9rieures et les performances n\u2019\u00e9taient pas bonnes, il est donc recommand\u00e9 d\u2019utiliser la derni\u00e8re version de FileMaker Server pour profiter des am\u00e9liorations r\u00e9centes de la Recherche s\u00e9mantique. D\u00e9porter vos recherches sur le serveur \u00e0 l\u2019aide de PSoS est fortement recommand\u00e9. Une recherche typique utilisant les techniques d\u00e9crites ici prend g\u00e9n\u00e9ralement quelques secondes, mais avec divers ajustements du blocage et des conditions du serveur, cela peut varier.<br\/>   <\/p><p>En partant d\u2019un seul enregistrement Personne comme \u00ab entr\u00e9e \u00bb (l\u2019enregistrement Patient), je recherche dans la table Personne une correspondance probable. Je commence par bloquer sur quatre champs diff\u00e9rents (Pr\u00e9nom, Nom, Date de naissance et Num\u00e9ro de t\u00e9l\u00e9phone), et j\u2019ex\u00e9cute la Recherche s\u00e9mantique sur chaque sous-ensemble r\u00e9duit en utilisant un embedding du Nom complet et de la Date de naissance. Les r\u00e9sultats sont tr\u00e8s bons et peuvent m\u00eame identifier des correspondances probables lorsque les trois points de donn\u00e9es (Pr\u00e9nom, Nom, Date de naissance) diff\u00e8rent l\u00e9g\u00e8rement ! Avec de l\u00e9g\u00e8res variations sur un ou deux de ces points, les performances sont remarquables.<br\/>   <\/p><p>Quand une liste de correspondances est renvoy\u00e9e avec une similarit\u00e9 sup\u00e9rieure \u00e0 85 %, je cr\u00e9e des enregistrements dans une table de jointure qui affiche les enregistrements correspondants et leurs scores pour l\u2019utilisateur. \u00c0 ce stade, ils peuvent choisir de fusionner les deux enregistrements ou d\u2019en supprimer un et de conserver l\u2019autre.<br\/><br\/> <\/p><h2 class=\"wp-block-heading\">Conclusion<\/h2><p>Les fonctionnalit\u00e9s Recherche s\u00e9mantique de FileMaker 22, utilis\u00e9es comme d\u00e9crit ici, peuvent donner d\u2019excellents r\u00e9sultats lorsqu\u2019elles sont utilis\u00e9es pour la correspondance d\u2019entit\u00e9s comme premi\u00e8re \u00e9tape d\u2019un processus de d\u00e9duplication des donn\u00e9es. Cela vous donne, je l\u2019esp\u00e8re, un point de d\u00e9part pour d\u00e9ployer votre propre module de \u00ab Fuzzy Matching \u00bb dans vos syst\u00e8mes FileMaker pour r\u00e9soudre des probl\u00e8mes de correspondance d\u2019entit\u00e9s complexes. Cela peut vraiment changer la donne.  <\/p><p><\/p>","protected":false},"excerpt":{"rendered":"<p>Une approche technique pour exploiter Semantic Find afin de r\u00e9soudre le probl\u00e8me complexe du \u201cfuzzy matching\u201d Dans la partie 1 de cet article, j\u2019ai d\u00e9crit en quoi la fonction Recherche s\u00e9mantique (Semantic Find) de FileMaker diff\u00e8re de la recherche classique, ce qu\u2019est la correspondance d\u2019entit\u00e9s (Entity Matching) (et pourquoi elle est importante pour les utilisateurs &hellip;<\/p>\n<p class=\"read-more\"> <a class=\"\" href=\"https:\/\/www.directimpactsolutions.com\/fr\/ia-et-filemaker-la-correspondance-dentites-partie-1-2\/\"> <span class=\"screen-reader-text\">IA et FileMaker : la correspondance d\u2019entit\u00e9s \u2013 Partie 1<\/span> Lire la suite >><\/a><\/p>\n","protected":false},"author":27,"featured_media":20561,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","footnotes":""},"categories":[333,34],"tags":[],"class_list":["post-20673","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-lia","category-low-code"],"uagb_featured_image_src":{"full":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/ai-search.png",800,350,false],"thumbnail":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/ai-search-150x150.png",150,150,true],"medium":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/ai-search-300x131.png",300,131,true],"medium_large":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/ai-search-768x336.png",768,336,true],"large":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/ai-search.png",800,350,false],"1536x1536":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/ai-search.png",800,350,false],"2048x2048":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/ai-search.png",800,350,false],"woocommerce_thumbnail":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/ai-search-300x300.png",300,300,true],"woocommerce_single":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/ai-search-600x263.png",600,263,true],"woocommerce_gallery_thumbnail":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2025\/09\/ai-search-100x100.png",100,100,true]},"uagb_author_info":{"display_name":"Yacine Aklil","author_link":"https:\/\/www.directimpactsolutions.com\/fr\/author\/yacine-aklildirectimpactsolutions-com\/"},"uagb_comment_info":0,"uagb_excerpt":"Une approche technique pour exploiter Semantic Find afin de r\u00e9soudre le probl\u00e8me complexe du \u201cfuzzy matching\u201d Dans la partie 1 de cet article, j\u2019ai d\u00e9crit en quoi la fonction Recherche s\u00e9mantique (Semantic Find) de FileMaker diff\u00e8re de la recherche classique, ce qu\u2019est la correspondance d\u2019entit\u00e9s (Entity Matching) (et pourquoi elle est importante pour les utilisateurs\u2026","_links":{"self":[{"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/posts\/20673","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/users\/27"}],"replies":[{"embeddable":true,"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/comments?post=20673"}],"version-history":[{"count":6,"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/posts\/20673\/revisions"}],"predecessor-version":[{"id":20788,"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/posts\/20673\/revisions\/20788"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/media\/20561"}],"wp:attachment":[{"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/media?parent=20673"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/categories?post=20673"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/tags?post=20673"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}