Extraire les mots d'un texte comportant de la ponctuation

Fermé
okchf Messages postés 8 Date d'inscription jeudi 3 novembre 2022 Statut Membre Dernière intervention 18 novembre 2022 - Modifié le 8 nov. 2022 à 14:57
mamiemando Messages postés 33318 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 15 octobre 2024 - 10 nov. 2022 à 11:02

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 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 090
Modifié le 8 nov. 2022 à 14:43

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 33318 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 15 octobre 2024 7 797
8 nov. 2022 à 14:56

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 33318 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 15 octobre 2024
8 nov. 2022 à 15:28

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
8 nov. 2022 à 16:21

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

0
mamiemando Messages postés 33318 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 15 octobre 2024 7 797 > Diablo76
Modifié le 8 nov. 2022 à 16:29

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 33318 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 15 octobre 2024
9 nov. 2022 à 04:28

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

0

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 jeudi 3 novembre 2022 Statut Membre Dernière intervention 18 novembre 2022
Modifié le 8 nov. 2022 à 19:06

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
8 nov. 2022 à 18:52

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 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 090
Modifié le 8 nov. 2022 à 19:23

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

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