2
votes

Comment obtenir des phrases nominales à partir d'une liste de phrases en utilisant SpaCy

J'ai une liste de phrases qui doivent trouver les phrases nominales pour chaque phrase en utilisant SpaCy. Actuellement, les sorties ajoutent uniquement toutes les phrases nominales de toutes les phrases. Comment puis-je obtenir les phrases nominales de chaque phrase et les imprimer sous forme de liste de listes?

disons que nous avons deux éléments de phrases dans une liste -

[['I','boy'],['I','girl']]

Je m'attends à obtenir quelque chose comme ceci:

A = ["I am a boy", "I am a girl"]

A_np = []
for x in A:
    doc = nlp(x)
    for np in doc.noun_chunks:
        story_np.append(np.text)
A_np


5 commentaires

Voulez-vous dire SpaCy?


Merci pour vos commentaires. J'ai révisé l'erreur.


Avez-vous regardé stackoverflow.com/questions/48925328/... ?


C'est pertinent, mais pas ce à quoi je m'attendais. Merci


Et je peux obtenir une liste de phrases nominales pour une phrase. Mais, je m'attends à obtenir des phrases nominales pour un certain nombre de phrases dans une liste et une sortie sous forme de liste de listes, afin que je puisse obtenir le nombre de phrases nominales pour chaque liste.


3 Réponses :


2
votes

Vous devez faire deux improvisations:

1 / noun_chunks sont des travées, pas des jetons. Il vaut donc mieux parcourir les jetons individuels d'un morceau de nom.

2 / Vous devez avoir une liste intermédiaire pour stocker les morceaux de nom d'une seule phrase.

Code improvisé, vous pouvez ajuster selon vos besoins:

>>> A = ["I am a boy", "I am a girl"]
>>> nlp = spacy.load('en')
>>> A_np = []
>>> for x in A:
...     doc = nlp(x)
...     sent_nps = []
...     for np in doc.noun_chunks:
...             sent_nps.extend([token.text for token in np])
...     A_np.append(sent_nps)
...
>>> A_np
[['I', 'a', 'boy'], ['I', 'a', 'girl']]


0 commentaires

0
votes

Après avoir créé la liste de mots à partir des phrases et supprimé le bruit et les mots vides, en les ramenant tous aux mêmes cas, vous aurez un ensemble de mots laissés dans les données.

Ensuite, vous pouvez appeler la bibliothèque / p>

def filter_nouns(texts, tags=['NOUN']):
       output = []
       for x in texts:
             doc = nlp(" ".join(x)) 
             output.append([token.lemma_ for token in doc if token.pos_ in tags])
       return output

ou comme

nlp = spacy.load('en_core_web_sm', disable=['parser', 'ner'])

alors vous pouvez définir une fonction pour filtrer les mots du nom comme:

XXX

alors vous pouvez appliquer la fonction définie sur les données nettoyées

J'espère que cela s'avérera utile


0 commentaires

0
votes

Je le comprends en ajoutant une liste vide avant la deuxième boucle et en insérant des morceaux de doc dans le dernier élément de la liste vide. Ces deux boucles continueront à formuler des phrases nominales et à insérer les phrases nominales traitées.

A = ["I am a boy", "I am a girl"]

A_np = []
    for x in A:
        doc = nlp(x)
        A_np.append([])
        for np in doc.noun_chunks:
            story_np[-1].append(np.text)
A_np


0 commentaires