Un logiciel pour résoudre manuellement du Fuzzy Matching ?

Bonjour,

J’ai dans une base de données beaucoup de données texte qui se ressemblent, dans le style suivant:

  2 Etablissement public pour l'aménagement de la région de La Défense
  3 Etablissement public pour l'aménagement de la région dite “de la Défense”
 29 Etablissement public pour l'aménagement de la région dite « de la Défense »
  1 Etablissement public pour l'aménagement de la région dite “de La Défense”
  2 groupement de coopération sanitaire « Centre régional de compétence en surdité infantile »
  1 groupement de coopération sanitaire « Centre régional de compétence en surdité infantile » (CRCSI)

Je souhaite résoudre ces conflits en normalisant ces entrées dans ma base. Tout ne peut malheureusement pas s’automatiser, et je suis à la recherche d’une interface qui me permette de trouver facilement des chaines proches entre elles, et surtout de décider que ces chaines décrivent effectivement bien la même chose (et stocker cette information quelque part).

Auquel cas, il faudrait également choisir l’écriture à privilégier parmi celles qui sont proposées

Je suis donc principalement à la recherche d’une interface faite pour ce travail fastidieux, si ca existe. Et si ca n’existe pas il faut d’urgence combler le vide.

Avez-vous par hasard déjà rencontré ca ?

En vous remerciant pour vos lumières,

Nathann Cohen

P.S.: Pour ceux que ca intéresse, ca fait partie de ma tentative d’offrir une version ‹ propre › des nominations publiées au Journal Officiel: http://jorfsearch.steinertriples.fr

Bonjour,

personnellement j’utiliserai un E.T.L. du type Pentaho ou Talend pour normaliser la données :

  • Je charge mes données
  • Je visualise de manière unique chaque écriture, peut-être par rapport à un ID s’y rapportant ?
  • Je détermine une écriture « propre »
  • J’applique un nettoyage de ma donnée : suppression des caractères jugés inutile (guillemet etc…)
  • j’applique une expression régulière pour chaque brique de données voulant la même écriture…

Gaël Bialkowski

PS : Intéressant ce travail :slight_smile:

Il y a aussi LibreOffice :laughing:
Il y a même des personnes super compétentes, qui donnent de leur temps pour résoudre, accompagner, expliquer, apprendre, debuguer etc. (rigoler aussi de temps en temps). Mac, Linux et même windows (trop encore)
https://fr.libreoffice.org/get-help/poser-une-question/
Après ça dépend aussi le nb d’enreg que tu as dans ton fichier et le retour de Gaël me semble au top de l’académique pour les « gros fichiers » (merci )
slts
fa

ps: je profite de la « promo » pour LO pour faire celle de l’ODF… la loi, le RGI v2 ! http://www.ploss-ra.fr/wp-content/uploads/2017/05/Note_info_RGIv2_mai2017.pdf
ne pas hésiter à utiliser en tant que citoyen, entreprise, asso etc.

Bonsoir,

Oui très bonne idée de penser à un outil dédié. En attendant de savoir s’il existe ou s’il faut en mettre un sur pied, voici un petit retour d’expérience.
Pour essayer de regrouper des affiliations de laboratoire de recherche dans une base de publications, l’algorithme permettant de calculer la distance de levenshtein s’avère utile pour dégrossir le travail.
Voila la matrice qui compare les 6 chaines données en exemple (sans la valeur numérique du début probablement issue d’un uniq -c ?):

	1	2	3	4	5	6
1	0	8	10	7	67	75
2		0	4	1	66	74
3			0	5	64	72
4				0	66	74
5					0	8
6						0

( codé en Xquery sous eXistDB pour faire un peu de pub également à un bel outil opensource )

Si vous utilisez R, le package fuzzyjoin fait exactement ça.

Il faut aussi regarder le logiciel Merge machine https://github.com/entrepreneur-interet-general/Merge-Machine développer l’an passé dans le cadre du programme EIG.

Je vous conseille de regarder du côté de OpenRefine (http://openrefine.org/)

Merci pour vos réponses !

Je les ai toutes explorées (il faudra en particulier que je revienne vers OpenRefine), mais je me suis rendu compte en cours de route que ce que je voulais n’était pas si compliqué.

Pour ceux que ca intéresse, voici mon nouvel outil:

https://www.steinertriples.fr/ncohen/tmp/norm/

On a une grande liste triée lexicographiquement (le projet EIG ‹ merge-machine › est plus intelligent que ca, basé sur ElasticSearch) et on sélectionne les lignes à fusionner. On clique sur ‹ Normaliser › et on choisit ensuite le représentant préféré.

Quelques lignes de PHP (Sigh…) par derrière et les fusions sont gardées en mémoire dans un beau fichier json :slight_smile:

Si je veux faire quoi que ce soit de plus intelligent que du tri lexicographique, il faudra ensuite aller voir fuzzyjoin et les distances de Levenshtein (si ce n’est pas trop couteux en calcul).

Bonne soirée !

Nathann

P.S.: Cette page web est ‹ read-only ›
P.P.S: C’était bien un ‹ uniq -c ›.

Et pour ma part j’utilise très souvent l’extension trigrams de postgres (pg_trgm).

Elle normalise le texte (majuscules, pas d’accents, uniquement de l’alpha et du numérique), puis le découpe par séquences de 3 caractères (trigram) et compare le nombre de trigram communs à deux chaine pour calculer une similarité ou une distance.

Avantage:

  • indifférent à l’inversion de l’ordre des mots
  • possibilité de créer un index sur ces trigrams, qui sera utilisé pour les recherche en « contient » et les expressions régulières.

Voir: https://www.postgresql.org/docs/current/static/pgtrgm.html

1 Like

C’est encore un prototype, mais Takoyaki est très prometteur dans l’esprit Refine mais en plus léger, plus rapide et avec plus de recettes de désambiguïsation : http://yomguithereal.github.com/takoyaki/

Il repose sur Talisman, une lib JS libre regroupant toute une collection d’algos de fuzzy matching : https://github.com/Yomguithereal/talisman

Ah chic. Ca c’est drôlement proche de ce qu’il me fallait. Je vais l’utiliser pour fusionner mes données, et jeter ensuite un coup d’œil au fichier trié pour voir s’il resterait par hasard encore des clusters.

Merci !

Dedupe (https://dedupe.io/, https://github.com/dedupeio/dedupe) est un package python (avec une interface en freemium) qui utilise des travaux récents de maching learning.