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

Python Discussion :

Expérience de Shannon


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2014
    Messages : 20
    Par défaut Expérience de Shannon
    Bonjour,

    Je suis en train d'essayer de compléter ce squelette basé sur l'expérience de Shannon :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    from math import log
    from random import random
     
    #==================== 1ère partie ==============
     
    def IncFreq(distribution:dict, letter:str):
        """ Incrémente le nombre d'occurrences de *letter* dans
            *distribution*.
            
            `distribution est un dictionnaire où une clé est une lettre
            et la valeur associée le nombre d'occurrences de cette lettre.
        """
        if letter in distribution :
            distribution[letter] += 1
        else:
            distribution[letter] = 1
     
    #______________________________________________________________________________
     
    def AnalFreq(distribution:dict, text:str):
        """ Ajoute à *distribution* les nombres d'occurrences des lettres 
            de *text*.
        """
        for letter in text:
            distribution[letter] = IncFreq(distribution, letter)
     
    #______________________________________________________________________________
     
    def string2distribution(text:str) -> dict:
        """ Retourne une nouvelle distribution qui donne les nombres
            d'occurrences des lettres de *text*.
        """
        distribution = dict()
        AnalFreq(distribution, text)
        return distribution
     
    #______________________________________________________________________________
     
    def TotalFreq(distribution:dict) -> int:
        """ Retourne la somme des nombres d'occurrences de *distribution*.
        """
        return sum(distribution.values())
     
    #______________________________________________________________________________
     
    def string2information(text:str) -> float:
        """ Retourne un dictionnaire une clé est une lettre et la valeur
            la quantité d'information portée par cette lettre.
        """
        info = dict()
        distribution = string2distribution(text)
        TotalFreq = TotalFreq(dict)
        for letter in distribution :
            info[letter] = log(TotalFreq/distribution[letter], 2)
        return info
     
    #______________________________________________________________________________
     
    def string2entropy(text:str) -> float:
        """ Retourne l'entropie du jeu de caractères du texte de référence
            *text*.
        """
     
        dist = string2distribution(text)
        entropie = 0
        for letter in dist : 
            entropie -= ((dist(letter)/TotalFreq(dist))*log(dist(letter)/TotalFreq(dist), 2))
        return entropie 
     
     
    #================== PROGRAMME PRINCIPAL =============
     
    if __name__ == '__main__':
     
     
        file = open('fable1.txt', 'r')
        text = file.read()
    J'aimerais savoir si mes premières fonctions sont correctes svp ?

    Cordialement.

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 304
    Par défaut
    Salut,

    Non, elles ne sont pas correctes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    def string2distribution(text:str) -> dict:
    Cette syntaxe est inconnue en Python.

    http://python.developpez.com/cours/apprendre-python3/

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 696
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Cette syntaxe est inconnue en Python.

    http://python.developpez.com/cours/apprendre-python3/
    Mais si! C'est les function's annotations introduites en 3.x
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2014
    Messages : 20
    Par défaut
    Normalement les définitions sont bonnes car elles étaient déjà incluses dans le squelette. C'est juste pour le corps des fonctions qu'il faudrait me corriger si c'est faux svp.

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 696
    Par défaut
    Citation Envoyé par Hero13 Voir le message
    Normalement les définitions sont bonnes car elles étaient déjà incluses dans le squelette. C'est juste pour le corps des fonctions qu'il faudrait me corriger si c'est faux svp.
    L’interpréteur vous dira s'il y a des erreurs de syntaxe.
    Après pour tester que ça fonctionne, rien ne remplacera les fonctions de tests (unitaire).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2014
    Messages : 20
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    L’interpréteur vous dira s'il y a des erreurs de syntaxe.
    Après pour tester que ça fonctionne, rien ne remplacera les fonctions de tests (unitaire).

    - W
    Ok merci mais comment fait-on pour ce cas-ci ? Pourriez-vous me donner un exemple de test unitaire svp ?

  7. #7
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Il manque la fermeture du fichier à la fin. Et la construction avec "with" serait préférable.

    En regardant rapidement, je n'ai rien vu d'autre.

    Ici les infos sur les "functions annotation": http://docs.python.org/3.3/tutorial/...on-annotations.

  8. #8
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 304
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Mais si! C'est les function's annotations introduites en 3.x
    - W
    Là je suis tombé de ma chaise !

    Quelle horreur (avis personnel que je vous autorise à partager), on peut vaguement deviner à quoi ça sert mais certains risquent de penser que cela remplace dorénavant les doc strings.

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 696
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Là je suis tombé de ma chaise !

    Quelle horreur (avis personnel que je vous autorise à partager), on peut vaguement deviner à quoi ça sert mais certains risquent de penser que cela remplace dorénavant les doc strings.
    Mais non c'est bien! Mais... seulement pour des "interfaces" externes.
    L’idée est d'avoir un "standard" qui permette l'introspection "programmatique" de l'API d'un module/composant.
    Avant l’intégration de cette fonctionnalité dans Python en "standard", pas mal de développeurs avaient du définir leur propre standard +/- incompatibles entres eux. Si vous n'en aviez pas besoin jusqu’à présent, vous pouvez continuer a vivre sans.

    Ok merci mais comment fait-on pour ce cas-ci ? Pourriez-vous me donner un exemple de test unitaire svp ?

    vous avez aussi le forum ALM sur le site développez que vous pouvez consulter.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2014
    Messages : 20
    Par défaut
    Citation Envoyé par wiztricks Voir le message

    vous avez aussi le forum ALM sur le site développez que vous pouvez consulter.
    - W
    Merci mais j'ai vraiment du mal là... Et sinon, c'est bien F5 pour voir si ma syntaxe est bonne ?

  11. #11
    Membre confirmé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 48
    Par défaut
    Bonjour,
    En cherchant "testunitaire python" sur google, on trouve pas mal de chose.
    http://docs.python.org/3.2/library/unittest.html
    Tu as des exemples plutôt simple avec la doc.

    Pour vérifier la syntaxe je pense que ça dépend uniquement de ton éditeur de texte.

  12. #12
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2014
    Messages : 20
    Par défaut
    Citation Envoyé par Alliaël Voir le message
    Bonjour,
    En cherchant "testunitaire python" sur google, on trouve pas mal de chose.
    http://docs.python.org/3.2/library/unittest.html
    Tu as des exemples plutôt simple avec la doc.

    Pour vérifier la syntaxe je pense que ça dépend uniquement de ton éditeur de texte.
    D'accord, merci.

  13. #13
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2014
    Messages : 20
    Par défaut
    La suite du code après string2entropy est :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    ______________________________________________________________________________
     
    def CumulDistrib(distribution:dict) -> dict:
        """ Retourne un dictionnaire qui donne la fréquence normalisée et 
            cumulée de *distribution*.
            L'ordre des lettres dans le cumul est l'ordre ASCII croissant.
        """
     
        T = TotalFreq(distribution)
        Frequence = dict()
        cumul = dict()
        old = 0
        for letter in sorted(cumul.keys()) :
            Frequence[letter] = distribution[letter]/T
     
        for letter in sorted(distribution.keys()) :
            cumul[letter] = distribution[letter] + old
            old = cumul[letter]
     
        return cumul
     
     
    #_________________________________________________________________________________
     
    def FindFirstGreaterInCD(cumuldistribution:dict, freq:float) -> str:
        """ Retourne la première lettre dont la fréquence dans *cumuldistribution*
            est supérieure ou égale à *freq*.
            Retourne '$' si toutes les fréquences sont inférieures à *freq*.
        """
        for letter in cumuldistribution :
            if cumuldistribution[letter] >= freq :
                return letter
     
     
     
    #_________________________________________________________________________________
     
    def RandLetter(cumuldistribution:dict) -> str:
        """ Retourne une lettre aléatoire avec une probabilité qui suit
            la  distribution cumulée normalisée *cumuldistribution*.
        """
        random.randint(1,cumuldistribution)
        for letter in cumuldistribution:
            return letter
     
    #_________________________________________________________________________________
    Est-ce que mes fonctions sont juste ? Je pense que FindFirstGreaterInCD et RandLetter sont fausses...

  14. #14
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 304
    Par défaut
    Salut,

    Puisqu'il s'agit d'un dictionnaire, tu peux utiliser les méthodes qui lui sont spécifiques.
    Pour la fonction FindFirstGreaterInCD():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        for key, value in cumuldistribution.items():
            if value >= freq:
                return key
    et pour RandLetter():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        idx = random.randint(0, len(cumuldistribution)-1)
        return  cumuldistribution.keys()[idx]

  15. #15
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2014
    Messages : 20
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Salut,

    Puisqu'il s'agit d'un dictionnaire, tu peux utiliser les méthodes qui lui sont spécifiques.
    Pour la fonction FindFirstGreaterInCD():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        for key, value in cumuldistribution.items():
            if value >= freq:
                return key
    et pour RandLetter():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        idx = random.randint(0, len(cumuldistribution)-1)
        return  cumuldistribution.keys()[idx]
    D'accord merci beaucoup ! Je ne connaissais pas item().

    J'ai fais les fonctions suivantes :

    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
    21
    22
    23
    24
    def RandText(cumuldistribution:dict, length:int) -> list:
        """ Retourne une liste de lettres aléatoires de longueur maximale *length* 
            où chacune des lettres apparaît avec une probabilité qui suit
            la  distribution cumulée normalisée *cumuldistribution*.
        """
     
        idx = random.randint(0, len(cumuldistribution)-1)
        for key in cumuldistribution:
            if len(cumuldistribution) < length:
                return  cumuldistribution.keys()[idx]
     
     
    #_________________________________________________________________________________
     
    def distribution2string(distribution:dict, length:int) -> str:
        """ Retourne un texte aléatoire de longueur maximale *length* 
            où chacune des lettres apparaît avec une probabilité qui suit
            la  distribution  *distribution*.
        """
        idx = random.randint(0, len(distribution)-1)
        for letter in distribution :
            if len(distribution) < length :
                distribution[letter] = RandText(cumuldist, length)
                return distribution.keys()[idx]
    C'est pas très juste à mon avis.

  16. #16
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2014
    Messages : 20
    Par défaut
    Désolé pour le double post mais est-ce que quelqu'un peut me dire si mes fonctions RandText et distribution2string sont justes svp ?

  17. #17
    Membre confirmé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 48
    Par défaut
    Bonjour,
    Syntaxiquement elles sont bonnes, mais je ne suis pas sur qu'elles fassent ce que tu veux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #tu récupères bien un indice au hasard
    idx = random.randint(0, len(cumuldistribution)-1)
    #tu fais une boucle, mais je ne vois pas pourquoi
    for key in cumuldistribution:
        #tu tests la taille de ton dict (donc son nombre de clef)
        if len(cumuldistribution) < length:
            #tu sors de la fonction (donc de la boucle) et tu renvois la clef à l'indice aléatoire
            return  cumuldistribution.keys()[idx]
    Du coup je ne vois pas du tout l’intérêt de la boucle.
    Tu peux essayer tant que tu veux, mais les valeurs à l'intérieur de la boucle ne change pas à chaque itération donc tu vas avoir toujours le même résultat.
    Du coup le code ci-dessous doit te donner exactement la même chose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    idx = random.randint(0, len(cumuldistribution)-1)
    if len(cumuldistribution) < length:
        return  cumuldistribution.keys()[idx]
    Néanmoins je ne sais pas si c'est ce que tu veux faire.
    Pour retourner une liste de taille length avec les clefs prisent de manière random
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    result_list = []
    for i in range(0, length):
        idx = random.randint(0, len(cumuldistribution)-1)
        result_list.append(cumuldistribution.keys()[idx])
    return result_list
    Encore une fois j'ai un gros doute si c'est vraiment ce que tu veux faire

  18. #18
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2014
    Messages : 20
    Par défaut
    En fait la fonction RandText doit engendrer un texte aléatoire dont les lettres suivent une distribution cumulée normalisée donnée avec une longueur maximum qui est passée en second paramètre. Donc si j'ai bien compris c'est comme la fonction RandLetter sauf qu'on doit retourner une liste de lettre au lieu d'une seule lettre donc peut être qu'il y a moyen de réutiliser la fonction RandLetter dans la fonction RandText, non ? Quoique je pense que ton code est bon donc c'est pas la peine, merci pour l'aide !

    Du coup pour la fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def distribution2string(distribution:dict, length:int) -> str:
        """ Retourne un texte aléatoire de longueur maximale *length* 
            où chacune des lettres apparaît avec une probabilité qui suit
            la  distribution  *distribution*.
        """
    "Cette fonction distribution2string ne traite que les distributions de lettres isolées. On considère ici une distribution telle que rendue par la fonction string2distribution. Un second paramètre indique la longueur de la chaîne à construire. On pourra utiliser la fonction qui convertie a list to a string pour obtenir la chaîne dont on connaît la liste des caractères."

    Peut-être que c'est là qu'il faut réutiliser les fonctions d'avant ?

  19. #19
    Membre confirmé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 48
    Par défaut
    Oui je pense que c'est ça.
    RandText te renvois une liste de lettre, et l'autre te demande un texte, donc il faut faire un appel et une conversion.

  20. #20
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2014
    Messages : 20
    Par défaut
    Comme ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def distribution2string(distribution:dict, length:int) -> str:
        """ Retourne un texte aléatoire de longueur maximale *length* 
            où chacune des lettres apparaît avec une probabilité qui suit
            la  distribution  *distribution*.
        """
        texteauto = ""
        for i in range(0, length):
            texteauto += RandText(distribution,length)
        return texte auto

Discussions similaires

  1. [Débat] Expériences au sujet de .NET
    Par DevX dans le forum Débats sur le développement - Le Best Of
    Réponses: 46
    Dernier message: 25/05/2014, 11h16
  2. [Expérience] Senior, junior, etc...
    Par Glob dans le forum Emploi
    Réponses: 7
    Dernier message: 06/08/2004, 22h27
  3. Retour d'expérience ?
    Par jIdJo dans le forum Maven
    Réponses: 1
    Dernier message: 05/11/2003, 08h33

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