Contexte

Je voudrais savoir comment séparer les noms et leurs décorations, comme les articles et les cas possessifs.

Exemple

#sentence
The man with the star regarded her with his expressionless eyes.


# what to extract 
man
star
eyes

Problème

Comme l'image ci-dessous créée à l'aide de l'outil disPlacy, "L'homme, l'étoile et ses yeux sans expression" sont unis en tant que NOM.

Le visualiseur d'une partie du discours et des dépendances

https://explosion.ai/demos/displacy

the result of the sample sentence

Ce que j'ai essayé

J'ai exécuté l'exemple de code présenté sur la page spaCy.

import spacy

nlp = spacy.load("en_core_web_sm")
doc = nlp("The man with the star regarded her with his calm, expressionless eyes.")
for token in doc:
    print(token.text, token.dep_, token.head.text, token.head.pos_,
            [child for child in token.children])

En utilisant le résultat ci-dessous ou d'autres moyens, comment puis-je extraire les noms eux-mêmes en excluant leurs articles et leur cas possessif ?

$ python sample.py
The det man NOUN []
man nsubj regarded VERB [The, with]
with prep man NOUN [star]
the det star NOUN []
star pobj with ADP [the]
regarded ROOT regarded VERB [man, her, with, .]
her dobj regarded VERB []
with prep regarded VERB [eyes]
his poss eyes NOUN []
calm amod eyes NOUN [,]
, punct calm ADJ []
expressionless amod eyes NOUN []
eyes pobj with ADP [his, calm, expressionless]
. punct regarded VERB []
2
NPP 7 oct. 2020 à 11:55

1 réponse

Meilleure réponse

Essayez quelque chose comme ceci pour obtenir le résultat souhaité que vous fournissez dans votre exemple initial :

import spacy

nlp = spacy.load('en')

text = "The man with the star regarded her with his expressionless eyes."

for word in nlp(text):
  if word.pos_ == 'NOUN':
    print(word.text)

Sortie:

man
star
eyes

Vous pouvez également envisager d'utiliser le package nltk à la place, car il peut être plus rapide, pour ce cas d'utilisation :

import nltk

text = "The man with the star regarded her with his expressionless eyes."

for word, pos in nltk.pos_tag(nltk.word_tokenize(text)):
  if pos[0] == 'N':
    print(word)

Sortie:

man
star
eyes
2
Sash Sinha 7 oct. 2020 à 09:29