Extraire les mots d'un texte comportant de la ponctuation

okchf Messages postés 8 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33766 Date d'inscription   Statut Modérateur Dernière intervention   -

Bonjour,

J'espère que vous allez bien j'ai un petit souci.

Voila l'énoncé de mon exercice:

  • Écrire une fonction words_by_length(fileName) qui prend en paramètre le nom, sous forme d’une chaîne de caractères, d’un fichier texte, et qui renvoie un dictionnaire associant à une longueur l la liste triée (dans l’ordre utf-8 croissant) des mots de longueur l présents dans le texte contenu dans le fichier. Ces mots seront écrits en minuscules.

  • Mon problème survient pour séparer les mots dans le fichier, j'écris ça :

 a = contenu.lower().split(" ")

... je ne sais pas comment les séparer d'une manière correcte les mots contenant des apostrophes, par exemple : s'épandait , d'un... ni comment séparer les mots avec des virgules et des points. Voila le texte du fichier mis en exemple :

Et, sous ses pieds, les coups profonds, les coups obstinés des rivelaines continuaient. Les camarades étaient tous là, il les entendait le suivre à chaque enjambée. N'était-ce pas la Maheude, sous cette pièce de betteraves, l'échine cassée, dont le souffle montait si rauque, accompagné par le ronflement du ventilateur ? A gauche, à droite, plus loin, il croyait en reconnaître d'autres, sous les blés, les haies vives, les jeunes arbres. Maintenant, en plein ciel, le soleil d'avril rayonnait dans sa gloire, échauffant la terre qui enfantait. Du flanc nourricier jaillissait la vie, les bourgeons crevaient en feuilles vertes, les champs tressaillaient de la poussée des herbes. De toutes parts, des graines se gonflaient, s'allongeaient, gerçaient la plaine, travaillées d'un besoin de chaleur et de lumière. Un débordement de sève coulait avec des voix chuchotantes, le bruit des germes s'épandait en un grand baiser. Encore, encore, de plus en plus distinctement, comme s'ils se fussent rapprochés du sol, les camarades tapaient. Aux rayons enflammés de l'astre, par cette matinée de jeunesse, c'était de cette rumeur que la campagne était grosse. Des hommes poussaient, une armée noire, vengeresse, qui germait lentement dans les sillons, grandissant pour les récoltes du siècle futur, et dont la germination allait faire bientôt éclater la terre. 


 

A voir également:

4 réponses

[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 

Salut okchf,

Tu dois recenser les différents caractères qui délimitent des mots.

Tu pourrais considérer l'apostrophe comme un de ces caractères, car "d'un" est la contraction de deux mots : de un.

Une fois que tu as fait ce recensement, tu peux utiliser, par exemple, re.split pour diviser une chaîne selon les caractères séparateurs identifiés.

https://docs.python.org/3/library/re.html#re.split

Un exemple :

import re
ligne = "Quand on est mort... écoutez ça... quand on est mort, c'est pour longtemps. (Emile Zola)"
for mot in re.split("[ ,.'()]+", ligne):
    print(mot)

"[ ,.'()]+" est une expression rationnelle qui signifie "un ou plusieurs caractère(s) parmi ceux entre les crochets".

donne :

$ python3 37726332.py
Quand
on
est
mort
écoutez
ça
quand
on
est
mort
c
est
pour
longtemps
Emile
Zola


2
mamiemando Messages postés 33766 Date d'inscription   Statut Modérateur Dernière intervention   7 878
 

Bonjour,

Une variante encore plus simple :

import re

s = "Et, sous ses pieds, les coups (profonds) ne l'atteignaient pas"
l = list(w for w in re.split("\W", s) if w)

print(l)
#['Et', 'sous', 'ses', 'pieds', 'les', 'coups', 'profonds', 'ne', 'l', 'atteignaient', 'pas']

Bonne chance

1
Utilisateur anonyme > mamiemando Messages postés 33766 Date d'inscription   Statut Modérateur Dernière intervention  
 

Bonjour

Okchf semble en être au split de la classe string dans sa formation.

Le split Regex c'est déjà un cran au dessus, alors une expression lambda avec regex, pas sûr que ce soir plus simple....

okchf, avec le split que tu connais, tu peux commencer par remplacer tous les caractères que tu présents comme étant "séparateur" par un seul, la virgule par exemple, et ensuite spliter par les virgules et supprimer les "cases" vides.

Si tu connais les regex, alors la solution de [Dal] est la plus adaptée, je pense

1
Diablo76 > Utilisateur anonyme
 

Une regex sur c'est... je ne pense pas que ça devienne un mot...

0
mamiemando Messages postés 33766 Date d'inscription   Statut Modérateur Dernière intervention   7 878 > Diablo76
 

Et pourtant ...

import re
s = "C'est"
print(list(w for w in re.split("\W", s) if w))

Résultat :

['C', 'est']
1
Diablo76 > mamiemando Messages postés 33766 Date d'inscription   Statut Modérateur Dernière intervention  
 

D'accord sur le principe mais C n'est pas un mot.... Juste une lettre

0
Diablo76
 

Salut,

Tu peux utiliser la méthode replace()

Ex:

a = contenu.replace(".", "")

remplacera tous les points par rien.

1
okchf Messages postés 8 Date d'inscription   Statut Membre Dernière intervention  
 

Bonjour, Merci énormément pour votre aide et votre effort c'est très gentil , j'espère que ca vous dérange pas de vous redemander quelque chose voila mon code pour cet exercice:

 
f = open(file)
contenu = f.readline()
a = contenu.lower()
s = {}
for mot in re.split("[-? ,.'()]+", a):
    if mot not in s :
        s.setdefault(len(mot),[]).append(mot)
print(s)

mon problème est la répétition des mots dans mon dictionnaire , j'ai essayé la méthode :

 
if mot not in s:

mais ca ne change rien . Merci en avance.

0
Utilisateur anonyme
 

Peux-tu faire l'effort de poster correctement ton code, comme je te l'ai déjà demandé dans la discussion en doublon ?

Je te remets une fois de plus le lien avec le petit tuto pour nous rendre l'aide plus facile.

https://codes-sources.commentcamarche.net/faq/11288-poster-un-extrait-de-code

0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 

Quand tu postes ton code n'oublie pas d'indiquer dans la liste déroulante le langage de programmation pour que la coloration syntaxique fonctionne.

Quant à ton code, là je pense que tu testes si le mot est présent parmi les clefs du dictionnaire...

Je pense que tu dois d'abord tester si la clef existe dans ton dictionnaire.

Si ce n'est pas le cas, tu peux créer ta liste à cet emplacement avec le premier mot que tu traites.

Si la clef existe dans ton dictionnaire, alors, cela signifie que tu as au moins une entrée dans la liste correspondant à cette clef. Avant d'insérer une nouvelle entrée, tu dois :

  • vérifier si cette entrée n'existe pas déjà
  • si elle n'existe pas déjà, l'insérer dans l'ordre alphabétique (si elle existe déjà, tu ne fais rien de ce mot répété)

Pour insérer un mot dans une liste triée, je pense que tu pourrais t'intéresser à bisect.insort :

https://docs.python.org/3/library/bisect.html#bisect.insort

0
PierrotLeFou
 

L'énoncé dit:
"un dictionnaire associant à une longueur l la liste triée (dans l’ordre utf-8 croissant) des mots de longueur l"
Donc la clé est la longueur des mots. Pour chaque longueur, on a la "liste" des mots "triés"

On pourrait éviter les doublons en considérant la valeur comme un set et faire des add, puis reconvertir en liste à la fin avec sorted.

0