[Résolu][Calc] Gérer des valeurs proches (format texte)

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
maclode1950
Membre hOOnoraire
Membre hOOnoraire
Messages : 125
Inscription : 23 janv. 2017 18:18

[Résolu][Calc] Gérer des valeurs proches (format texte)

Message par maclode1950 »

Bonjour,

Je travaille actuellement sur un fichier d'adresses et parfois, voire même assez souvent en fait, les adresses sont de piètres qualités :

-doublons simples
-doublons proches (exemple : Rue des mimosas // rue des momisas / rue de mimosa)

Pour les doublons simples, je peux traiter mais pour ce qui est des "doublons proches" c'est difficile ...
Pensez-vous qu'une macro serait pertinente ? Par contre je ne vois pas trop comment faire, à la limite je souhaiterais mettre en évidence ces valeurs proches.

Merci pour votre aide.
LibreOffice 7.3.6.2, Windows 11
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25181
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Gérer des valeurs proches (format texte)

Message par Dude »

Salut,

Sauf à fabriquer une liste de correspondances, je ne vois pas comment une machine pourrait traiter ce que seul un humain peut voir.
Avatar de l’utilisateur
Jurassic Pork
PassiOOnné
PassiOOnné
Messages : 629
Inscription : 09 août 2017 22:15

Re: [Calc] Gérer des valeurs proches (format texte)

Message par Jurassic Pork »

en python, dans le module difflib il existe une classe ( SequenceMatcher) qui permet de calculer un ratio de similitude entre deux séquences de mots.
Voici un script python qui utilise cette classe que j'ai testé dans LibreOffice 7.3.4 ( extension APSO installée)

Code : Tout sélectionner

 # coding: utf-8
from __future__ import unicode_literals
from apso_utils import msgbox
from difflib import SequenceMatcher

def calculRatio(modele,adr):
    return SequenceMatcher(None, modele, adr).ratio()

def testRatio():
    model = "rue des mimosas"
    adresses = ["Rue des mimosas", "rue des momisas", "rue des mimoza", "rue des fleurs"]
    resultat = ""
    for adresse in adresses:
        resultat = resultat + adresse + " : " + str(calculRatio(model,adresse)) + "\n"
    msgbox(resultat)

g_exportedScripts =  testRatio,
Résultat :
similitude.PNG
Ami calmant, J.P
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice 7.6.2.1 et OpenOffice 4.1.15 sous windows 11
LibreOffice 24.2.0 et OpenOffice 4.1.15 sous Ubuntu 20.04
maclode1950
Membre hOOnoraire
Membre hOOnoraire
Messages : 125
Inscription : 23 janv. 2017 18:18

Re: [Calc] Gérer des valeurs proches (format texte)

Message par maclode1950 »

Intéressant ce ratio, est-ce que tu peux m'expliquer ces taux ?

Merci au passsage.
LibreOffice 7.3.6.2, Windows 11
zeguedon
ManitOOu
ManitOOu
Messages : 3031
Inscription : 02 juil. 2014 17:25

Re: [Calc] Gérer des valeurs proches (format texte)

Message par zeguedon »

Bonjour,

Éventuellement une autre solution avec l'outil Rechercher & remplacer du menu Édition, qui permet la recherche de similarité en mettant en surbrillance les cellules concernées, mais limité uniquement à un seul mot dans la zone de recherche :?
Après on peut imaginer une routine qui boucle sur tous les mots d'une chaîne, effectue la recherche de similarité pour chacun d'eux, repère les cellules concernées, tout en recherchant les autres mots dans ces cellules repérées afin ne laisser en surbrillance que celles contenant tous les mots similaires à la chaîne initiale :
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Comment baliser [Résolu] ?
AOO
LibreOffice
Sous Linux
Avatar de l’utilisateur
Jurassic Pork
PassiOOnné
PassiOOnné
Messages : 629
Inscription : 09 août 2017 22:15

Re: [Calc] Gérer des valeurs proches (format texte)

Message par Jurassic Pork »

Hello,
maclode1950 a écrit : 07 sept. 2022 16:26 Intéressant ce ratio, est-ce que tu peux m'expliquer ces taux ?
il faut lire la documentation de difflib qui se trouve ici
En particulier on peut y trouver :
classe difflib.SequenceMatcher
C'est une classe flexible permettant de comparer des séquences deux à deux de n'importe quel type, tant que les éléments des séquences sont hachables.
ratio()
Return a measure of the sequences' similarity as a float in the range [0, 1].
Where T is the total number of elements in both sequences, and M is the number of matches, this is 2.0*M / T. Note that this is 1.0 if the sequences are identical, and 0.0 if they have nothing in common.
Le module difflib possède également une fonction (get_close_matches) qui renvoie une liste de séquences similaires avec comme paramètre la séquence que l'on cherche, la liste de toutes les séquences dans lesquelles on cherche et un seuil (équivalent au ratio) à partir duquel on considère que les séquences sont similaires.
J'ai créé une nouvelle procédure qui utilise cette fonction.
Pour rendre les procédures plus justes je mets tout les caractères en minuscule avant d'appeler les fonctions difflib.
Pour faire un test je suis parti d'un classeur qui contient en colonne C la liste de toutes les rues de Nanterre (plage nommée listeAdresses).
similAdresses1.PNG
Dans la feuille la cellule K2 contient ce que l'on cherche dans SequenceMatcher avec comme liste la plage nommée listeAdresses le seuil est réglé à 0.85 pour ne pas avoir trop de résultats.
similAdresses3.PNG
La cellule L2 contient le seuil pour get_close_matches
similAdresses2.PNG
voici le code du script python :

Code : Tout sélectionner

# coding: utf-8
from __future__ import unicode_literals
from __future__ import print_function

import uno
import difflib
from difflib import SequenceMatcher

def calculRatio(modele,adr):
    lModele = modele.lower()
    lAdr = [p.lower() for p in adr]
    return SequenceMatcher(None, lModele, lAdr).ratio()

def testRatio(*args):
    doc = XSCRIPTCONTEXT.getDocument()
    feuille = doc.CurrentController.getActiveSheet()
    plage = doc.NamedRanges.getByName("listeAdresses").getReferredCells()
       # on récupere la liste des adresses en une seule fois
    valAdr = [list(x)[0] for x in plage.getDataArray()]
    model = feuille.getCellRangeByName("K2").String
    resultat = ""
    for adresse in valAdr:
        ratio = calculRatio(model,adresse)
        if ratio > 0.85:
            resultat = resultat + adresse + " : " + str(ratio) + "\n"
    msgbox(resultat,"calcul ratio - seuil 0.85")

def testCloseMatches(*args):
    doc = XSCRIPTCONTEXT.getDocument()
    feuille = doc.CurrentController.getActiveSheet()
    plage = doc.NamedRanges.getByName("listeAdresses").getReferredCells()
       # on récupere la liste des adresses en une seule fois
    valAdr = [list(x)[0].lower() for x in plage.getDataArray()]
    valCutoff = feuille.getCellRangeByName("L2").Value
    resultat = ""
    simili = []
    for adresse in valAdr:
        simili = difflib.get_close_matches(adresse, valAdr, n=10, cutoff=valCutoff)
        if len(simili)> 1:
            resultat = resultat + "doublons pour " + simili[0] + "\n"
    msgbox(resultat,"calcul similitudes - seuil : " + str(valCutoff))
testé sous Windows 10 L.O 7.3.4 A.O.O 4.1.13

Ami calmant, J.P
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice 7.6.2.1 et OpenOffice 4.1.15 sous windows 11
LibreOffice 24.2.0 et OpenOffice 4.1.15 sous Ubuntu 20.04
maclode1950
Membre hOOnoraire
Membre hOOnoraire
Messages : 125
Inscription : 23 janv. 2017 18:18

Re: [Calc] Gérer des valeurs proches (format texte)

Message par maclode1950 »

Merci pour ces explications.
Je m'en vais tester cela.
LibreOffice 7.3.6.2, Windows 11
maclode1950
Membre hOOnoraire
Membre hOOnoraire
Messages : 125
Inscription : 23 janv. 2017 18:18

Re: [Calc] Gérer des valeurs proches (format texte)

Message par maclode1950 »

Pas moyen de faire du python sur ma bécane ...
Est-ce que vous pourriez m'envoyer sur le forum votre fichier exemple ?
Merci !
LibreOffice 7.3.6.2, Windows 11
Avatar de l’utilisateur
Jurassic Pork
PassiOOnné
PassiOOnné
Messages : 629
Inscription : 09 août 2017 22:15

Re: [Calc] Gérer des valeurs proches (format texte)

Message par Jurassic Pork »

Hello,
voici en pièce jointe un classeur qui contient le code python. Pour pouvoir éditer et modifier le code python il faut avoir installé l'extension APSO (version en cours apso.oxt ici ). Lire le Readme pour savoir comment l'utiliser.
Dans le classeur il y a aussi une macro en basic qui montre comment appeler une macro python à partir du basic.

Ami calmant, J.P
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice 7.6.2.1 et OpenOffice 4.1.15 sous windows 11
LibreOffice 24.2.0 et OpenOffice 4.1.15 sous Ubuntu 20.04
maclode1950
Membre hOOnoraire
Membre hOOnoraire
Messages : 125
Inscription : 23 janv. 2017 18:18

Re: [Calc] Gérer des valeurs proches (format texte)

Message par maclode1950 »

Merci, je vais déchiffrer ça.
LibreOffice 7.3.6.2, Windows 11