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 :

Analyse de texte "Mots doubles "


Sujet :

Python

  1. #21
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 30
    Par défaut
    Bonjour Fred,

    J'ai continué mon code sur l'analyse de texte.

    J'ai réussi à faire une liste des mots doubles qui ont moins de 3 lettres.
    Après j'ai utiliser la fonction "finditer" pour trouver l'emplacement de ces mots dans le texte.

    Cependant je n'arrive pas à " automatiser " pour tous les mots . Il faut que je rentre a chaque fois le mot dans la fonction finditer.
    Je voulais faire une sorte de boucle pour le faire pour chaque mots double..

    Aurais-tu une idée ?

    Voici ci joint en screen mon code

    Merci d'avance!
    Images attachées Images attachées   

  2. #22
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 825
    Par défaut
    Bonjour,

    Après j'ai utiliser la fonction "finditer" pour trouver l'emplacement de ces mots dans le texte.
    Emplacement est une information "globale", ce qui veut dire qu'il nous faut des informations plus précises sur les critères dont tu as besoin pour définir "emplacement".

    Sous quelle forme devra être mise cette information ?

    Je ne pense pas que cette fonction fasse ce que tu souhaites

    -------------------------------------------------------

    La fonction remove est inutile, il est préférable d'y ajouter une condition, on y gagne en temps ! Car remove itère sur la liste, teste chaque mot et s'il le trouve, le supprime !

  3. #23
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 30
    Par défaut
    Mon objectif, est de regarder si, derrière ces mots doubles, la chaîne de caractère continue à être commune. L'idée est de trouver les plus longues chaînes de caractères qui se répètent.

  4. #24
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 825
    Par défaut
    Je n'ai plus souvenir si je l'avais dis ou pas, mais pour trier les chaînes les plus longues, tu peux utiliser la fonction sorted.

    Mon objectif, est de regarder si, derrière ces mots doubles, la chaîne de caractère continue à être commune. L'idée est de trouver les plus longues chaînes de caractères qui se répètent.
    • Mais je ne vois pas le rapport concernant ma question sur le terme "emplacement" et l'utilisation de finditer. On crée un itérateur sur les matchs d'un pattern dans un texte, ce qui ne correspond pas à ce que tu cherches.

  5. #25
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 30
    Par défaut
    Oui pour le sorted() tu m'en avais parlé.

    Mon soucis maintenant est de trouver les plus longues chaînes de caractères qui se répètent ,derrière ces mots doubles... Je ne vois pas trop comment faire.

    En fait quand je parlai d'emplacement je pensais 'position' dans le texte. Et c’était un autre problème auquel je pensais, en voulant trouver combien de chaîne de caractère il y a entre les mots doubles avec par exemple le mots double 'lettre' et pareil avec un autre mots double. Pour ainsi trouver quel était la plus longue chaîne de caractère entre les mots doubles trouvé.
    C'est pour ca que j'utilise la fonction finditer. ( Il ne fait que un mots par un mots)

    Je ne sais pas si je suis très claire , mais c'est pas facile d'expliquer a l'écrit !

  6. #26
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 825
    Par défaut
    Pour sorted voici un exemple,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> examples = ['test', 'example', 'etc']
    >>> sorted(examples, key=len, reverse=True)
    ['example', 'test', 'etc']
    On trie les mots dans la liste examples selon leur nombre de caractères, et du plus long au moins long.

  7. #27
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 30
    Par défaut
    Super , merci Fred ! Cela va m'aider dans mon programme !

    Il y a un autre truc que j'aimerai faire , mais j'ai pas trouvé encore comment faire ...

    Dans la fonction finditer il faut écrire le mot qu'on souhaite pour trouvé sa position dans le texte. Seulement j'ai moi une liste de mots( ici mots doubles) que je recherche dans le texte.
    Je ne trouve pas une manière pour que la fonction trouve plusieurs mots à la fois. ##findword=re.finditer('lettre',line)## avec plusieurs mots comme ici " lettre"

    As-tu une idée ?

    Merci d'avance,

  8. #28
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 825
    Par défaut
    Bah j'utiliserai plutôt la méthode index ou find des strings python.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while True:    
        ind = texte.find('machaine')
        if ind == -1:
            break
        print(ind)
        texte = texte[ind:]
    Non testé ! texte est le résultat de la méthode read des fichiers. Pour trouver les positions c'est ce que je trouve le plus pratique... finditer je ne connais pas trop toute façon.

  9. #29
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 30
    Par défaut
    Merci Fred,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ind = fichier.re.find("pour,une,qui,lettre,lui")
    J'écris comme ceux-ci ou comme ça : 'pour','une','qui','lettre','lui'

    Deuxièmement j'ai l'impression que Python ne reconnait pas find ..

    Pourrais tu m'aiguiller sur ces deux petits soucis ?

    Merci d'avance,

  10. #30
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 825
    Par défaut
    Non non, tu n'as pas lu ce que j'ai écris plus haut

    On utilisera la méthode find après avoir read le fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    with open('...', 'r') as f:
        texte = f.read()
        while True:
            # suite du code

  11. #31
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 30
    Par défaut
    Ahhh oui mince !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ind = texte.find('lettre', 'lui', 'pour')
    Voici ce que Python sort ...

    TypeError: slice indices must be integers or None or have an __index__ method

  12. #32
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 825
    Par défaut


    Tu as lu mes messages précédents où je mets le lien de la méthode find ? Je ne crois pas que cette méthode prenne plusieurs éléments de type string ...

  13. #33
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Salut.

    Citation Envoyé par VincentB29 Voir le message
    Voici ce que Python sort ...

    TypeError: slice indices must be integers or None or have an __index__ method
    Il faudrait tout de même un peu chercher ce que str.find accepte comme arguments, pour cela on ouvre un interpréteur python et on tape help(str.find), et voilà c'est magique on a le synopsis de cette méthode

  14. #34
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 30
    Par défaut
    Mon objectif est de faire pour une liste de mots et non un par un .( pour trouver la position )

    Je ne vois pas trop comment je pourrais donc faire avec la méthode .find()

  15. #35
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 30
    Par défaut
    Fred, Penses tu qu'il est possible de le faire pour plusieurs mots à la fois avec la fonction .find() , ou dois je le faire mots par mots ?

  16. #36
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Salut.

    Le plus simple est tout de même d'utiliser une simple expression régulière.

    Je ne suis pas certain d'avoir saisi ce que tu veux faire, mais d'après ce que j'ai compris, c'est compter le nombre de mots présents entre 2 occurences d'un même mot, bon l'objectif reste complètement flou pour moi.

    Admettons.

    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
    from collections import Counter
    import re
    '''
    with open('Le Diable au Corps.txt') as f:
        txt = f.read()
    '''
    txt = '''Le Diable au Corps
     
    Je vais encourir bien des reproches. Mais qu’y puis-je ? Est-ce ma faute si j’eus douze ans quelques mois avant la déclaration de la guerre ? Sans doute, les troubles qui me vinrent de cette période extraordinaire furent d’une sorte qu’on n’éprouve jamais à cet âge ; mais comme il n’existe rien d’assez fort pour nous vieillir malgré les apparences, c’est en enfant que je devais me conduire dans une aventure où déjà un homme eût éprouvé de l’embarras. Je ne suis pas le seul. Et mes camarades garderont de cette époque un souvenir qui n’est pas celui de leurs aînés. Que ceux qui déjà m’en veulent se représentent ce que fut la guerre pour tant de très jeunes garçons : quatre ans de grandes vacances.
    Nous habitions à F…, au bord de la Marne.
    Mes parents condamnaient plutôt la camaraderie mixte. La sensualité, qui naît avec nous et se manifeste encore aveugle, y gagna au lieu d’y perdre.
    Je n’ai jamais été un rêveur. Ce qui semble rêve aux autres, plus crédules, me paraissait à moi aussi réel que le fromage au chat, malgré la cloche de verre. Pourtant la cloche existe.
    La cloche se cassant, le chat en profite, même si ce sont ses maîtres qui la cassent et s’y coupent les mains.
    Jusqu’à douze ans, je ne me vois aucune amourette, sauf pour une petite fille, nommée Carmen, à qui je fis tenir, par un gamin plus jeune que moi, une lettre dans laquelle je lui exprimais mon amour. Je m’autorisais de cet amour pour solliciter un rendez-vous. Ma lettre lui avait été remise le matin avant qu’elle ne se rendît en classe. J’avais distingué la seule fillette qui me ressemblât, parce qu’elle était propre, et allait à l’école
    '''
    # Éclatement de la chaîne
    mots = re.split('[.,;?!…’\s]+', txt) # Apostrophe de traitement de texte !
    #print(mots)
    # Construction du dict des occurences
    occurences = {k:v for (k, v) in Counter(mots).items() if len(k) > 2 and v > 2}
    #print(occurences)
    exp = '\\b(%s)\\b' % '|'.join(occurences)
    #print(exp)
    pos_mots = {}
    for r in re.finditer(exp, txt):
        pos_mots.setdefault(r[1], []).append(r.span())
    print(pos_mots)
    print('"%s"' % txt[108:111])
    Voilà, c'est simple, on a un dictionnaire ayant pour clés les mots présents plusieurs fois, maintenant à toi de compléter pour récupérer les chaînes du texte comprises entre ces mots et faire un re.split identique au premier pour les compter, par ex. pour le mot "ans" il devra y avoir 2 listes de mots.
    Mais perso que je ne comprends pas à quoi cela peut servir
    D'autant que : Est-ce que par ex. le mot "qu’elle" est considéré comme un seul mot ou 2, si 2 alors qu' devrait se transformer en que, bref c'est plus compliqué que ça n'y paraît, et d'après moi y a beaucoup de cas par cas à gérer.

  17. #37
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 30
    Par défaut
    Salut Bistouille !

    Merci pour l'aide , effectivement c'est une autre manière de faire .. Peut être que je me suis compliqué la tache ! ^^

    Que veut dire cette ligne exp = '\\b(%s)\\b' % '|'.join(occurences) ?

    J'aimerai savoir combien il y a de caractère entre chaque mots double , as tu une idée ? Pour chaque mots doubles , maintenant que j'ai leurs position dans le texte ...

  18. #38
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par VincentB29 Voir le message
    Que veut dire cette ligne ? exp = '\\b(%s)\\b' % '|'.join(occurences)
    Le \b est ce qu'on appelle un caractère de non mot, voir la doc, mais comme stipulé, cela est en relation avec les locales user, donc a utiliser avec précautions., le join je suppose que tu sais ce que ça fait.

    Citation Envoyé par VincentB29 Voir le message
    J'aimerai savoir combien il y a de caractère entre chaque mots double , as tu une idée ? Pour chaque mots doubles , maintenant que j'ai leurs position dans le texte ...
    Et bien si tu as les positions des mots, il suffit de faire de bêtes soustractions, position début mot suivant - position fin mot précédent, le tout à faire dans une boucle.

  19. #39
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 333
    Par défaut encoding
    Bonjour Vincent,
    Votre discussion est ludique, le code proposé par Fred est fonctionnel. Je suis aussi débutant et les suggestions de Fred améliore mon expérience.

    votre échange du 09/02/2019, 12h45
    une modification s'impose pour un résultat sans erreur
    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
    from collections import defaultdict, Counter
    from string import punctuation 
     
    def insert_dict(d, word, limit=2):
        if len(word) > limit:
            d[word] += 1 
     
    def parse(line):
        s = line[:].rstrip('\n')
        translator=str.maketrans('','', punctuation)
        s = s.translate(translator) # del punctuation
        return s.strip() 
     
    def display_words(d, n=2):
        for word in d:
            if d[word] == n:
                print(word) 
     
    if __name__ == "__main__":
        punctuation = punctuation.replace("'", '') # remove character simple quote of filter
        d = defaultdict(int)
        with open('test.txt', encoding='utf8') as f:
            for line in f:
                line = parse(line)
                for word in line.split():
                    insert_dict(d, word, 2)
     
        display_words(d, 2)
    remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    with open('test.txt', encoding='utf8') as f:
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    with open('Le Diable au Corps.txt', encoding='windows-1252') as f:

  20. #40
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 30
    Par défaut
    Bonjour,

    AlainB j'avais déjà commencé mon code, et je voulais continuer à mon niveau ( le code que m'a proposé Fred n'est pas facile pour moi, dans la compréhension de toutes les fonctions utilisées)



    Je ne comprends pas bien ces quelques lignes.
    positionmots n'est pas une liste mais un dictionnaire, je n'arrive pas bien à manipuler les objets à l'intérieur de celui-ci ..
    La position des mots etc

    Est-ce que quelqu'un pourrait m'éclairer ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    exp = '\\b(%s)\\b' % '|'.join(v)
    positionmots = {}
    for r in re.finditer(exp, texte):
        positionmots.setdefault(r[1], []).append(r.span())
    print(positionmots)

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Texte défilant avec double buffering
    Par trinie dans le forum 2D
    Réponses: 2
    Dernier message: 28/04/2006, 16h06
  2. [HTML] remplissage de ma zone de texte par mot composé?
    Par zorba49 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 07/09/2005, 17h59

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