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)
6 réponses
on peut utiliser Stanford Parser de NLTK.
exigences
vous devez télécharger deux choses à partir de leur site web:
- The Stanford CoreNLP parser .
- 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.
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.
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.
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/
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.
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 .