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

Langage SQL Discussion :

Lister et compter les occurrences de mots dans un table char


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Lister et compter les occurrences de mots dans un table char
    Bonjour,

    Je suis nouveau sur ce forum et me résigne à poster ma question n'ayant pu trouver de réponse ni ici ni ailleurs (je me demande même si ce que je veux faire est réellement possible, vous me le direz).

    Je souhaite compter, dans une table de type VARCHAR, le nombre d'occurence de chaque mot, pour voir ceux qui ressorte le plus.

    Voilà en fait la forme de mon problème: j'ai une table de character fictif du cinéma (disons ID + nom), et essaye d'en ressortir les noms le plus souvent donné aux personnage. Intuitivement, ce genre de requête serait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT Character.name, COUNT(*) AS number
    FROM Character
    GROUP BY Character.name
    ORDER BY number DESC
    LIMIT 100
    Le problème est que l'attribut NOM contient le nom, prénom et parfois fonction tu personnage, et que "Johnny X" et "Johnny Y" ne sera pas reconnu comme étant le même nom utilisé deux fois.

    D'avance merci à tous de votre aide!
    Jmuth

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 017
    Points : 40 931
    Points
    40 931
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    pourquoi ne pas 'extraire' jusqu'au premier espace ? reste que la fonction d'extraction dépendra un peu du SGBD qu'il eut donc été bon d'indiquer
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Merci de ta réponse.

    Donc ton idée serait d'uniquement considérer le premier mot de chaque entrée NAME. C'est déjà pas mal. Il restera quelques problèmes, dans le cas ou le nom a été mis avant le prénom par exemple, etc... Les data m'ont été fournie pour un projet universitaire et non sont pas parfaitement homogène. Parfois nom-prénom, parfois prénom-nom, parfois autre chose (elles sont tirée de IMDB (internet movie data base)).

    Je travaille sur pgAdmin (PostgreSQL)

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 017
    Points : 40 931
    Points
    40 931
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Les data m'ont été fournie pour un projet universitaire et non sont pas parfaitement homogène. Parfois nom-prénom, parfois prénom-nom, parfois autre chose
    le fameux principe du GIGO ! Garbage In Garbage Out .
    tu peux toujours tenter quelque chose en appliquant le principe le premier espace sert à délimiter deux mots (prénom ou nom)
    mais bien évidemment des noms doubles ou des noms comme PIERRE RICHARD (je sais c'est un acteur non un personnage mais c'est le nom qui me vient en tête) etc... poseront quand même des soucis d'interprétation , ceci dit, sur un gros ensemble de données, étant données que c'est statistique le résultat sera peut être parlant quand même

    principe : préparer une CTE (WITH) qui sera l'UNION de 2 requêtes (ou plus)

    proposition sans filet (non testée donc, écrite à la volée)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    WITH T AS
    (
    SELECT SUBSTRING(NAME FOR POSITION(' ' IN NOM)-1) AS MOT FROM CHARACTER  // devant l''espace
    JOIN 
    SELECT SUBSTRING(NAME FROM POSITION(' ' IN NOM)+1) AS MOT FROM CHARACTER // après l''espace
    )
    SELECT MOT AS NAME,COUNT(*) AS NUMBER FROM T
    GROUP BY MOT
    ORDER BY NUMBER DESC
    LIMIT 100
    ici j'ai juste utilisé SUBSTRING et POSITION voir ce qu'il pourrait en être avec des expressions régulières
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Re-bonjour,

    MERCI!

    Grâce à ton idée j'ai pu monter un code qui fonctionne plus ou moins. Disons le mieux possible vis-à-vis des datas fournies. Je laisse ici le code pour quelqu'un qui rencontrerai un jour le même problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    WITH t AS(
    SELECT split_part(name, ' ', 1) AS nom FROM character
    UNION ALL
    SElECT split_part(name, ' ', 2) AS nom FROM character
    UNION ALL
    SElECT split_part(name, ' ', 3) AS nom FROM character
    )
    SELECT nom, COUNT(*) AS number
    FROM t
    WHERE nom NOT LIKE ' '
    GROUP BY nom
    ORDER BY number DESC
    LIMIT 100
    Les split_part prennent le premier, deuxième et troisième délimités par un espace et le nom NOT LIKE ' ' permet d'ignorer les caractères vide potentiellement créer par un split_part(name, ' ', 3) appliqué à un élément de deux mots seulement.

    Merci encore de ton aide et bonne journée,
    Jmuth

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Compter les nombres de mots dans une chaine
    Par CLeBeR dans le forum C++
    Réponses: 6
    Dernier message: 28/11/2014, 21h39
  2. [11gR2] Retirer les occurrences de mots dans une phrase
    Par shaun_the_sheep dans le forum SQL
    Réponses: 3
    Dernier message: 30/05/2014, 10h09
  3. Réponses: 5
    Dernier message: 28/05/2012, 16h53
  4. Réponses: 1
    Dernier message: 18/06/2011, 21h12
  5. [ATL] Compter les occurrences de balises dans un XML
    Par Pikouse dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 31/07/2009, 09h22

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