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 :

trouver les voisinages entre valeurs


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 42
    Points : 14
    Points
    14
    Par défaut trouver les voisinages entre valeurs
    A partir d'un texte, j'aimerais trouver les voisinages entre catégories c'est-à-dire les voisinages entre les valeurs d'un dictionnaire. Mais alors là je reste bloquer j'ai le code pour définir le dictionnaire mais à partir de là, je bloque :/

    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
     
    def constrDic(texte):
    	f=open(texte)
    	g=f.readlines()
    	f.close()
     
     
    	dico={}
    	for ligne in g:
    		s=string.split(ligne)
    		if dico.has_key(s[0]):
    			dico[s[0]]=dico[s[0]]+ [s[1:]] 
    		else:
    			dico[s[0]]=[s[1:]]
     
    	return dico
     
    di=constrDic("dico.txt")
    print di
    je pense qu'il faudrait comparer des couples de valeurs

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 42
    Points : 14
    Points
    14
    Par défaut
    en fait je dois écrire un programme dans lequel on fait des statistiques sur le voisinages des catégories des mots sur un texte donné. On peut retrouver la ou les catégories de chaque mot dans le dictionnaire en sachant que :
    -la clé = le mot
    -la valeur = la ou les catégories de ce mot

    ex : on aimerait savoir de quoi est précédé un nom.. un verbe, un déterminant..? et ce qu'il précède..

  3. #3
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Malgré cette dernière précision, je ne comprends toujours pas ce que tu cherches à faire !

    Le "voisinage d'une valeur d'un dictionnaire" (ici une liste de mots commençant par la même lettre) reste pour moi une énigme en soi...
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  4. #4
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    C’est en effet d’une limpidité des plus nébuleuses…

    Si par “voisinage” tu entends “les mots qui se ressemblent le plus” (par ex. “fortin” est plus proche de “fort” que de “faramineux”*?), je te conseille la lecture de ce post, qui traitait en parti de ce problème*: http://www.developpez.net/forums/d10...ne-caracteres/

    Pour faire court, jette un œil à la bibliothèque difflib

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 42
    Points : 14
    Points
    14
    Par défaut
    dsl j'ai un peu de mal à expliquer lol.. j'ai modifié mon 2ème message

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 42
    Points : 14
    Points
    14
    Par défaut
    Voilà, j'ai un petit soucis avec mon script. Le but de l'exercice est qu'à partir d'un texte (texte.txt), et d'un dictionnaire créer à partir de ce texte (dico.txt), je puisse établir des statistiques (en pourcentage) sur les voisinages entre catégories syntaxiques.

    Dans le fichier texte.txt, à une ligne correspond une phrase.

    Dans le fichier dico.txt, on trouve sur chaque ligne une forme lexicale, suivie d'une ou plusieurs catégories syntaxiques. Par exemple :

    chat nom
    ferme verbe nom adjectif
    le article pronom
    mange verbe
    sur prép
    vivre infinitif
    ...

    Avant de pouvoir effectuer des statistiques sur le voisinage entre catégories, j'ai compris qu'il me fallait créer un dictionnaire et une liste.
    Voici mon script :

    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
     
    import string
    import re
     
     
    def constrliste(texte):
     
        f=open(texte,"r")
        doc=f.readlines()
        f.close()
     
     
        for ligne in doc:
            l=string.split("doc")
        return doc
     
    liste=constrliste("texte.txt")
    print liste
     
     
    def constrliste2(texte):
            f=open(texte,"r")
            liste=f.readlines()
            f.close()
     
            return sum([line.split()for line in liste],[])
     
    liste2=constrliste2("texte.txt")
    print liste2
     
     
    def constrDic(texte):
    	f=open(texte)
    	g=f.readlines()
    	f.close()
     
     
    	dico={}
    	for ligne in g:
    		s=string.split(ligne)
    		if dico.has_key(s[0]):
    			dico[s[0]]=dico[s[0]]+ [s[1:]]
    		else:
    			dico[s[0]]=[s[1:]]
     
    	return dico
     
    di=constrDic("dico.txt")##appel de la fonction
    print di

    A partir de ce dico et de ces deux listes, je dois pouvoir déterminer des statistiques sur les catégories syntaxiques, c'est-à-dire à combien de pourcentage est précédé et suivi une catégorie syntaxique (par exemple : un nom est précédé à 56% d'un déterminant et suivi à 95% d'un verbe). Le script doit rendre un résultat, comme suit, dans un fichier :

    nom
    35% det, 14% pronom ... (précédé)
    95% verbe, 15% adjectif, .... (suivi)

    En espérant que ce soit beaucoup plus clair ^^



    j'ai un début de piste. je cherche dans ma liste2 ( mot à mot) pour chaque mot, le mot qui le précède et le mot qui suit.
    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
    def stats(texte):
        f=open(texte,"r")
        g=f.readlines()
        f.close()
     
        p=()
        s=()
        mot=()
        for mot in liste2 :
            if mot[0:] :
                p=liste2[0]
                s=liste2[2]
            print (p,mot,s) 
        return (p,mot,s)        
     
     
    word=stats("texte.txt")
    print word

    le problème c'est que j'aimerai incrémenter p et s à chaque changement de mot.. problème sur ces deux lignes de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     p=liste2[0]
     s=liste2[2]
    j'ai regardé un peu partout mais je n'y arrive pas

  7. #7
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Voici un petit bout de code qui marche (attention, code python3.2)*:

    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
    def constrliste(path):
        with open(path, "r") as f:
            return [[w for w in l.split()] for l in f.readlines()]
     
    #liste = constrliste("texte.txt")
    #print(liste)
     
     
    # Pour test
    liste = [["un", "petit", "test"], ["et", "après", "je", "vais", "me", "coucher"]]
     
     
    def constrDic(path):    with open(path, "r") as f:
            dct={}
            for l in f.readlines():
                s = l.split()
                if s[0] in dct:
                    dct[s[0]].add(s[1:])
                else:
                    dct[s[0]] = set(s[1:])
            return dico
     
    #di = constrDic("dico.txt")
    #print(di)
     
     
     
    # Pour test
    di = {"un": {"article", "adjectif", "pronom", "nom"},
          "petit": {"adjectif"},
          "test": {"nom"},
          "et": {"conjonction"},
          "après": {"adverbe"},
          "je": {"pronom"},
          "vais": {"verbe"},
          "me": {"pronom"},
          "coucher": {"verbe"}}
     
     
    # On crée un dict ayant pour clé toutes les catégories, et pour valeur des dicts ayant pour clé toutes
    # les catégories, et pour valeur le nombre d’occurences tupple [avant, après].
    cat = set()
    for el in di.values():
        cat |= el
    cat = list(cat)
    cat = dict([(c, dict([(c2, [0, 0]) for c2 in cat])) for c in cat])
    print(cat)
     
     
    # Pour chaque mot de chaque ligne, on itère sur chacune de ses catégories, et on y ajoute un pour
    # chaque catégories des mots précédents et/ou suivants…
    for l in liste:
        ln = len(l)
        for i, w in enumerate(l):
            for c in di[w]:
                if i > 0:  # Pas le premier mot de la ligne.
                    for c2 in di[l[i-1]]:
                        cat[c][c2][0] += 1
                if i+1 < ln:  # Pas le dernier mot de la ligne.
                    for c2 in di[l[i+1]]:
                        cat[c][c2][1] += 1
    print(cat)
     
     
    for cn, c in cat.items():
        print(cn, "→\n    [avant]", " ".join(["{}*: {};".format(cn2, c2[0]) for cn2, c2 in c.items() if c2[0]]),
              "\n    [après]", " ".join(["{}*: {};".format(cn2, c2[1]) for cn2, c2 in c.items() if c2[1]]))
    …qui me donne*:

    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
    nom →
        [avant] adjectif*: 1; 
        [après] adjectif*: 1;
    adverbe →
        [avant] conjonction*: 1; 
        [après] pronom*: 1;
    verbe →
        [avant] pronom*: 2; 
        [après] pronom*: 1;
    adjectif →
        [avant] nom*: 1; adjectif*: 1; article*: 1; pronom*: 1; 
        [après] nom*: 1; adjectif*: 1;
    article →
        [avant]  
        [après] adjectif*: 1;
    pronom →
        [avant] adverbe*: 1; verbe*: 1; 
        [après] verbe*: 2; adjectif*: 1;
    conjonction →
        [avant]  
        [après] adverbe*: 1;
    Note qu’il se contente de donner le nombre d’occurrences, à toi de faire la conversion en proportions, et le tri…

  8. #8
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    voici encore une façon de faire, probablement plus lisible (sans vouloir t'offenser mont29 ):
    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
    def frequence_entourage_dans_texte(it):
        '''it <-- iterable like list, file-like object, etc...'''
        res = {}
        for line in it:
            if line:
                frequence_entourage_dans_ligne(res,line)
        return res
     
    def frequence_entourage_dans_ligne(dico_final,ligne):
        ligne = enlever_ponctuaison_dans_ligne(ligne).strip().split()
        for index,mot in enumerate(ligne):
            cat_mot = categorie_mot[mot]
            if cat_mot not in dico_final:
                dico_final[cat_mot]={'precedent':{},'suivant':{}}
            mot_precedent = voisin_precedent(ligne,index)
            mot_suivant   = voisin_suivant(ligne,index)
            if mot_precedent:
                categorie = categorie_mot[mot_precedent]
                if categorie in dico_final[cat_mot]['precedent']:
                    dico_final[cat_mot]['precedent'][categorie]+=1
                else:
                    dico_final[cat_mot]['precedent'][categorie]=1
            if mot_suivant:
                categorie = categorie_mot[mot_suivant]
                if categorie in dico_final[cat_mot]['suivant']:
                    dico_final[cat_mot]['suivant'][categorie]+=1
                else:
                    dico_final[cat_mot]['suivant'][categorie]=1
     
    def enlever_ponctuaison_dans_ligne(ligne):
        res=''
        letters = ' '+''.join([chr(c) for c in range(ord('a'),ord('a')+26)])+''.join([chr(c) for c in range(ord('A'),ord('A')+26)])
        for char in ligne:
            if char in letters :
                res+=char
        return res if res.strip() else ''
     
    def voisin_precedent(liste,index_element):
        if index_element<1: return
        return liste[index_element-1]
     
    def voisin_suivant(liste,index_element):
        if index_element>=len(liste)-1: return
        return liste[index_element+1]
     
    #POUR L'EXEMPLE
     
    categorie_mot = {'etre': 'verbe',\
                 'ou'  : 'conj',\
                 'ne'  : 'neg',\
                 'pas' : 'nom',\
                 'telle': 'adverbe',\
                 'est' : 'verbe',\
                 'la'  : 'article',\
                 'question' : 'nom'}
     
    text = ['etre ou ne pas etre','telle est la question']
    petit exemple de fonctionnement:
    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
    >>> dico = frequence_entourage_dans_texte(text) #et c'est tout !
    >>> #petit formatage des données récupérées
    >>> for key,value in dico.items():
    	p,s = ['\n\t\t'.join(['{key:10}:{val}'.format(key=k,val=v) for k,v in value[x].items()]) for x in ('precedent','suivant')]
    	print '{key:10}:\n\tprecedent :\n\t\t{precedent}\n\tsuivant   :\n\t\t{suivant}'.format(key=key,precedent=p,suivant=s)
     
     
    nom       :
    	precedent :
    		neg       :1
    		article   :1
    	suivant   :
    		verbe     :1
    adverbe   :
    	precedent :
     
    	suivant   :
    		verbe     :1
    verbe     :
    	precedent :
    		nom       :1
    		adverbe   :1
    	suivant   :
    		article   :1
    		conj      :1
    neg       :
    	precedent :
    		conj      :1
    	suivant   :
    		nom       :1
    article   :
    	precedent :
    		verbe     :1
    	suivant   :
    		nom       :1
    conj      :
    	precedent :
    		verbe     :1
    	suivant   :
    		neg       :1

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 42
    Points : 14
    Points
    14
    Par défaut
    ce petit programme peut-il fonctionner avec python2.6?

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 42
    Points : 14
    Points
    14
    Par défaut
    là je viens d'isoler les valeurs du dico.. j'aimerais bien pouvoir compter le nombre d'occurences de chacune de ses valeurs.

    j'ai essayé d'incrémenter mais il ne veut pas :/

    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
     
    def constrCat(dico):
        f=open(dico,"r")
        g=f.readlines()
        f.close()
     
     
     
        for line in di:
            cat = di.values()
     
     
        return cat
     
    categorie=constrCat("dico.txt")
    print categorie

  11. #11
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    ce petit programme peut-il fonctionner avec python2.6?
    oui
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def constrCat(dico):
        f=open(dico,"r")
        g=f.readlines()
        f.close()
        for line in di:
            cat = di.values()
        return cat
     
    categorie=constrCat("dico.txt")
    print categorie
    • Quelle peut bien être l'utilité de g si tu ne t'en sert pas ?
    • C'est quoi di ? d'où il sort ?
    • affecter n fois la liste des valeurs de di (di doit donc être un dico) est n-1 fois inutile, pour n>1. C'est comme répéter n fois que tu t’appelles Boujoute.
    • J'espère pour toi que l'argument dico est bien un chemin de fichier et non ce que le nom semble indiquer, sans quoi... tu risques d'avoir du mal...


    Bon, info utile: on peut itérer sur un objet fichier, chaque itération nous renvoi une ligne. Ca évite de charger la mémoire inutilement, et puis au final ça va plus vite, étant donné que chacune des ligne est traitée au fur et à mesure.

    Conseil, apporte du soin dans les nom de tes variables, fonctions, la lisibilité en dépend en très grande partie.

    Enfin, dernier conseil, je te prescrit du Gerard Swinnen pendant une semaine ou deux, matin, midi et soir

    Et pardon si je te semble... virulent, c'est pourtant avec une froideur toute mécanique que j'ai écris ce post... sauf la petite note d'humour à la fin.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 42
    Points : 14
    Points
    14
    Par défaut
    non tkt je sais que je ne suis pas une lumière lol.

    eh c'est bien ce qu'il me semblait, je ne pourrais pas compter mes valeurs comme ça..

    tu pourrais me dire si ton script fonctionne avec python 2.7 ?

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 42
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par mont29 Voir le message
    Voici un petit bout de code qui marche (attention, code python3.2)*:

    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
    def constrliste(path):
        with open(path, "r") as f:
            return [[w for w in l.split()] for l in f.readlines()]
     
    #liste = constrliste("texte.txt")
    #print(liste)
     
     
    # Pour test
    liste = [["un", "petit", "test"], ["et", "après", "je", "vais", "me", "coucher"]]
     
     
    def constrDic(path):    with open(path, "r") as f:
            dct={}
            for l in f.readlines():
                s = l.split()
                if s[0] in dct:
                    dct[s[0]].add(s[1:])
                else:
                    dct[s[0]] = set(s[1:])
            return dico
     
    #di = constrDic("dico.txt")
    #print(di)
     
     
     
    # Pour test
    di = {"un": {"article", "adjectif", "pronom", "nom"},
          "petit": {"adjectif"},
          "test": {"nom"},
          "et": {"conjonction"},
          "après": {"adverbe"},
          "je": {"pronom"},
          "vais": {"verbe"},
          "me": {"pronom"},
          "coucher": {"verbe"}}
     
     
    # On crée un dict ayant pour clé toutes les catégories, et pour valeur des dicts ayant pour clé toutes
    # les catégories, et pour valeur le nombre d’occurences tupple [avant, après].
    cat = set()
    for el in di.values():
        cat |= el
    cat = list(cat)
    cat = dict([(c, dict([(c2, [0, 0]) for c2 in cat])) for c in cat])
    print(cat)
     
     
    # Pour chaque mot de chaque ligne, on itère sur chacune de ses catégories, et on y ajoute un pour
    # chaque catégories des mots précédents et/ou suivants…
    for l in liste:
        ln = len(l)
        for i, w in enumerate(l):
            for c in di[w]:
                if i > 0:  # Pas le premier mot de la ligne.
                    for c2 in di[l[i-1]]:
                        cat[c][c2][0] += 1
                if i+1 < ln:  # Pas le dernier mot de la ligne.
                    for c2 in di[l[i+1]]:
                        cat[c][c2][1] += 1
    print(cat)
     
     
    for cn, c in cat.items():
        print(cn, "→\n    [avant]", " ".join(["{}*: {};".format(cn2, c2[0]) for cn2, c2 in c.items() if c2[0]]),
              "\n    [après]", " ".join(["{}*: {};".format(cn2, c2[1]) for cn2, c2 in c.items() if c2[1]]))
    …qui me donne*:

    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
    nom →
        [avant] adjectif*: 1; 
        [après] adjectif*: 1;
    adverbe →
        [avant] conjonction*: 1; 
        [après] pronom*: 1;
    verbe →
        [avant] pronom*: 2; 
        [après] pronom*: 1;
    adjectif →
        [avant] nom*: 1; adjectif*: 1; article*: 1; pronom*: 1; 
        [après] nom*: 1; adjectif*: 1;
    article →
        [avant]  
        [après] adjectif*: 1;
    pronom →
        [avant] adverbe*: 1; verbe*: 1; 
        [après] verbe*: 2; adjectif*: 1;
    conjonction →
        [avant]  
        [après] adverbe*: 1;
    Note qu’il se contente de donner le nombre d’occurrences, à toi de faire la conversion en proportions, et le tri…


    j'ai essayé de voir avec le tien voila ce que ça donne :
    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
    import string
    import re
     
     
    def constrliste(texte): # définition de la fonction constrlist
     
        f=open(texte,"r")
        doc=f.readlines() 
        f.close() # le ferme
     
     
        for ligne in doc:
            l=string.split("doc")
        return doc 
     
    liste=constrliste("texte.txt") 
    print liste 
     
    def constrliste2(texte): 
            f=open(texte,"r")
            liste=f.readlines()
            f.close()
     
            return sum([line.split()for line in liste],[])
    liste2=constrliste2("texte.txt")
    print liste2
     
     
    def constrDic(texte):
    	f=open(texte,"r")
    	g=f.readlines()
    	f.close()
     
     
    	dico={} 
    	for ligne in g:
    		s=string.split(ligne)
    		if dico.has_key(s[0]): 
    			dico[s[0]]=dico[s[0]]+ [s[1:]] 
    		else:
    			dico[s[0]]=[s[1:]]
     
    	return dico
     
    di=constrDic("dico.txt")
    print di
     
     
    def constrCat(dico):
        cat = set()
        for el in di.values():
            cat |= el
        cat = list(cat)
        cat = dico([(c, dico([(c2, [0, 0]) for c2 in cat1])) for c in cat])
        print(cat)
     
    for l in liste:
        ln = len(l)
        for i, m in enumerate(l):
            for c in di[m]:
                if i >= 0:  
                    for c2 in di[l[i-1]]:
                        cat[c][c2][0] += 1
                if i+1 <= ln:  
                    for c2 in di[l[i+1]]:
                        cat[c][c2][1] += 1
    print(cat)
     
    for cn, c in cat.items():
        print(cn, "[avant]", " ".join(["{}*: {}".format(cn2, c2[0]) for cn2, c2 in c.items() if c2[0]]),
              "\n    [après]", " ".join(["{}*: {}".format(cn2, c2[1]) for cn2, c2 in c.items() if c2[1]]))
    j'ai un pb sur la ligne suivante
    ça me donne ça : Traceback (most recent call last):
    test3.py", line 62, in <module>
    for c in di[m]:
    KeyError: 'P'

  14. #14
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Ha mais faut pas dire que t'es pas une lumière, faut simplement que tu ais de bonne bases, qu'apparemment tu n'as pas encore.

    Bon...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def constrliste(texte): # définition de la fonction constrlist
     
        f=open(texte,"r")
        doc=f.readlines() 
        f.close() # le ferme
     
        
        for ligne in doc:
            l=string.split("doc")
        return doc
    ici, à quoi sert l ?
    analysons ce qu'il se passe:
    tu parcours chaque éléments de la liste doc, et à chaque iteration, tu affecte une nouvelle valeur à l, puis tu renvois doc...
    conclusion : c'est inutile
    voici un code qui fait la même chose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def construction_liste(filePath):
        return open(filePath).readlines()
    mais je pense avoir compris ce que tu cherches à faire dans cette fonction, et voici un code, qui n'est pas le plus concis, ni le plus efficace, mais qui reste lisible et facilement compréhensible:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def construction_liste(filePath):
        liste = []
        for line in open(filePath):
            liste.append(line.strip().split('doc')) #strip élimine les espaces et retours à la ligne au début et à la fin du string 
        return liste
    ton script est bourré d'incongruités du genre, sincèrement, je réitère ma prescription... cause là, tes bases sont loin d'être solides. Tu verras qu'après une semaine ou deux, tu sera à même de réaliser ce que cherches à faire et de mieux comprendre les codes qui t'ont été fournis ici.

    Courage, ce sera moins embêtant et difficile qu'il n'y paraît.

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 42
    Points : 14
    Points
    14
    Par défaut
    N.tox, je me suis inspirée de ton script.. je voulais savoir si tu pouvais me le corriger stp :/. J'ai un problème avec categorie_mot de ton script. Moi j'ai voulu le remplacer par les valeurs de mon dictionnaire mais ce n'est pas ça.
    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
    import string
     
     
    def ListeMots(texte):
        f=open(texte,"r") 
        doc=f.readlines() 
        f.close()
     
        Lmots = sum([line.split()for line in doc],[])
     
        return Lmots
     
    ListeM=ListeMots("texte.txt")
    print ListeM
     
    def Dico(dico): 
        f=open(dico,"r")
        g=f.readlines()
        f.close()
     
     
        dicti={}
        for ligne in g:
    	    s=string.split(ligne)
    	    if dicti.has_key(s[0]):
    		    dicti[s[0]]=dicti[s[0]]+ [s[1:]]
    	    else:
    		    dicti[s[0]]=[s[1:]]
     
        return dicti
     
    di=Dico("dico.txt")
    print di
     
     
    def voisin_precedent(ListeM,index_element):
        if index_element<1:
            return
        return ListeM[index_element-1]
     
    def voisin_suivant(ListeM,index_element):
        if index_element>=len(ListeM)-1:
            return
        return ListeM[index_element+1]
     
     
    def correspondance(ListeMots,Dico):
     
        ListeItems=list(di.items())
        for key,value in ListeItems:
            V = di.get(key)
            print V
     
        for index,mot in enumerate(ListeM):
            cat_mot = V
            mot_precedent = voisin_precedent(ListeM,index)
            mot_suivant   = voisin_suivant(ListeM,index)
            if mot_precedent:
                categorie = V[mot_precedent]
                if categorie in ListeItems[cat_mot]['precedent']:
                    ListeItems[cat_mot]['precedent'][categorie]+=1
                else:
                    ListeItems[cat_mot]['precedent'][categorie]=1
            if mot_suivant:
                categorie = V[mot_suivant]
                if categorie in ListeItems[cat_mot]['suivant']:
                    ListeItems[cat_mot]['suivant'][categorie]+=1
                else:
                    ListeItems[cat_mot]['suivant'][categorie]=1
     
    Searching=correspondance(ListeMots,Dico)
    print Searching
    je pense que tu vas encore me dire qu'il faut que je bosse mes bases, mais là j'aimerai que tu me le corriges en même temps

    Merci

  16. #16
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Ca marche

    Bon, alors déjà, quelque chose utile à savoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def ListeMots(texte):
        f=open(texte,"r") 
        doc=f.readlines() 
        f.close()
     
        Lmots = sum([line.split()for line in doc],[])
     
        return Lmots
    quand tu fais f.readlines, tout le fichier est parcouru et chaque ligne est un élément de la liste retournée par cette fonction. Puis par la suite, dans sum([line.split() for line in doc,[]) tu parcours toute la liste doc, cad que tu parcours à nouveau chaque lignes récoltée. C'est un parcours de trop, tu pourrais avantageusement combiner le but de ces deux lignes de code pour ne faire qu'un seul parcours, tu gagnerais en vitesse. Tu peux procéder ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def ListeMots(chemin_fichier):
    	liste_de_mots = []
    	for line in open(chemin_fichier):
    		liste_de_mots.extend(line.strip().split())
    	return liste_de_mots
    Citation Envoyé par NOTES
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> ' un texte vraiment court  \n'.strip()
    'un texte vraiment court'
    même chose pour la fonction suivante, tu devrais avoir compris le principe, je te laisses le soin de la corriger toi-même

    Maintenant,après avoir lu en diagonale ton script, je vois que tu as plutôt bien compris le truc. Mais, il y a un mais , en fait tu n'avais besoin que de rajouter une fonction, celle qui lit et met en dictionnaire les mots et leur natures correspondantes, 'dico.txt' si j'ai bien compris. Dans le code que je t'ai donné, j'avais mis le texte sous forme de liste, pour chaque éléments représent un ligne, mais tu peux très bien simplement donner comme argument à la fonction frequence_entourage_dans_texte, open('texte.txt')...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    resultats_analyses = frequence_entourage_dans_texte(open('texte.txt'))
    Il y a une autre chose à modifier, dans le code que je t'ai fournis, une partie de la fonction frequence_entourage_dans_ligne, cette partie:
    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
    def frequence_entourage_dans_ligne(dico_final,ligne):
        ligne = enlever_ponctuaison_dans_ligne(ligne).strip().split()
        for index,mot in enumerate(ligne):
            cat_mot = categorie_mot[mot]
            if cat_mot not in dico_final:
                dico_final[cat_mot]={'precedent':{},'suivant':{}}
            mot_precedent = voisin_precedent(ligne,index)
            mot_suivant   = voisin_suivant(ligne,index)if mot_precedent:
                categorie = categorie_mot[mot_precedent]
                if categorie in dico_final[cat_mot]['precedent']:
                    dico_final[cat_mot]['precedent'][categorie]+=1
                else:
                    dico_final[cat_mot]['precedent'][categorie]=1
            if mot_suivant:
                categorie = categorie_mot[mot_suivant]
                if categorie in dico_final[cat_mot]['suivant']:
                    dico_final[cat_mot]['suivant'][categorie]+=1
                else:
                    dico_final[cat_mot]['suivant'][categorie]=1
    Elle suppose que categorie_mot[une_cle] donne un string, cad que chaque mots ne possède qu'une seule nature possible, mais apparemment dans ton cas, plusieurs sont possibles, categorie_mot[une_cle] devrait alors donner une liste de strings. Ce que tu as bien reconstruit. il faut donc adapter ces parties de la fonction en conséquence... ce que je te laisse faire, mais je te laisse un indice que tu as déjà probablement trouvé : il faut utiliser des boucles en plus à certains endroits.

    Citation Envoyé par ASTUCE
    lorsque dans une liste où l'ordre n'a pas d'importance, tu veux retirer les doublons:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> a=[5,2,4,3,4,2,5,1,4,5]
    >>> a=set(a)
    >>> a
    set([1, 2, 3, 4, 5])
    >>> a=list(a)
    >>> a
    [1, 2, 3, 4, 5]
    en abrégé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> a=[5,2,4,3,4,2,5,1,4,5]
    >>> a=list(set(a))
    >>> a
    [1, 2, 3, 4, 5]

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 42
    Points : 14
    Points
    14
    Par défaut
    Alors j'ai bien regardé ton post et merci.. mais je reste encore un peu bête surtout pour la dernière fonction. tu peux m'aider un peu plus .. j'y arrive vraiment pas :/. D'ailleurs j'ai simplifié le truc, j'ai mis qu'une catégorie à chaque mot. mais je voulais savoir comment extraire la valeur categorie_mot à partir de la fonction Dico

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 42
    Points : 14
    Points
    14
    Par défaut
    tkt le print m'aide beaucoup

    bon je vais essayer de chercher par moi même .. T'avais vu ma fonction sur la recherche des cat ou pas? pour me dire si je suis sur la bonne voie ou pas?

  19. #19
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    C'est sûrement cause je suis crevé, mais met ton code entre deux balises[code][/code] ensuite tu indique le numéro de la ligne où tu butes et expliques ce que tu n'arrives pas à faire. Please.

    La plupart des developpeur et/ou programmeurs (amateurs ou pro) sont généralement des feignasses, qui toujours en général n'aiment pas passer plus de temps à décoder/deviner un énoncé nébuleux, qu'a actuellement résoudre le dit problème (c'est en tous cas comme ça que je fonctionne ), ce qui a souvent pour effet de les faire passer leur chemin

    le prends pas mal, c'est maladroit mais bien intentionné

    Dans tous les cas, bonne nuit, à plus tard

  20. #20
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Citation Envoyé par Boujoute Voir le message
    tkt le print m'aide beaucoup

    bon je vais essayer de chercher par moi même .. T'avais vu ma fonction sur la recherche des cat ou pas? pour me dire si je suis sur la bonne voie ou pas?
    Hmmmm.... ta fonction de recherche... ben testes bien ce que donne la méthode items dans la console, quel est le type d'objet de chaque éléments, les méthodes qui y sont associées...

    dans les 4 premières lignes, tu brasses énormément de vent, et par la suite... ben... je me rend compte que déjà dans la fonction équivalente que j'avais écrite on y perd facilement son latin... bon, je la réécrirai plus tard en plus factorisée. En attendant...

    Je t'ai déjà dit de réviser tes bases ? C'est comme vouloir appliquer Pythagore sans connaître les opérations de bases, vouloir lire sans connaître l'alphabet, vouloir conduire en ne sachant que démarrer le moteur, etc... allez, révision des listes et des dictionnaires, au moins. Allez, on ne discute pas !

Discussions similaires

  1. Peut on raisonner en objets pour trouver les relations entre classes?
    Par wafiwafi dans le forum Diagrammes de Classes
    Réponses: 42
    Dernier message: 05/01/2011, 12h32
  2. Trouver les différences entre 2 fichiers
    Par polymorphisme dans le forum Eclipse
    Réponses: 3
    Dernier message: 21/09/2010, 17h27
  3. Trouver les differences entre deux chaines
    Par xxxavvv dans le forum Langage
    Réponses: 4
    Dernier message: 28/05/2010, 23h42
  4. [RegEx] Trouver les mots entre guillemets
    Par naynay dans le forum Langage
    Réponses: 6
    Dernier message: 20/07/2009, 16h43
  5. Trouver les dates entre deux dates
    Par lilp1 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 28/05/2009, 16h05

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