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 :

concordance, expression rationnelle


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Novembre 2013
    Messages : 7
    Points : 1
    Points
    1
    Par défaut concordance, expression rationnelle
    Bonjour,
    J'ai créer un programme qui affiche les noms propres d'un texte,
    je voudrais le modifier afin qu'il me permettre d'extraire leurs contextes d'occurences (10mots) et qu'il les placent dans un fichier texte.
    Voici le premier programme (qui fonctionne):
    #! /usr/bin/python
    # -*- coding: utf-8 -*-

    import re

    f_dico_brut = open('Dictionnaire.txt','r')
    dico_brut = f_dico_brut.read()
    f_dico_brut.close()

    entrees = re.split(r'\n', dico_brut)

    dico = {}

    for ent in entrees:
    elements = re.split(r'\t', ent)
    dico[elements[0]] = elements[1]

    f_texte = open('untexte.txt','r')
    texte = f_texte.read()
    f_texte.close()

    delimiteur = re.compile(r'\W+', flags=re.UNICODE)
    mots = re.split(delimiteur, texte)
    cat1= re.compile(r"\b[A-ZÀÂÄÇÉÈËÊÏÎÖÔŒÜÛÙ][a-zàâïçéèëêïîöôœûüù]{2,}\b")

    f_anti= open("Antidictionnaire.txt", "r") #ATTENTION C'EST PAS LES MEMES
    t_anti= f_anti.read()
    f_anti.close()

    anti= re.split ("\n", t_anti)
    anti.append('trl')
    anti.append('lorsqu')
    anti.append('fig')
    anti.append('iii')
    anti.append('log')
    anti.append('abx')

    for mot in mots:
    if re.search(cat1, mot):
    if mot.lower() not in dico:
    if mot.lower() not in anti:
    print mot


    voici le deuxieme qui ne fonctionne malheureusement pas:
    #! /usr/bin/python
    # -*- coding: utf-8 -*-

    import re

    # Ouverture du fichier contenant les données brutes du dictionnaire de langue et stockage de ces données dans dico_brut
    f_dico_brut = open('Dictionnaire.txt','r')
    dico_brut = f_dico_brut.read()
    f_dico_brut.close()

    # Chaque éléments de la liste 'entrees' constitue une entrée dans le dictionnaire de langue
    entrees = re.split(r'\n', dico_brut)

    # Création du dictionnaire Python qui organisera les données du dictionnaire de langue
    dico = {}

    # Chaque entrée est coupée en deux: la vedette (l'entrée lexicale) sert de clé, ses informations grammaticales servent de valeur
    # (La vedette et ses informations grammaticales sont séparées par une tabulation dans le dictionnaire de langue)
    for ent in entrees:
    elements = re.split(r'\t', ent)
    dico[elements[0]] = elements[1]

    # On ouvre le fichier untexte.txt et on stocke les données qu'il contient dans la variable 'texte'
    f_texte = open('untexte.txt','r')
    texte = f_texte.read()
    f_texte.close()

    # On sépare le texte en une liste de mots
    delimiteur = re.compile(r'\W+', flags=re.UNICODE)
    mots = re.split(delimiteur, texte)
    cat1= re.compile(r"\b[A-Z][a-zàâïçéèëêïîöôœûüù]{2,}\b")

    f_anti= open("Antidictionnaire.txt", "r") #ATTENTION C'EST PAS LES MEMES
    t_anti= f_anti.read()
    f_anti.close()

    anti= re.split ("\n", t_anti)
    anti.append('trl')
    anti.append('lorsqu')
    anti.append('fig')
    anti.append('iii')
    anti.append('log')
    anti.append('Abx')

    for i in range(len(mot)):
    if re.search(cat1, mot):
    if mot[i].lower() not in dico:
    if mot[i].lower() not in anti:
    print "%s %s %s" % (' '.join(mots[i-10:i]), mots[i], ' '.join(mots[i+1:i+S11]))

    si quelqu'un a une piste je suis interessée

  2. #2
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Quand tu postes du code utilise les balises du même nom. Le # dans la barre d'outils.

    Est-ce que ce code te retourne une erreur ou bien il ne produit pas le résultat attendu ?

    Quelques remarques:

    - Préfère texte = texte.split('\t') à texte = re.split(r'\t', texte)

    - Plutôt qu'une liste de append() tu peux simplifier avec extend(['trl', 'lorsqu', 'fig', 'iii', ...])

    - Tu as une liste de mots
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mots = re.split(delimiteur, texte)
    mais, plus loin, tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in range(len(mot)):
    - Ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if re.search(cat1, mot):
    qui devrait sans doute être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if re.search(cat1, mots[i]):
    Et pour finir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "%s %s %s" % (' '.join(mots[i-10:i]), mots[i], ' '.join(mots[i+1:i+S11]))
    que se passe-t-il quand i est inférieur à 10 et d'où sort S11 ?

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Novembre 2013
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    oui peut etre que je ne devrais pas utiliser range avec une liste, mais je ne sais pas comment lui faire prendre en compte toutes mes conditions, s'il n'est pas dans le dico, s'il n'est pas dans l'anti et qu'il correspond à l'expression rationnelle affiche le:
    ...
    for mot[i] in mots:
    if mot[i].lower() not in dico:
    if mot[i].lower() not in anti:
    if re.findall(cat1, mots[i]):
    print "%s %s %s" % (' '.join(mot[i-5:i]), mot[i], ' '.join(mot[i+1:i+6]))

    dans le cas ou je modifie la fin du programme comme ca il me dit:
    for mot[i] in mots:
    NameError: name 'mots' is not defined

  4. #4
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    On ne s'est pas compris, je ne dis pas qu'il ne faut pas utiliser range() avec une liste, je faisais remarquer que tu as nommé ta liste mots et que dans range() tu la nommes mot sans le s

    Maintenant, si tu as une erreur "NameError: name 'mots' is not defined " c'est que tu as changé ton code.

    Reposte-le, entre balises siouplais ...

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Novembre 2013
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    #! /usr/bin/python
    # -*- coding: utf-8 -*-

    import re

    f_dico_brut = open('Dictionnaire.txt','r')
    dico_brut = f_dico_brut.read()
    f_dico_brut.close()

    entrees = re.split(r'\n', dico_brut)

    dico = {}

    for ent in entrees:
    elements = re.split(r'\t', ent)
    dico[elements[0]] = elements[1]

    f_texte = open('untexte.txt','r')
    texte = f_texte.read()
    f_texte.close()

    delimiteur = re.compile(r'\W+', flags=re.UNICODE)
    mot = re.split(delimiteur, texte)
    cat1= re.compile(r"\b[A-Z][a-zàâïçéèëêïîöôœûüù]{2,}[^1-9]\b")

    f_anti= open("Antidictionnaire.txt", "r")
    t_anti= f_anti.read()
    f_anti.close()

    anti= re.split ("\n", t_anti)
    anti.append('trl')
    anti.append('lorsqu')
    anti.append('fig')
    anti.append('iii')
    anti.append('log')
    anti.append('Abx')

    for mot[i] in mots:
    if mot[i].lower() not in dico:
    if mot[i].lower() not in anti:
    if re.findall(cat1, mots[i]):
    print "%s %s %s" % (' '.join(mot[i-5:i]), mot[i], ' '.join(mot[i+1:i+6]))

    merci beaucoup pour ton aide, je débute et jtrouve ca quand meme difficile

  6. #6
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Novembre 2013
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    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
    #! /usr/bin/python
    # -*- coding: utf-8 -*-
     
    import re
     
    f_dico_brut = open('Dictionnaire.txt','r')
    dico_brut = f_dico_brut.read()
    f_dico_brut.close()
     
    entrees = re.split(r'\n', dico_brut)
     
    dico = {}
     
    for ent in entrees:
        elements = re.split(r'\t', ent)    
        dico[elements[0]] = elements[1]
     
    f_texte = open('untexte.txt','r')
    texte = f_texte.read()
    f_texte.close()
     
    delimiteur = re.compile(r'\W+', flags=re.UNICODE)
    mot = re.split(delimiteur, texte)
    cat1= re.compile(r"\b[A-Z][a-zàâïçéèëêïîöôœûüù]{2,}[^1-9]\b")
     
    f_anti= open("Antidictionnaire.txt", "r")
    t_anti= f_anti.read()
    f_anti.close()
     
    anti= re.split ("\n", t_anti)
    anti.append('trl')
    anti.append('lorsqu')
    anti.append('fig')
    anti.append('iii')
    anti.append('log')
    anti.append('Abx')
     
    for i in range(len(mots)):
        if mots[i].lower() not in dico:
            if mots[i].lower() not in anti:
                if re.findall(cat1, mots[i]):              
                    print "%s %s %s" % (' '.join(mot[i-5:i]), mot[i], ' '.join(mot[i+1:i+6]))
    j'obtiens ce code d'erreur:
    for i in range(len(mots)):
    NameError: name 'mots' is not defined

  7. #7
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Novembre 2013
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Non en fait, j'ai réussi à le modifier de manière à ce que je n'Ai plus de messages d'erreurs, cependant si j'essaye de transférer les noms propres avec leur contexte dans un fichier texte nommé resultat mais il ne me sort qu'un seul nom propre, alors que quand j'utilisait print il me les affichait tous, je suspecte une erreur d'indentation, mais...
    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
    #! /usr/bin/python
    # -*- coding: utf-8 -*-
     
    import re
     
    f_dico_brut = open('Dictionnaire.txt','r')
    dico_brut = f_dico_brut.read()
    f_dico_brut.close()
     
    entrees = re.split(r'\n', dico_brut)
     
    dico = {}
     
    for ent in entrees:
        elements = re.split(r'\t', ent)    
        dico[elements[0]] = elements[1]
     
    f_texte = open('untexte.txt','r')
    texte = f_texte.read()
    f_texte.close()
     
    delimiteur = re.compile(r'\W+', flags=re.UNICODE)
    mots = re.split(delimiteur, texte)
    cat1= re.compile(r"\b[A-Z][a-zàâïçéèëêïîöôœûüù]{2,}[^1-9]\b")
     
    f_anti= open("Antidictionnaire.txt", "r")
    t_anti= f_anti.read()
    f_anti.close()
     
    anti= re.split ("\n", t_anti)
    anti.append('trl')
    anti.append('lorsqu')
    anti.append('fig')
    anti.append('iii')
    anti.append('log')
    anti.append('Abx')
     
    for i in range(len(mots)):
        if mots[i].lower() not in dico:
            if mots[i].lower() not in anti:
                if re.findall(cat1, mots[i]):              
                    destination=open("resultat.txt", "w")
                    destination.write("%s %s %s" % (' '.join(mots[i-10:i]), mots[i], ' '.join(mots[i+1:i+11])))
                    destination.close()

  8. #8
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    J'ai pas testé mais d'après ce que tu dis c'est ton mode d'écriture qui fait défaut.

    Change
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                    destination=open("resultat.txt", "w")
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                    destination=open("resultat.txt", "wa")
    Le "a" de "wa" c'est pour "append" sans cela le fichier est entièrement réécrit. Avec un seul mot à la fois dans ton cas.

  9. #9
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Novembre 2013
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    quand je met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    destination=open("resultat.txt", "wa")
    il me répond:
    Traceback (most recent call last):
    File "TP.py", line 43, in <module>
    destination=open("resultat.txt", "wa")
    ValueError: Invalid mode ('wa')

  10. #10
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Ooops, met "a" tout seul, hé ...

  11. #11
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Novembre 2013
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup! ca marche, il me fournit un fichier resultat.txt avec tous les noms propres et leur contexte
    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
    #! /usr/bin/python
    # -*- coding: utf-8 -*-
     
    import re
     
    f_dico_brut = open('Dictionnaire.txt','r')
    dico_brut = f_dico_brut.read()
    f_dico_brut.close()
     
    entrees = re.split(r'\n', dico_brut)
     
    dico = {}
     
    for ent in entrees:
        elements = re.split(r'\t', ent)    
        dico[elements[0]] = elements[1]
     
    f_texte = open('untexte.txt','r')
    texte = f_texte.read()
    f_texte.close()
     
    delimiteur = re.compile(r'\W+', flags=re.UNICODE)
    mots = re.split(delimiteur, texte)
    cat1= re.compile(r"\b[A-Z][A-Za-zàâïçéèëêïîöôœûüù]{2,}[^1-9]\b")
     
    f_anti= open("Antidictionnaire.txt", "r")
    t_anti= f_anti.read()
    f_anti.close()
     
    anti= re.split ("\n", t_anti)
    anti.append('trl')
    anti.append('lorsqu')
    anti.append('fig')
    anti.append('iii')
    anti.append('log')
    anti.append('Abx')
     
    for i in range(len(mots)):
        if mots[i].lower() not in dico:
            if mots[i].lower() not in anti:
                if re.search(cat1, mots[i]):              
     
                    destination=open("resultat.txt", "a")
                    destination.write("%s \n %s \n %s" % (' '.join(mots[i-10:i]), mots[i], ' '.join(mots[i+1:i+11])))
                    destination.close()
    et est ce que tu saurais comment le modifier pour que le fichier resultat soit, non pas sous forme .txt, mais en format CSV et que quand on l'ouvre dans excel il s'affiche en 3 colonnes (contexte-nom propre-contexte)?

Discussions similaires

  1. [RegEx] Expression rationnelle
    Par Shadow aok dans le forum Langage
    Réponses: 15
    Dernier message: 28/12/2005, 17h29
  2. Non ambiguïté d'expressions rationnelles
    Par David.Schris dans le forum Algorithmes et structures de données
    Réponses: 22
    Dernier message: 27/12/2005, 16h11
  3. [RegEx] Images et expression rationnelle
    Par Invité dans le forum Langage
    Réponses: 7
    Dernier message: 30/10/2005, 15h50
  4. Réponses: 2
    Dernier message: 21/02/2005, 10h42
  5. [langage] Expressions rationnelles (perl/C)
    Par ma2th dans le forum Langage
    Réponses: 11
    Dernier message: 02/08/2004, 18h07

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