[Résolu][Calc] Gérer des valeurs proches (format texte)
Modérateur : Vilains modOOs
Règles du forum
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 !
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 !
-
- Membre hOOnoraire
- Messages : 125
- Inscription : 23 janv. 2017 18:18
[Résolu][Calc] Gérer des valeurs proches (format texte)
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.
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
-
- 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)
Salut,
Sauf à fabriquer une liste de correspondances, je ne vois pas comment une machine pourrait traiter ce que seul un humain peut voir.
Sauf à fabriquer une liste de correspondances, je ne vois pas comment une machine pourrait traiter ce que seul un humain peut voir.
-
- PassiOOnné
- Messages : 629
- Inscription : 09 août 2017 22:15
Re: [Calc] Gérer des valeurs proches (format texte)
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)
Résultat :
Ami calmant, J.P
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,
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
LibreOffice 24.2.0 et OpenOffice 4.1.15 sous Ubuntu 20.04
-
- Membre hOOnoraire
- Messages : 125
- Inscription : 23 janv. 2017 18:18
Re: [Calc] Gérer des valeurs proches (format texte)
Intéressant ce ratio, est-ce que tu peux m'expliquer ces taux ?
Merci au passsage.
Merci au passsage.
LibreOffice 7.3.6.2, Windows 11
-
- ManitOOu
- Messages : 3031
- Inscription : 02 juil. 2014 17:25
Re: [Calc] Gérer des valeurs proches (format texte)
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 :
É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.
-
- PassiOOnné
- Messages : 629
- Inscription : 09 août 2017 22:15
Re: [Calc] Gérer des valeurs proches (format texte)
Hello,
En particulier on peut y trouver :
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). 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. La cellule L2 contient le seuil pour get_close_matches voici le code du script python :
testé sous Windows 10 L.O 7.3.4 A.O.O 4.1.13
Ami calmant, J.P
il faut lire la documentation de difflib qui se trouve icimaclode1950 a écrit : ↑07 sept. 2022 16:26 Intéressant ce ratio, est-ce que tu peux m'expliquer ces taux ?
En particulier on peut y trouver :
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.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.
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). 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. La cellule L2 contient le seuil pour get_close_matches 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))
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
LibreOffice 24.2.0 et OpenOffice 4.1.15 sous Ubuntu 20.04
-
- Membre hOOnoraire
- Messages : 125
- Inscription : 23 janv. 2017 18:18
Re: [Calc] Gérer des valeurs proches (format texte)
Merci pour ces explications.
Je m'en vais tester cela.
Je m'en vais tester cela.
LibreOffice 7.3.6.2, Windows 11
-
- Membre hOOnoraire
- Messages : 125
- Inscription : 23 janv. 2017 18:18
Re: [Calc] Gérer des valeurs proches (format texte)
Pas moyen de faire du python sur ma bécane ...
Est-ce que vous pourriez m'envoyer sur le forum votre fichier exemple ?
Merci !
Est-ce que vous pourriez m'envoyer sur le forum votre fichier exemple ?
Merci !
LibreOffice 7.3.6.2, Windows 11
-
- PassiOOnné
- Messages : 629
- Inscription : 09 août 2017 22:15
Re: [Calc] Gérer des valeurs proches (format texte)
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
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
LibreOffice 24.2.0 et OpenOffice 4.1.15 sous Ubuntu 20.04
-
- Membre hOOnoraire
- Messages : 125
- Inscription : 23 janv. 2017 18:18
Re: [Calc] Gérer des valeurs proches (format texte)
Merci, je vais déchiffrer ça.
LibreOffice 7.3.6.2, Windows 11