# Enrichissement des fiches Le but est d'enrichir les fiches entreprises en y associant leur site officiel **On veut pouvoir dire avec certitude: "airfrance.com est un site officiel de la société [AirFrance](https://www.societe.com/societe/societe-air-france-420495178.html) "** A partir d'une requête lancé sur google, il faut pouvoir trouver et piocher parmi les sites proposés, le site officiel de l'entreprise ciblé. Et à partir de leur code source, il faut identifier "ce qui pourrait matcher avec la fiche officielle". On compare ces données avec la fiche entreprise. En fonction de "ce qui matche" on calcule un niveau de certitude. ### Exemple: https://recrutement.airfrance.com/mention-legale.aspx - 420 495 178 est un bon résultat car il correspond à la société "Société air france" - 438 967 507 est un mauvais résultat car il correspond à l'hébergeur talentsoft : On ne peut pas dire "airfrance.com représente la société talentsoft" --- ## Pistes pour accorder des poids sur les éléments des fiches - listés par ordre chronologique - 12/07 utilisation d'un YAML servant de dictionnaire des synonymes. Cette approche permettra de mieux localiser les éléments important à lire pour le crawleur comme l'Editeur, l'Hébergeur, les mentions legales, le logo etc.. - 30/06 coupler nos informations avec l'API de GooglePlaces. Google places donne beaucoup d'informations sur les commerces, notamment les sites officiels de ceux-ci dans la plupart des cas. Pouvoir extraire ces données pourrait fortement aider à valider la certification d'un site. - l'API de googlePlaces existe, mais elle est payante (17$/1000requests). - Solutions alternative Github: + de 3000 repositories pour un [API GooglePlaces sur GitHub](https://github.com/search?o=desc&q=google+places+api&s=stars&type=Repositories) proposé par des utilisateurs indépendants. même si parmis tous ces choix certains sont hors sujets, il y a quand même un très grand nombre de projets avec beaucoup de language différents. - 28/06 Indice très puissant si présent : Logo de l'entreprise dans le header. Sur le dataset de vérité, la quasi-totalité des sites ont le logo de leur entreprise dans le header. Facilement verifiable grace à la structure du site : `<img alt = "nom de Domaine">`. le logo est majoritairement détecter par le `alt=""`, mais peu aussi être detecté par le `href-title =""`, ou même par la présence du nom de domaine dans le `src=""` menant à l'image.jpg/png. Dans le cas où on retrouve le nom de domaine dans l'URL ou l'icone du Header, combiné avec la présence du bon n° de SIREN, on pourra assumer que ce site est officiel. - 27/06 Il serait possible d'utiliser un graphe orienté (DAG) pour pouvoir représenter les indices listés ci-dessous par ordres d'importance et y affecter des coefficients en fonction des chemins empruntés. Les noeuds representeraient les différents indices, et les arêtes valuées representeraient les coefficients accordés en fonction des noeuds traversés. Cette méthode permettrait de pouvoir changer les paramètres du crawleur efficacement, mais semble encore trop précoce pour une implémentation pratique et à court terme. - 23/06 La page sur laquelle on peut trouver les informations de l'entreprise (numero de Siren entre autre) s'articule en grande majorité de cette manière là : ***https://[NOM DE DOMAINE]/ ... /legals*** il peut y avoir des synonyme de legals, tel que {"*cgu*";"*mentions-legales*","*informations légales*","*legal-notice*"}. - 23/06 Les liens positifs se trouvent majoritairement dans les 3 premiers liens proposés par google. Il serait donc intéressant de pouvoir stocker cette information pour pouvoir accorder un score en fonction de la position des liens sur la page. Ce score pourrait suivre l'allure d'une courbe 1/(x+1). Avec x le x-ième lien Le premier lien aurait donc 0.5 , le second 0.33 , puis 0.25 etc (apparemment impossible après reflexion). - 20/06 Une première approche serait l'utilisation d'une table de verité avec des indices à déterminer, donnant des poids plus ou moins élevés en fonction de leur présence ou non. (nouvelle version en bas de page). Grace a cette table, nous serions capable d'attribuer un score à chaque URL proposé par le crawleur et d'en assurer, ou non, la certifiabilité. ## Observations liées au 400premiers test réels du Crawler : ### [Dataset de vérité](https://docs.google.com/spreadsheets/d/1V2c6Jh4VRH5Lbl5c1JCvmVHRxHVD2ELqE8CrU0C6cHY/edit#gid=1420750342) #### Méthode de coloriage : J'ai utilisé 5couleurs différentes, chacunes ayant un role précis. Ces 5 couleurs n'ont pas forcement la même signification pour tous les indices : - vert fluo : - pour la colonne SIREN et URL : signifie que le site selectionné est bon, et que le Siren rattaché a celui-ci est bon. - pour la colonne Score : signifie que le score attribué par le crawler est **cohérent** avec le Siren selectionné => Si le Siren est bon et que le score est > 0.2 ou alors Si le Siren est mauvais et que le score est <0 - Pour tous les autres indices : signifie que les indices crawlé ont bien contribué au score final => si le Siren n'est pas bon, les cases n'ayant pas d'erreurs de crawling et retirant des points sont coloriées en vert. - vert foncé : - principalement utilisé dans le score final lorsque le score calculé par le crawler est bon mais qu'il aurait dû être plus proche de 1 ou -1 (donc que les coefficients liés a certains indices ont été trop/pas assez rude) - Jaune : - Lorsque le Crawleur a presque trouvé ou a trouvé partiellement, mais qu'avec quelques légère modifications, les points auraient été accordés. - Principalement utilisé avec les adresses ou le nom de domaine puisque la distance de Leveshtein pouvait être imprecise dans certains cas. - Rouge : - Le crawleur a fait une erreur. Que ce soit un élément qu'il n'aurait pas du prendre ou un elements pris qui ne contribue pas au score final et qui aurait dû être evité - Bleu : - Pour les cas Spéciaux/ unique. une explication courte est souvent mentionné dans la nouvelle colonne 'Problème'. - Rose : - Contradiction entre les éléments tiré du site et celle de l'API societe.com. Les deux 'camps' ont bien effectué leur travail, mais la contradiction fait que des points sont retirés. (souvent dû a une 2eme adresse d'une entreprise, et l'API ne prend que la 1ère) - case vide : - n'est pas sûr de pouvoir certifier ce site donc incapable d'evaluer les performances du crawleur. #### Obervation brève du coloriage : - Comme on peut le voir par ces grands encadrés rouges, certains URL provoque un nombre disproportionné de selection de numero de Siren. Que ce soit une erreur d'interpretation du code source ou une liste d'entreprise tiré d'un annuaire ou d'un concurrent. - la 'bonne nouvelle' est qu'il n'y a presque aucun cas ou le score est >0.2 pour ces cas là. - la 'mauvaise nouvelle' qui découle de la recupération de certain annuaires est qu'on a beau créer une blacklist d'annuaires d'entreprise. Il y aura toujours des centaines de plus petits sites specialisés qui repertorient les siren d'entreprises d'un domaine en particulier. Par exemple, un site repertoriant des pharmacies et leur Siren associés. ou des menuisiers et leur Siren associés etc etc.. - ce genre de cas engendre des effet 'boule de neige' sur le nombre de Siren recupérés mais en réalité ça ne concerne pas tant d'URL que ça. Pour contrer ce problème on pourrait estimer qu'au dela de 4/5 Siren slectionné par URL, le site en question est un annuaire / concurrent / mauvaise interraction avec le code source. - Il semblerait que la distance de Levenshtein pour les adresses cause plus de problèmes qu'elle en évite. beaucoup d'imprecisions sont créées. - la fonction contains() dans la colonne "Denomination" peut parfois se montrer trop 'gentille' et accepter des cas absurdes comme le match entre un nom de domaine et un UNIQUE caractère : **UNITEDPARCELSERVICEFRANCESAS~L** - La colonne Siren_is_above peut montrer "None" ou "siren_is_above". Mais dans ce cas avec quel fiche entreprise les éléments du site ont été comparés ? - Il y a beaucoup d'éléments avec des abréviations. et lorsqu'ils sont comparés ils sont evidemment déclarés comme "pas matché" et au vu du nombre d'elements avec abreviations je doute qu'on puisse l'ignorer. Effectivement on peut retrouver des abreviations : - dans les adresses - dans les noms de domaine - dans les types d'entreprises - dans les noms d'entreprises Mais c'est un cas difficile à gerer car il y a beaucoup d'abreviations spécifiques à chaque entreprises. #### Obsevration globale sur le score finale : - un score > 0.8 s'est toujours averé bon - un score au alentours de 0.2 peut parfois prendre quelques erreurs (environ 80% de reussite, si ce n'est plus) - un score de 0 est totalement neutre (50/50), et ça tombe bien du coup. - les scores négatifs sont pour la plupart tous bien calculé avec quelques exceptions à hauteur de 5/10% qui auraient dû avoir un meilleur score, donc très négligeable. - Aucun cas réellement hors du commun a été trouvé. ## Liste de ce qui peut être amélioré dans la requête google ou dans le crawleur. - 19/07 Indexa.fr propose la mise a disposition des sites internet officiels des entreprises. Son activité se base presque exclusivement sur ça. leur fonctionnement se fait à l'aide de 2acteurs : - une ligne editorial répondant aux demandes de mise en avant sur leur site. - un programme informatique detectant parfois automatiquement les sites officiels des entreprises. (le crawler pour nous) - il y aurait un peu plus de 60 000 sites web recensés - existe depuis 1997. - 06/07 l'introduction des indices du dataset pourrait augmenter ce score de 57% de réussite. Même si l'implémentation de la colonne "Editeur" prendra surement plus de temps, les indices 'Logo' et 'Nom de domaine' vont certainement améliorer ce score. Pour tous les indices (sauf SIREN) il faudra ajouter une couche de filtre pour accepter les mots très proches des indices (distance de Levenshtein). Exemple Air-France == Air_France == Air France == AiR FrANCe La gestion des indices de la colonne "Editeur" sera sans doute plus complexe car il faut aussi prendre en compte les synonyme de l'expression Editeur (proprietaire, CGU, CGV...). la présence du nom de domaine est utilisable seulement dans l'URL et non dans le corps du site car il est possible de tomber sur un 'mauvais' site qui mentionne un autre 'bon' site. - 05/07 une grande partie des erreurs de selections de SIREN se font à partir d'une suite de 9 chiffres pris dans le code source `<path = ...>` mais également certains numéro de téléphone. - 04/07 Après avoir collecté les premiers résultats du Crawler, on peut s'apercevoir que celui-ci à une mauvaise intéraction du crawleur avec le code source. les codes à 9 chiffres sont pris au hasard. il faudra ne pas prendre en compte le contenu des balises - 04/07 pour identifier si une suite de 9 chiffres est un n° de SIREN : utiliser l'algorithme de Luhn + regarder la présence de la mention "numero" ou "SIREN" devant. - 04/07 Expansion du dataset de vérité : nouvelle colonne expliquant ce que ne doit pas prendre le crawleur. Dans la majorité des cas il s'agit du n° de SIREN de l'hébergeur/opérateur mais il existe beaucoup de cas particuliers. - 04/07 Grand nombre des entreprises ont un chiffre d'affaires à 9 chiffres, pouvant donc se faire passer pour un SIREN. Bien que le n° de SIREN est identifiable grâce à un algoithme, il n'est pas impossible que le CA d'une entreprise passe à travers les mailles du filet. - 01/07 Pour ce qui est de la différence d'utilisation entre différents navigateurs après avoir utilisé Firefox, Edge, DuckduckGO et Google (tous en navigation privée pour rafraichir historique et cookies), je n'ai noté aucune différence significative dans les resultats. Les liens les plus pertinents restent toujours les 3premiers liens, très souvent tous les mêmes pour les 4 navigateurs. ## Indice du crawleur par ordre d'importance : - Suppression de l'analyse des balises du code sources des URL pour éviter que le crawler prennent des nombres à 9 chiffres au hasard. - Récupération du Siren - Extraction d'un nombre de 9 chiffres respectant l'algorithme de Luhn. - utilisation des éléments autour du nombre pour le confirmer : présence de "SIREN" ; "Editeur" ; not "Hebergeur" ; "propriétaire " .. et éviter N° de telephone et Chiffre d'affaires. - Récupération du nom de domaine - Seulement dans l'URL - supprimer les mentions "SARL" "SAS".. du nom de domaine. - à coupler avec la distance de Levenshtein - Récupération du Logo - Retrouver le nom de domaine dans le alt="" ou href-title ="" ou src ="". - Récupération du nom de la landing page du crawleur. - ce nom comporte de nombreuses déclinaison mais tourne autour des mêmes 4 ~ 5 mots : {"*cgu*";"*mentions-legales*","*informations légales*","*legal-notice*"} - à coupler encore une fois avec la distance de levenshtein. ## Comment trouver les pages mentions légales. - en tappant "[Nom de domaine] mentions legales" et en supprimant toutes les entreprises d'annuaires concurrentes a societe.com. - En faisant abstractions des sites concurrents, le site recherché tombe majoritairement dans les 3premiers liens. - Il est donc préférable de ne prendre que 3 sites (au lieu de 10 précédemment) et parmi ces sites de faire passer la partie du crawler qui compare les données dessus. - Si le crawler ne parvient pas a recuperer d'indices sur un des 3 url, c'est que la recherche n'aboutie à rien - Utiliser la Blacklist des annuaires d'entreprise. ## Historiser/comparer les résultats des tests unitaires. connaitre les limites de google data studio - Google Sheets - gratuit completement - moins esthétique - facile d'utilisation - limite -> 5millions de cellules, donc on peut créer autant de sheet qu'on veut tant que ces 5millions de cellues ne sont pas chargées - Google data studio - gratuit - limite de 150 000 lignes par dataset. - service construit autour du cloud - importer ses propres données peut être compliqué voir payant. - pas de mise à jour en temps réel - manque de fonctions pour manipuler les données - pour ce qui est du Token applicatif, il faudra appremment suivre ces étapes là : https://developers.google.com/datastudio/connector/auth site tiré d'un forum [StackOverflow](https://stackoverflow.com/questions/61543401/data-studio-community-connector-how-to-add-user-token) - ELK (Elasticsearch, Logstash, and Kibana) - gratuit au début - plusieurs option de Host (ex : local) - visualisation en temps réel - accessible avec 12 languages de programmation - ça peut couter extremement cher (100Gb/jour -> 180 000€) - peut devenir instable si la DB est vraiment grande - Grafana - gratuit et open-source - pas limité quant aux nombres de requests et dashboards - peut visualiser des données stockées dans plusieurs types de bases de données (Graphite, Prometheus, Influx DB, ElasticSearch, MySQL, PostgreSQL etc.) - Firebase - gratuit pour les petits trafic, mais payant au bout d'un moment - relational database (plus rapide) - supporté par google - Supabase - self hosting - gratuit puisque open source (va surement devenir payant) - NoSQL database ## Observations liées aux resultats sur le [gsheet](https://docs.google.com/spreadsheets/d/1TivNRiTzX6IcZGnkSX2ORH3oubDbNUdq4Ox2p55uFmw/edit#gid=0) - La distance de levenshtein prend mal en compte le fait qu'un mot recherché se trouve à l'identique au milieu d'un groupe de mot. exemple : 19RUEDEVIENNE --> 19RUEDEVIENNETSA10034 apparait comme étant très eloigné les uns des autres. Ce problème est récurrent lorsque ces éléments sont présents dans le nom de domaine : - code postal (exemple : CS95458 ou simplement 95548) - type d'entreprise - synonyme et accronyme (Avenue = AV ; Place = PL ; Passage = PAS) - prépositions ajoutées (Rue de ... = Rue ...) - lorsqu'une entreprise possède un interval de rue. (rue 37-39 ... = rue 37 ...) - Ce problème est egalement présent lors de la recherche de la dénomination de l'entreprise : - Type d'entreprise à la fin "TotalEnergiesSE" - raccourcie (ForticheProduction = ForticheProd) - présence d'autres mots (AutomobilePeugeot // Peugeot) - Pour les villes : - mention "CEDEX" à la fin. - mention "TEL" à la fin. - Les codes postaux ne sont pas très fiable, car plus la difference entre les 2code postaux se fait tard dans sa lecture, moins elle est importante (**4**8 875 // **7**8 875 = très différent, alors que 48 87**5** // 48 87**6** = insignifiant). ## Annexe #### programme Python permettant le calcul du score d'un URL en se basant sur les fonctions d'attributions des scores de chaques indices. ``` python= import sys def main_score(): #SIREN en parametre implicite Score = 0 if not presence_Siren_bool(): return (-1) if not (recup_Siren()== Siren_reference()) : return(-1) #indice lié à la présence de "Editeur" ou "Hebergeur". if presence_Editeur() < 3 : #le 'inferieur a 3' fait #reference à la distance de levenschtein retourné par la fonction Score +=0.2 if presence_Hebergeur()<0: Score +=0.3 #indice lié au nom de domaine present dans l'URL if nom_de_domaine() >= 3: Score +=0.15 elif nom_de_domaine() >=0: Score+=0.9 else: Score-=0.3 #indice lié au nom de domaine présent dans le logo if nom_de_domaine() >= 10: Score -=0.7 elif nom_de_domaine() >=0: Score+=0.4 return(Score) ``` ### YAML repertoriant les différents synonymes accordés à differents indices ```yaml= Editeur : - Edite par - Produit par - est la propriete de - Siege social - Editeur du site - Edite et heberge - exploite par - condition générale de vente - Editeur - managed by - Editeur du site internet Hebergeur : - site heberge par - Hebergeur - Hebergement - Realisation du site - prestataire technique - hosting - host - Website host - hebergeur du site - est opéré par la societe - créateur du site Mentions legales : - Mentions legales - Mention legale - informations legales - cgv - cgu - conditions generales d utilisation - legals - smartlegalinformations - legalinfo - [Nom De Domaine] legal - legal notice - terms use - politique confidentialite - donnees client ``` --- ### YAML de la BlackList des hebergeur : ```yaml= Blacklist-Hebergeur: - 100pour100net - 6clones - ABCI - ABlink - Absolight - Akamai - Altima Hosting - Alter way - Alwaysdata - AMAZON WEB SERVICES - Amen - Aquaray - Archive-Host - ASP serveur - Celeonet - Claranet - clever cloud - CREA2F - Dinao - Easy hebergement - easy name - EOLAS Business & Decision - EX2 - Firstheberg - Gandi - Hostpapa France - Hostinger - Hosteur - HQweb - IBM FRANCE - Ikoula - Infomaniak - Inulogic - Ionos - Jaguar network - Likuid - Liquid Web - LWS - Magiconline - Milkywan - Monarobase - Netalis - Nuxit - Planethoster France - Powermail - Pulse Heberg - o2Switch - obambu - OVH - Ouvaton - Overblog - Oxalide Claranet - Sapinet - SCALAIR - Scaleway - Shopify - Sivit - Squarespace - Stellantis - Strato - Talentsoft - Webflow - WIX - Wshop - Woktron - Wordpress ``` ### YAML de la blacklist des annuaires d'entreprises: ```yaml= Annuaire: - Societe.com - infogreffe.fr - sirene.fr - pappers.fr - aef.cci.fr - kompass.com - Indexa.fr - pagespro.com - linkedin.com - manageo.fr - b-reputation.com ```