Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
775 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  AIDE programme python DEBUTANT

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

AIDE programme python DEBUTANT

n°2279241
mimigeek
Posté le 10-04-2016 à 11:40:17  profilanswer
 

Bonjour à tous,
 
J'aurais besoin d'aide pour la confection d'un programme python, niveau débutant.
Je pense avoir bien avancé, mais il ne fonctionne toujours pas.
 
Voici l'énoncé:
 
Pour un texte quelconque, la tache consiste à remplacer chaque nom qui s'y trouve par celui que
l'on   trouve   dans   un   dictionnaire   7   entrées   après   lui.   Par   exemple,   on   remplace   ainsi   «mot»   par «motivation» et «phrase» par «phrénologie».
Votre programme devra s'appuyer sur des listes de noms (extraits du lexique morphologique de l'ABU), rechercher dans le texte les noms à remplacer, et produire en sortie le texte résultant de ces substitutions.
 
Mon lexique ABU a donc comme nom "lexique-ABU.txt"
Et mon texte "RaiponceETIQ.txt"
 
Voici le programme crée:
(devant chaque [.i], j'ai mis un point, sinon cette séquence etait prise pour une balise italique.)

Code :
  1. import re
  2.  
  3. #tableau pour lexiqueABU
  4. # J'ai extrait les noms, et je les ai mis dans un tableau 1 colonne.
  5. entree=open("lexique-ABU.txt", mode="r" )
  6. sortie=open ("lexique-ABUNOM.txt", mode="w" )
  7. mots=[]
  8. for ligne in entree:
  9.    ligne=ligne.rstrip("\n" )
  10.    test=re.search(r"(.*)\t.*\tNom:.*$", ligne)
  11.    if test:
  12.        print (test.group(1), file=sortie)
  13.  
  14. entree.close()
  15.  
  16. #tableau pour texte
  17. # J'ai fais un tableau 3 colonnes avec mots du texte. FORME, LEMME, TAG
  18. entree=open("RaiponceETIQ.txt", mode="r" )
  19. sortie=open("RaiponceETIQNOM.txt", mode="w" )
  20.  
  21. formes=[]
  22. lemmes=[]
  23. tags=[]
  24. for ligne in entree:
  25.    ligne=ligne.rstrip("\n" )
  26.    test=re.search(r"(.*)\t(.*)\t(.*)", ligne)
  27.    if test:
  28.        formes.append(test.group(1))
  29.        tags.append(test.group(2))
  30.        lemmes.append(test.group(3))
  31. entree.close()
  32.  
  33. #code pour chercher NOMS du texte dans le tableau.
  34. #  si c'est PAS un nom, j'imprime.
  35. i=0
  36. while i<len(mots)-1:
  37.    if tags[.i]!="NOM" in entree:
  38.        print (formes[.i], end=" " )
  39.  
  40.    i=i+1
  41.  
  42. sortie.close()
  43.  
  44. # si c'est un NOM, je substitue.
  45. entree2=open ("lexique-ABUNOM.txt", mode="r" )
  46. sortie2=open ("lexique-ABUNOMTAB.txt", mode="w" )
  47. mots=[]
  48. for ligne in entree2:
  49.    ligne=ligne.rstrip("\n" )
  50.    test=re.search(r"(.*)$", ligne)
  51.    if test:
  52.        mots.append(test.group(1))
  53.      
  54. entree2.close()
  55.  
  56. i=0
  57. while i<len(mots)-1:
  58.    if tags[.i]=="NOM" in entree:
  59.        test=re.sub("formes[.i]", mots[.i]+7, ligne)
  60.        print (test, end=" " )
  61.    i=i+1


 
(devant chaque [.i], j'ai mis un point, sinon cette séquence etait prise pour une balise italique)
En espérant que vous pourrez m'aider.
Merci par avance !


Message édité par gilou le 11-04-2016 à 12:04:00
mood
Publicité
Posté le 10-04-2016 à 11:40:17  profilanswer
 

n°2279246
bistouille
Posté le 10-04-2016 à 18:08:41  profilanswer
 

Il y a une balise code (bouton c/c++) pour rendre ton code lisible.
 
Sinon, si j'ai bien compris, tu dois remplacer certains mots par d'autres dans un texte prédéfini, c'est ça ?


---------------
On croit souvent avoir vu le fond de la stupidité humaine, et il parfois nécessaire qu'on vous rappelle qu'elle n'a pas de fond.
n°2279247
mimigeek
Posté le 10-04-2016 à 19:10:21  profilanswer
 

Ah super, je ne savais pas, je ne suis pas habitué aux forums.  
 
Oui je dois remplacer les noms d'un texte prédéfini, par les noms d'un lexique prédéfini aussi.

n°2279260
bistouille
Posté le 11-04-2016 à 12:30:09  profilanswer
 

Je comprends pas la logique de ton code  :D  
 
Comme tu ne précises pas où ton problème se situe, récupération des mots ? remplacement ?
 
Le truc est assez simple :
 
- Récupération du texte de base
- Copie de ce texte dans une autre variable (c'est sur celle-ci que les mots seront remplacés)
 
- Récupération des mots à remplacer et leurs remplacements.
Là tu as les choix de les stocker soit dans 2 listes ou tuples ou dans un dict
 
- Et enfin le remplacements des mots dans le texte.
 


---------------
On croit souvent avoir vu le fond de la stupidité humaine, et il parfois nécessaire qu'on vous rappelle qu'elle n'a pas de fond.
n°2279261
gilou
Modérateur
Modzilla
Posté le 11-04-2016 à 12:32:17  profilanswer
 

> extraits du lexique morphologique de l'ABU
Si ce sont les fichiers de abu.cnam.fr ils sont pleins d'erreurs.
 
Remplacer un nom par le nom+7 c'est pas difficile, mais faut faire gaffe au genre et nombre, sinon le texte final risque de faire assez désordre.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2279265
mimigeek
Posté le 11-04-2016 à 13:15:39  profilanswer
 

bistouille a écrit :

Je comprends pas la logique de ton code  :D  
 
Comme tu ne précises pas où ton problème se situe, récupération des mots ? remplacement ?
 
Le truc est assez simple :
 
- Récupération du texte de base
- Copie de ce texte dans une autre variable (c'est sur celle-ci que les mots seront remplacés)
 
- Récupération des mots à remplacer et leurs remplacements.
Là tu as les choix de les stocker soit dans 2 listes ou tuples ou dans un dict
 
- Et enfin le remplacements des mots dans le texte.
 


 
 
Mon problème arrive à partir du moment où je souhaite mémoriser le mot qui est un nom, et le remplacer (plus précisement, à partir de la ligne 44).  Je ne sais pas écrire le code pour la récupération des mots à remplacer et effectuer leurs remplacements
Je ne sais simplement quoi écrire...
Je suis vraiment novice.  
 
J'ai oublié de préciser, que le lexique ABU est à la base sous forme de 3 colonnes, une colonnes avec la forme (paquerettes), une colonne avec le lemme (PAQUERETTE) et une colonne avec le tag (NOM: fem.pl).
Mais j'en ai extrait tous les noms, et lexique-ABUNOM.txt est donc sous la forme d'une seule colonne, avec la forme de chaque noms.  
Aussi, le sens du texte final, n'a aucune importance.  
Il n'est pas important de se soucier de l'accord en genre et en nombre.  
 
Merci pour votre aide.
 
 

n°2279268
bistouille
Posté le 11-04-2016 à 13:54:58  profilanswer
 

Ah ok, je connaissais pas ce format de données de fichier.
 
Donc si ta liste est bonne, il suffit juste de faire un remplacement sur le texte.
 
Du genre :
 

Code :
  1. for cle, valeur in enumerate(taListeDeMots) :
  2.     texte = re.sub('(?<=\W)' + valeur + '(?=\W)', taListeDeMots[cle + 7], texte)


 


---------------
On croit souvent avoir vu le fond de la stupidité humaine, et il parfois nécessaire qu'on vous rappelle qu'elle n'a pas de fond.
n°2279280
mimigeek
Posté le 11-04-2016 à 21:14:23  profilanswer
 

bistouille a écrit :

Ah ok, je connaissais pas ce format de données de fichier.
 
Donc si ta liste est bonne, il suffit juste de faire un remplacement sur le texte.
 
Du genre :
 

Code :
  1. for cle, valeur in enumerate(taListeDeMots) :
  2.     texte = re.sub('(?<=\W)' + valeur + '(?=\W)', taListeDeMots[cle + 7], texte)


 


 
D'accord, mais comme je vous ai dis, je suis vraiment novice, et je ne sais absolument pas où placer cela parmi ce que j'ai deja fais.  
Et que signifi ('(?<=\W)' + valeur + '(?=\W)', je n'ai jamais vu ces expressions.  
 
Merci beaucoup pour votre aide !

n°2279314
bistouille
Posté le 12-04-2016 à 09:26:49  profilanswer
 

Pour la signification, c'est indiqué dans le module re de la doc python.
 
(?<=valeur) signifie " est précédé de "
(?=valeur) signifie " est suivi de "
\W représente un caractère non unicode.
 
Il y a également \b (délimiteur de mot), ne fonctionne pas chez moi, car il est lié au locales.
 
Donc l'expression est de cette forme pour éviter de remplacer les mots contenus dans d'autres.
 
Bon, sinon, pourrais-tu poster quelques lignes de ton fichier de mots ? (une 50aine ~)  
J'ai la flemme de chercher sur le net un fichier de ce type  :o  
 
 


---------------
On croit souvent avoir vu le fond de la stupidité humaine, et il parfois nécessaire qu'on vous rappelle qu'elle n'a pas de fond.
n°2279322
mimigeek
Posté le 12-04-2016 à 10:45:37  profilanswer
 

bistouille a écrit :

Pour la signification, c'est indiqué dans le module re de la doc python.
 
(?<=valeur) signifie " est précédé de "
(?=valeur) signifie " est suivi de "
\W représente un caractère non unicode.
 
Il y a également \b (délimiteur de mot), ne fonctionne pas chez moi, car il est lié au locales.
 
Donc l'expression est de cette forme pour éviter de remplacer les mots contenus dans d'autres.
 
Bon, sinon, pourrais-tu poster quelques lignes de ton fichier de mots ? (une 50aine ~)  
J'ai la flemme de chercher sur le net un fichier de ce type  :o  
 
 


 
 
Quelques lignes de mon fichier texte dans lequel je dois remplacer les noms:
Il PRO:PER il
était VER:impf être
une DET:ART un
fois NOM foi|fois
un DET:ART un
mari NOM mari
et KON et
sa DET:POS son
femme NOM femme
qui PRO:REL qui
avaient VER:impf avoir
depuis PRP depuis
longtemps ADV longtemps
désiré VER:pper désirer
avoir VER:infi avoir
un DET:ART un
enfant NOM enfant
 
Quelques lignes de mon fichier lexiqueNOM, dans lequel je dois piocher les noms (rechercher le nom sélectionner dans le texte et le remplacer par le mot qui se trouve 7 entrées plus loin.) Dans ce lexique, il n'y a deja que des noms.  
a
abaca
abacule
abaisse
abaissée
abaissées
abaissement
abaissements
abaisses
abaisseur
abaisse-langue
abajoue
abandon
abandonnataire
abandonné
abandonnée
abandonnées
abandonnés
abandons
abaque
abasourdissement
abat
abatage
 

mood
Publicité
Posté le 12-04-2016 à 10:45:37  profilanswer
 

n°2279326
bistouille
Posté le 12-04-2016 à 12:37:02  profilanswer
 

Ok, voici une exemple de script fonctionnel.
 

Code :
  1. import re
  2. # Remplacer ici par les chemins vers tes fichiers
  3. fichierTexte = './texte'
  4. fichierMots = './mots'
  5. # Stockage des mots à rechercher et remplacer en index d'un dict avec None pour valeur
  6. motsRecherches = {'mari':None, 'femme':None, 'enfant':None}
  7. texte = ''
  8. with open(fichierTexte, 'r') as fichier :
  9.     for ligne in fichier :
  10.         mot = re.search('^[^\s]+', ligne) # Recherche de tous les caractères non blancs, à partir du début de la ligne
  11.         if mot :
  12.             texte += mot.group(0) + ' '
  13. texte = texte.rstrip(' ')
  14. print(texte)
  15. # Ici on parcours donc les mots du fichier que l'on compare
  16. i = 1
  17. with open(fichierMots, 'r') as fichier :
  18.     for ligne in fichier :
  19.         mot = re.search('^[^\s]+', ligne) # Idem que précédemment
  20.        
  21.         # Si le mot de la ligne est en index des mots à rechercher
  22.         if mot.group(0) in motsRecherches.keys() :
  23.             motsRecherches[mot.group(0)] = i + 7 # On stocke le n° de ligne en valeur
  24.            
  25.         # Ici on regarde si le n° de ligne en cours existe en valeur des mots à rechercher
  26.         # Si présent on le remplace par le mot de la ligne en cours
  27.         for cle, valeur in motsRecherches.items() :
  28.             if valeur == i :
  29.                 motsRecherches[cle] = mot.group(0)
  30.                
  31.         i += 1
  32. print(motsRecherches)
  33. # Il ne reste plus qu'à faire les remplacements dans le texte
  34. # l'expression ((?<=\W)|(?<=^)) signifie :
  35. # (?<=\W) non précédé d'un caractère unicode
  36. # | ou
  37. # (?<=^) précédé du début de la chaine
  38. # Même chose pour l'expression de fin, sauf pour le $ qui représente la fin de la chaine
  39. for cle, valeur in motsRecherches.items() :
  40.     texte = re.sub('((?<=\W)|(?<=^))' + cle + '((?=\W)|(?=$))', valeur, texte)
  41.    
  42. print(texte)


 
Avec pour fichier de mots :
 

Citation :

a
mari
abaca
abacule
abaisse
abaissée
abaissées
abaissement
fou
abaissements
femme
abaisses
abaisseur
abaisse-langue
abajoue
abandon
abandonnataire
folle
abandonné
enfant
abandonnée
abandonnées
abandonnés
abandons
abaque
abasourdissement
alien
abat
abatage


 
J'ai mis pas mal de commentaires dans le code pour que tu comprennes la logique, bon les expressions régulières c'est pas facile à expliquer en quelques phrases, surtout si ça te donne des boutons, moi j'adore ça  :D


Message édité par bistouille le 12-04-2016 à 12:39:08

---------------
On croit souvent avoir vu le fond de la stupidité humaine, et il parfois nécessaire qu'on vous rappelle qu'elle n'a pas de fond.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  AIDE programme python DEBUTANT

 

Sujets relatifs
Demande d'aide pour instaler l'environement d'un FPGAappel de sous programme par entrée textuelle.
probleme programme arduino shield infrarouge ap.photo canon eos 500dAide pour exercice c
Client/Serveur PythonTraduction d'un programme C en python
[python] conseil pour la création d'un serveur de jeuxpistes pour traduction code écrit en C en python
Aide sur un code Python[Python] Aide pour un programme de débutant
Plus de sujets relatifs à : AIDE programme python DEBUTANT


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR