Comment puis-je effectuer l'analyse de dépendance à NLTK?

en parcourant le livre NLTK, on ne voit pas très bien comment générer un arbre de dépendance à partir d'une phrase donnée.

la section pertinente du livre: sous-chapitre sur la grammaire de la dépendance donne un exemple de figure mais il ne montre pas comment analyser une phrase pour trouver ces relations - ou peut-être que je manque quelque chose de fondamental dans la NLP?

EDIT: Je veux quelque chose similaire à ce que le Stanford parser fait: Avec une phrase "j'ai tiré sur un éléphant dans mon sommeil", il devrait retourner quelque chose comme:

nsubj(shot-2, I-1)
det(elephant-4, an-3)
dobj(shot-2, elephant-4)
prep(shot-2, in-5)
poss(sleep-7, my-6)
pobj(in-5, sleep-7)
25
demandé sur Pierre 2011-09-16 14:26:49

6 réponses

on peut utiliser Stanford Parser de NLTK.

exigences

vous devez télécharger deux choses à partir de leur site web:

  1. The Stanford CoreNLP parser .
  2. modèle de Langage pour la langue de votre choix (par exemple de la langue anglaise modèle )

attention!

assurez-vous que votre version de modèle de langue correspond à votre version de Stanford CoreNLP parser!

la version actuelle de CoreNLP en date du 22 mai 2018 est 3.9.1.

après avoir téléchargé les deux fichiers, extraire le fichier zip où vous le souhaitez.

Code Python

ensuite, charger le modèle et l'utiliser par nltk

from nltk.parse.stanford import StanfordDependencyParser

path_to_jar = 'path_to/stanford-parser-full-2014-08-27/stanford-parser.jar'
path_to_models_jar = 'path_to/stanford-parser-full-2014-08-27/stanford-parser-3.4.1-models.jar'

dependency_parser = StanfordDependencyParser(path_to_jar=path_to_jar, path_to_models_jar=path_to_models_jar)

result = dependency_parser.raw_parse('I shot an elephant in my sleep')
dep = result.next()

list(dep.triples())

sortie

la sortie du dernier la ligne est:

[((u'shot', u'VBD'), u'nsubj', (u'I', u'PRP')),
 ((u'shot', u'VBD'), u'dobj', (u'elephant', u'NN')),
 ((u'elephant', u'NN'), u'det', (u'an', u'DT')),
 ((u'shot', u'VBD'), u'prep', (u'in', u'IN')),
 ((u'in', u'IN'), u'pobj', (u'sleep', u'NN')),
 ((u'sleep', u'NN'), u'poss', (u'my', u'PRP$'))]

je pense que c'est ce que vous voulez.

67
répondu ywat 2018-05-22 10:38:57

je pense que vous pourriez utiliser un analyseur de dépendances basé sur le corpus au lieu de celui basé sur la grammaire fourni par NLTK.

faire un test de dépendance basé sur le corpus en analysant une quantité minime de texte en Python n'est pas idéal du point de vue de la performance. Ainsi, en NLTK, ils fournissent un wrapper à MaltParser , un analyseur de dépendances basé sur le corpus.

vous pourriez trouver cette autre question sur représentation RDF de phrases pertinentes.

7
répondu Neodawn 2017-05-23 11:54:48

si vous avez besoin d'une meilleure performance, alors spacy ( https://spacy.io / ) est le meilleur choix. L'Usage est très simple:

import spacy

nlp = spacy.load('en')
sents = nlp(u'A woman is walking through the door.')

vous obtiendrez un arbre de dépendances en sortie, et vous pouvez extraire très facilement toutes les informations dont vous avez besoin. Vous pouvez également définir vos propres conduites. En voir plus sur leur site web.

https://spacy.io/docs/usage /

5
répondu Aleksandar Jovanovic 2018-05-10 19:56:14

si vous voulez être sérieux au sujet de l'analyse de dépendance n'utilisez pas le NLTK, tous les algorithmes sont datés, et lents. Essayez quelque chose comme ceci: https://spacy.io/

3
répondu CpILL 2016-02-19 01:11:57

de la Documentation de Stanford Parser: "les dépendances peuvent être obtenues en utilisant notre logiciel [...] sur les arbres de syntagme-structure en utilisant la classe English Grammaticalstructure disponible dans le paquet parser." http://nlp.stanford.edu/software/stanford-dependencies.shtml

le manuel des dépendances mentionne aussi: "ou notre outil de conversion peut convertir les résultats des analyses des autres circonscriptions à la représentation des dépendances de Stanford." http://nlp.stanford.edu/software/dependencies_manual.pdf

ni l'une ni l'autre de ces fonctionnalités ne semblent être implémentées dans NLTK à l'heure actuelle.

1
répondu Josep Valls 2013-07-24 22:51:13

Pour utiliser le Stanford Parser de NLTK

1) Run CoreNLP Server at localhost

Télécharger Stanford CoreNLP ici (et aussi fichier modèle pour votre langue). Le serveur peut être démarré en exécutant la commande suivante (plus de détails ici )

# Run the server using all jars in the current directory (e.g., the CoreNLP home directory)
java -mx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer -port 9000 -timeout 15000

ou par NLTK API (besoin de configurer le CORENLP_HOME variable d'environnement premier)

os.environ["CORENLP_HOME"] = "dir"
client = corenlp.CoreNLPClient()
# do something
client.stop()

2) appeler l'analyseur de dépendances de nltk

>>> from nltk.parse.corenlp import CoreNLPDependencyParser
>>> dep_parser = CoreNLPDependencyParser(url='http://localhost:9000')
>>> parse, = dep_parser.raw_parse(
...     'The quick brown fox jumps over the lazy dog.'
... )
>>> print(parse.to_conll(4))  
The     DT      4       det
quick   JJ      4       amod
brown   JJ      4       amod
fox     NN      5       nsubj
jumps   VBZ     0       ROOT
over    IN      9       case
the     DT      9       det
lazy    JJ      9       amod
dog     NN      5       nmod
.       .       5       punct

Voir détail documentation ici , aussi cette question NLTK CoreNLPDependencyParser: échec d'établir la connexion .

1
répondu dontloo 2018-08-09 04:22:34