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 :

Comment extraire un mot avec une regex ?


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 31
    Points : 16
    Points
    16
    Par défaut Comment extraire un mot avec une regex ?
    Bonjour à tous,

    je voudrais utiliser des regex pour extraire l'attribut d'un mot. Par exemple :
    Paris is the capital of France = je veux extraire "capital"
    mais
    Paris is the big city in France = je veux extraire "city"

    J'ai commencé avec cette regex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    r"(is|was|were|are)\s[(a|the)]\s(\S*)"
    mais je suis bloqué. Je peux changer le group (après un compile et un search) mais ça ne marche pas de façon automatique. Comme dois-je m'y prendre ?

    Merci

  2. #2
    Membre averti Avatar de zancrows
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2016
    Messages : 155
    Points : 346
    Points
    346
    Par défaut
    Bonjour,

    du code pourrait aider à la compréhension, car la votre explication n'est pas très claire.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    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
    from parsy import Parsy
    import sys
    import re
     
    comp_reg = re.compile(r"(is|was|were|are|mean|means|will be|to be|can be)\s[(a|the|an|The)]\s(\S*)")
     
     
    if len(sys.argv) != 3:
        print(__doc__)
        sys.exit(-1)
     
    def extractType(page):
        m = comp_reg.search(page.content)
        if m:
            return m.group(2)
        else:
            return None
     
    with open(sys.argv[2], 'w', encoding="utf-8") as output:
        for page in Parsy(sys.argv[1]):
            typ = extractType(page)
            if typ:
                output.write(page.title + "\t" + typ + "\n")
    page.content est une phrase. Par exemple :
    Toronto is the largest city in Canada. --> je veux extraire city
    Albert Einstein was a scientist. --> je veux extraire scientist

    avec uniquement une regex

  4. #4
    Membre averti Avatar de zancrows
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2016
    Messages : 155
    Points : 346
    Points
    346
    Par défaut
    C'est tout le code ?

    car si c'est le cas il y a plusieurs problèmes, l'indentation des conditions n'est pas bonne, et les return hors fonctions etc...
    mais comme page.content n'est pas défini je suppose qu'il y a plus de code que ça, sans un code fonctionnel difficile de tester sois même.
    Vous voulez dire quoi par automatique ?
    sinon ce site https://regex101.com/ peut vous aider à créer un regex

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    Pardon, j'ai mis à jour le code.
    page.content est une phrase (le content de page) et page.title le titre de page.

  6. #6
    Membre averti Avatar de zancrows
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2016
    Messages : 155
    Points : 346
    Points
    346
    Par défaut
    je sais pas si ça peut t'aider, j'ai modifié un peu ton code

    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
    # from parsy import Parsy
    import sys
    import re
     
    comp_reg = re.compile(r"(is|was|were|are|mean|means|will be|to be|can be)\s[(a|the|an|The)]\s(\S*)")
     
     
    # if len(sys.argv) != 3:
        # print(__doc__)
        # sys.exit(-1)
     
    page = ["Toronto is the largest city in Canada.", 
            "Albert Einstein was a scientist.", 
            "Paris is the capital of France",
            "Paris is the big city in France"]
     
    def extractType(page):
        m = comp_reg.search(page)
        if m:
            return m.group(2)
        else:
            return None
     
     
    for i, str in enumerate(page):
        print(extractType(str))
    résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    None
    scientist.
    None
    None

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    Merci. Le but est de modifier la regex de telle façon à avoir à la fin :
    city
    scientist
    capital
    city

  8. #8
    Membre averti Avatar de zancrows
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2016
    Messages : 155
    Points : 346
    Points
    346
    Par défaut
    je peux te proposer cette solution rapide à toi de voir si cela te convient et d'adapter avec tes données et ton code
    (c'est trois fois la même regex ici )
    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
    29
    30
    # coding: utf-8
    # python 3.6.4 x86_64
     
    import sys
    import re
     
     
    l_regex = [re.compile(r"(is|was|were|are|mean|means|will be|to be|can be)\s[(a|the|an|The|in)]\s(\S*)"),
            re.compile(r"(is|was|were|are|mean|means|will be|to be|can be)\s[(a|the|an|The)]\s(\S*)"),
            re.compile(r"(is|was|were|are|mean|means|will be|to be|can be)\s[(a|the|an|The)]\s(\S*)")
    ]
     
    page = ["Toronto is the largest city in Canada.", 
            "Albert Einstein was a scientist.", 
            "Paris is the capital of France.",
            "Paris is the big city in France."]
     
    def extractType(page, regex, ln=len(regex)):
        if(ln == 0):
            return None
        i = ln - 1
        m = regex[i].search(page)
        if m:
            return m.group(2)
        else:
            return extractType(page, regex, ln=i)
     
     
    for i, str in enumerate(page):
        print(extractType(str, l_regex))

  9. #9
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    Citation Envoyé par Naunau75 Voir le message
    je voudrais utiliser des regex pour extraire l'attribut d'un mot. Par exemple :
    Paris is the capital of France = je veux extraire "capital"
    donc ce que tu veux extraire ce n'est pas l'attribut, c'est le sujet

    ce que tu cherches à faire n'a en fait aucun sens; sur quoi on se base pour établir une telle regex ? on met dans les parenthèses la totalité des formes conjuguées possibles et imaginables ?
    si on a la phrase "the biggest city of France is known to be Paris" la regex tombe à l'eau ?

    une solution plus appropriée -en l'absence d'indications plus précises- serait d'effectuer un étiquetage de chaque mot dans la phrase, et récupérer le nom
    avec le module nltk par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> import nltk
    >>> page = ['Toronto is the largest city in Canada.', 'Albert Einstein was a scientist.', 'Paris is the capital of France', 'Paris is the big city in France']
    >>> [[word[0] for word in nltk.pos_tag(nltk.word_tokenize(phrase)) if word[1] == 'NN'][0] for phrase in page]
    ['city', 'scientist', 'capital', 'city']

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    Merci. J'avais pensé à nltk mais pensais que je pouvais me débrouiller sans ...
    J'ai un souci quand il y a pas de NN dans la phrase. Voici mon code mais ça ne marche pas :

    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
    from parsy import Parsy
    import sys
    import re
    import nltk
     
     
    if len(sys.argv) != 3:
        print(__doc__)
        sys.exit(-1)
     
    def extractType(page):
        bibi = [word[0] if word[1] == 'NN' else None for word in nltk.pos_tag(nltk.word_tokenize(page.content))]
        return list(filter(None.__ne__, bibi))[0]
     
    with open(sys.argv[2], 'w', encoding="utf-8") as output:
        for page in Parsy(sys.argv[1]):
            typ = extractType(page)
            if typ:
                output.write(page.title + "\t" + typ + "\n")

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return [word[0] for word in nltk.pos_tag(nltk.word_tokenize(page.content)) if (word[1] == 'NN' or word[1] == 'NNS')][0]
    avec la liste de compréhension, je cherche les NN et les NNS mais si y en a pas dans la phrase, je voudrais renvoyer None. Mais comment faire avec une liste de compréhension ?
    Merci

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Naunau75 Voir le message
    [CODE]Mais comment faire avec une liste de compréhension ?
    La list-comprehension fabrique une liste, si elle est vide l'accès au premier élément [0] plantera en IndexError.
    Et pour éviter çà, il suffit de séparer construction de la liste et cet accès pour vérifier qu'elle n'est pas vide.

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

Discussions similaires

  1. [Débutant] Comment extraire un mot d'une chaîne ? c++ builder starter
    Par magdani dans le forum C++Builder
    Réponses: 9
    Dernier message: 15/06/2018, 11h05
  2. Comment extraire du texte avec une regex
    Par bapi777 dans le forum Langage
    Réponses: 11
    Dernier message: 26/09/2016, 19h14
  3. [À télécharger] Comment extraire les mots d'une chaîne ?
    Par pottiez dans le forum Téléchargez
    Réponses: 0
    Dernier message: 09/11/2010, 17h38
  4. Réponses: 3
    Dernier message: 21/01/2009, 09h35
  5. Comment extraire des mots dans une phrase (chaine de characteres)
    Par gilles06 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 09/07/2008, 18h54

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