IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SAS STAT Discussion :

Apariement termes selon % caractères communs : data quality / text Mining


Sujet :

SAS STAT

  1. #1
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut Apariement termes selon % caractères communs : data quality / text Mining
    Bonjour,

    J'ai de nouveau besoin de votre aide. Il se peut que ce problème est déjà plus ou moins été traité: je viens de commencer mes recherches sur internet et je vais continuer en parallèle de ce topic.

    Je vous explique la situation:
    - j'ai une table sas qui regroupe environ 4 millions de lignes et une seule colonne
    - chaque cellule est composée d'un mot ou d'une expression
    - le but est de regrouper ces termes pour obtenir les fréquences d'apparition sauf qu'il y a des erreurs de saisie ou bien des détails qui ne servent à rien

    exemple - erreur de saisie:
    bronchite à la ligne 1, bronchit à la ligne 2, bronchitte à la ligne 3
    => regrouper ces termes en un terme final bronchite

    exemple - détails qui ne servent à rien:
    algie de la main, algie du pied
    => regrouper ces termes en un terme final algie

    existe t il un moyen d'analyser le pourcentage de caractères communs entre les termes en tenant compte de l'ordre de ces caractères ?
    (sous sas ou excel ou access, ce que vous voulez tant que c'est pas trop compliqué à implémenter )

    comme j'ai dit plus haut, il y a 4 millions de lignes donc plus le programme sera automatique, mieux ce sera (surtout que j'ai au total 10 tables du meme genre donc 40 millions de lignes).

    je parle ici de termes médicaux mais j'ai aussi le problème pour d'autres types.

    est il possible de réaliser cela
    - en comparant les 4 millions de termes entre eux ?
    - en comparant les 4 millions de termes à une liste prédéfinie de termes finaux (je ne sais pas encore sous quelle forme serait cette liste car je ne sais meme pas s'il est possible d'en obtenir une...) ?

    merci d'avance pour vos conseils.

    PS: j'ai lu le SUGI 26 page 196 où il parle de codage avec une liste prédéfinie. ça utilise le module SAS/AF. Comment savoir si j'ai ce module dans mon SAS ?

    PS: j'ai vu sur certains topics se rapprochant du mien qu'il y a la proc pour faire des clusters. est ce que ça répondrait à mon problème ?

  2. #2
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    Salut

    C'est du data quality tout ça ou même du text Mining

    il existe les fonctions suivantes
    http://support.sas.com/onlinedoc/913...a000245948.htm : SOUNDEX Function

    http://support.sas.com/onlinedoc/913...a000245949.htm : SPEDIS Function

    http://support.sas.com/onlinedoc/913...a002206133.htm : COMPGED Function

    http://support.sas.com/onlinedoc/913...a002206137.htm : COMPLEV Function

    Oui tu peux avoir une liste valable de terme, ca peut aider pour les comparaisons avec ces fonctions justement.

    Stéphane.
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 747
    Points : 978
    Points
    978
    Par défaut
    Salut,

    Il ne te reste qu'a refaire l'algo "Jaro-Winkler"

    http://fr.wikipedia.org/wiki/Distance_de_Jaro-Winkler
    http://fr.wikipedia.org/wiki/Distance_de_Levenshtein

    Attention au soundex qui est biaisé car uniquement pour la langue anglaise.

    Il y a de nombreuses implémentations avec Java que tu peux utiliser directement depuis l'étape DATA (JavaObj)

    Tcho,

    Xav

  4. #4
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    WAOOW !

    Un grand merci à toi. Je vais regarder tout ça.

    Pour les listes, je vais essayer d'en trouver pour certains des types de termes que j'ai à traiter mais c'est sur que je n'en aurai pas pour tous.

    Encore merci.

    Bonne après midi.

    PS: Ouais, ça n'a rien à voir avec les stats tout ça, alors que chuis en stage de stat ... vivement que je trouve ailleurs !

    PS2: je viens de voir la 2ème réponse. je vais regarder aussi tout ça. c'est très gentil à vous de me proposer des liens, ça me fait gagner bcp de temps

  5. #5
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    bonjour à tous!

    me revoilà ...

    j'ai donc lu les différents docs indiqués ci dessus.

    je vais utiliser la fonction complev qui se base sur la distance de levenshtein (la fonction compged qui calcule la distance généralisée semble plus performante mais je suis pas sure que mon ordi suive ...).

    je suis donc en train de faire des tests.

    quand je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    data TestGroupe;
    	set Global;
    	id=_N_;
    run;
     
    data Template;
    	set Template;
    	id=_N_;
    run;
     
    data mixSourceTemplate;
    	merge TestGroupe Template;
    	by id;
    run;
     
    data DistDiag;
    	set mixSourceTemplate;
    	array CompareData {2} var1 var2;
    	compdist=complev(CompareData[1],CompareData[2]);
    run;
    ça me calcule
    - la distance entre var1 de la ligne 1 et var2 de la ligne 1
    - la distance entre var1 de la ligne 2 et var2 de la ligne 2
    - la distance entre var1 de la ligne 3 et var2 de la ligne 3
    - la distance entre var1 de la ligne n et var2 de la ligne n

    Mais le truc, c'est que je voudrais que ça me calcule
    - la distance entre var1 de la ligne 1 et var2 de la ligne 1
    - la distance entre var1 de la ligne 1 et var2 de la ligne 2
    - la distance entre var1 de la ligne 1 et var2 de la ligne 3
    - la distance entre var1 de la ligne 1 et var2 de la ligne n
    - la distance entre var1 de la ligne 2 et var2 de la ligne 1
    - la distance entre var1 de la ligne 2 et var2 de la ligne 2
    - la distance entre var1 de la ligne 2 et var2 de la ligne 3
    - la distance entre var1 de la ligne 2 et var2 de la ligne n
    ...
    donc toutes les lignes avec toutes les colonnes

    est ce qu'un tableau à 2 dimensions serait un élément de réponse ?
    ou bien faut il utiliser 2 boucles avec i et j ?
    ou bien les 2 ?
    ou bien aucun des 2 ?
    ou bien retain ?
    ou bien lag ?

    Merci de votre aide.

  6. #6
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    je viens d'imaginer autre chose.

    Je transpose ma table Template pour n'avoir qu'une seule ligne et pleins de colonnes (-> quelle est la limite du nombre de colonnes dans sas ?)

    Je fusionne ma table transposée avec la 1ère observation de ma table Source.
    Je fais une boucle en comparant:
    - colonne 1 (=1ère observation de ma table Source) à colonne 2 (colonne 1 du template)
    - colonne 1 (=1ère observation de ma table Source) à colonne 3 (colonne 2 du template)
    ...

    puis idem avec toutes les autres observations de ma table Source.

    Qu'en pensez vous ? (au niveau performance)

Discussions similaires

  1. Réponses: 5
    Dernier message: 23/10/2005, 18h27
  2. Réponses: 3
    Dernier message: 27/06/2005, 16h24
  3. limite de caractère sur un type="texte"
    Par auduma dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 18/03/2005, 14h06
  4. Réponses: 5
    Dernier message: 25/01/2005, 14h26
  5. recherche d'une chaine de caractère dans une données text
    Par jdeheul dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 17/06/2004, 16h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo