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 :

Compter les mots, même les composés


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Femme Profil pro
    Etudiante en linguistique
    Inscrit en
    Août 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Etudiante en linguistique

    Informations forums :
    Inscription : Août 2013
    Messages : 3
    Par défaut Compter les mots, même les composés
    Bonjour, je suis nouvelle sur le forum, et linguiste, et je fais du python depuis deux ans (je ne connais pas encore bien l'objet). Je suis actuellement en stage, et pour les besoins du programme que j'essaie de réaliser, j'ai besoin de compter les mots de chaque ligne d'un fichier. Mais je ne lis pas un fichier qui ne contient que des mots: il y a du bruit qui vient de balises html, même si j'en ai supprimé une grosse partie.
    J'ai besoin de savoir si ma ligne contient bien des vrais mots, et si oui, combien;
    Le problème auquel je suis confrontée vient des mots composés, mais seulement ceux avec deux tirets, par exemple: "c'est-à-dire", qui est compté comme un seul mot, à cause du "c'" et moi j'en veux deux.

    Je réussis à compter tous les autres mots, en parcourant ma ligne, que je découpe comme ça:
    re.split(" |'") et avec quelques instructions pour définir si le mot est bien composé d'une suite de caractères alphanumériques (oui parce que je dois compter "9" comme un mot), et ensuite je fais un search avec cette expression régulière :
    "[A-Za-z][a-z]+-[a-z]+" pour trouver les mots composés. Mais pour "c'est-à-dire", ça ne fonctionne pas. J'ai essayé cette expression:
    "[A-Za-z][a-z]+-[a-z]+-[a-z]+" mais ça me compte toujours un seul mot.

    Je me demandais si quelqu'un voit une erreur dans l'expression régulière?
    Ou si il y a une autre solution...
    On m'a proposé une fonction qui utilise NLTK :

    http://stackoverflow.com/questions/5...-an-input-file

    Mais ça me paraît compliqué et j'aurais aimé éviter d'utiliser une bibliothèque externe... Enfin, je ne sais pas trop mais j'ai peur que ce soit trop lourd, parce que j'utilise déjà une autre bibliothèque externe dans la suite de mon programme.

    Je vous remercie d'avance si vous pouvez m'aider.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,
    L'URL mentionnée propose des solutions avec ou sans NLTK pour réaliser un algo. qui va bien au delà de ce que vous décrivez.
    De façon très approximative, les mots d'une phrase pas trop mal écrite sont délimites par un caractère d'espacement.
    D'une /phrase/, on obtiendra une liste de /mots/.

    Si on se contente de définir un mot compose par mot qui contient des tirets, pourquoi faire plus complique que le test /'-' in mot/?
    Si vous voulez décomposer le mot: mot.split('-') devrait suffire.

    Désole si cela ne répond pas a vos questions mais votre truc n'est pas très clair.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Etudiante en linguistique
    Inscrit en
    Août 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Etudiante en linguistique

    Informations forums :
    Inscription : Août 2013
    Messages : 3
    Par défaut Réponse
    Tout d'abord, merci beaucoup de votre réponse.

    Mais le problème, c'est que j'ai parmi mes mots des suites de caractères qui contiennent des tirets, mais qui ne sont pas des mots. (par exemple "-->")
    alors si je teste juste s'il y a un tiret, ça ne va pas.
    De plus, mes mots ne sont pas toujours séparés par des espaces :
    (par exemple "l'écrevisse") et ils ne sont pas exclusivement constitués de caractères alphanumériques, (par exemple: "sèche-linge" ou "fin.", ou encore "ensuite,")
    Je suis désolée, si je ne suis pas claire, mais pouvez-vous me dire ce que vous ne comprenez pas pour que j'essaie d'éclaircir mes explications?

    Sinon, je peux vous montrer le morceau de code que j'ai fait, ce sera peut-être plus clair?

  4. #4
    Membre Expert

    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
    Par défaut
    On pourrait utiliser les regex, comme ceci par exemple*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> re.findall(r"(?:(?<=\W)|^)((?:\w|(?<=\w)-(?=\w))+)(?=\W?)", "l’été<!--, c’est-à-dire l’estivale saison-->")
    ['l', 'été', 'c', 'est-à-dire', 'l', 'estivale', 'saison']
    \w désigne un caractère “lettre”, \W tout ce qui n’est pas \w. Quand aux (?<=foo) et (?=bar), ce sont des lookbehind/lookahead, ils vérifient que le caractère courant est bien précédé et/ou suivi des motifs spécifiés…

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Une page HTML est un document semi-structure contenant du texte (qui vous intéresse) et des tas d'information de formatage (qui ne vous intéressent peut être pas). Si vous étiez capable d'en extraire facilement le "texte", votre problème serait grandement simplifie: car plus de parasites a traiter...

    Comme vous n’êtes pas la première ni la seule a être intéressée par l'extraction du texte contenu dans une page Web, vous avez, a disposition des librairies telle que BeautifoulSoup qui font cela très bien: soup.get_text() retourne le texte de la page...

    Vous pourrez ensuite compter les mots ou la donner a manger a NLTK pour en sortir un ensemble de "tags" qui vous permettront de savoir qui, quand, ou quoi,...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Etudiante en linguistique
    Inscrit en
    Août 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Etudiante en linguistique

    Informations forums :
    Inscription : Août 2013
    Messages : 3
    Par défaut Merci!
    Je vous remercie de m'avoir répondu, j'ai essayé BeautifulSoup, mais ça ne marche pas du tout, alors je suis restée sur la regexp de Mont29, qui fonctionne... A part pour un cas : celui de "à", probablement pour une raison d'encodage... Donc j'ai fait une condition en plus:

    coupe = re.split(" |'",ligne)
    for w in coupe:
    find = re.findall(r"(?:(?<=\W)|^)((?:\w|(?<=\w)-(?=\w))+)(?=\W?)", w)
    find2 = re.findall(u"à", w)
    if find:
    nbr_mots += 1
    elif find2:
    nbr_mots += 1
    else:
    print "non compté:", w

    Le seul souci, c'est que ça me compte parfois des mots qui ne devraient pas... Mais comme ce sont des lignes qui ne contiennent pas de trucs qui m'intéressent, ça me va.
    Donc merci à tous ceux qui ont essayé de m'aider, grâce à vous je peux avancer dans mon projet. Encore MERCI!!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Compter les mot et les accents.
    Par defacta dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 04/03/2010, 22h20
  2. agscloud avec les mots clés les plus recherchés
    Par kadiato dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 18/02/2009, 18h14
  3. Souligner les mots dans les documents après une recherche
    Par Watier_53 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 27/06/2008, 10h50
  4. Cadre contenant les mots cles les plus recherchés
    Par jibs79 dans le forum Référencement
    Réponses: 4
    Dernier message: 04/04/2007, 11h17

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