Stanford Parser et NLTK
Est-il possible d'utiliser Stanford Parser en NLTK? (Je ne parle pas de Stanford POS.)
- Voir aussi: gist.github.com/alvations/e1df0ba227e542955a8a
- Ce lien doit être plus visible. Peut-être le sommet réponse devrait être modifié afin de le mentionner?
- Juste une note de côté ici les gars. Assurez-vous que Java est à jour pour Stanford PNL et JAVA_HOME est mis en place correctement. Parfois, les gens pourraient obtenir "bizarre" des erreurs qui pourraient être dues à cette.
- Pour NLTK v3.3, voir stackoverflow.com/a/51981566/610569
Vous devez vous connecter pour publier un commentaire.
Noter que cette réponse s'applique à NLTK v 3.0, et de ne pas les versions plus récentes.
Sûr, essayez les solutions suivantes dans Python:
De sortie:
Note 1:
Dans cet exemple, les deux analyseur & modèle pots sont dans le même dossier.
Note 2:
Note 3:
L'englishPCFG.ser.gz le fichier peut être trouvé à l'intérieur de l'models.jar fichier (/edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz). Veuillez utiliser venir gestionnaire d'archives pour décompresser l'models.jar fichier.
Note 4:
Assurez-vous que vous utilisez Java JRE (Runtime Environment) 1.8 aussi connu comme Oracle JDK 8. Autrement, vous obtiendrez: non pris en charge majeure.version mineure 52.0.
Installation
Télécharger NLTK v3 à partir de: https://github.com/nltk/nltk. Et installer NLTK:
sudo python setup.py installer
Vous pouvez utiliser le NLTK downloader pour obtenir Stanford Parser, à l'aide de Python:
Essayer mon exemple! (n'oubliez pas le changement du pot de chemins et de modifier le modèle de chemin d'accès à la ser.gz emplacement)
OU:
Télécharger et installer NLTK v3, comme ci-dessus.
Télécharger la dernière version de (version actuelle nom de fichier est stanford-parser-full-2015-01-29.zip):
http://nlp.stanford.edu/software/lex-parser.shtml#Download
Extrait de l'standford-parser-full-20xx-xx-xx.zip.
Créer un nouveau dossier (les pots de " dans mon exemple). Placer les fichiers extraits dans ce dossier jar: stanford-parser-3.x.x-models.jar et stanford-parser.jar.
Comme indiqué ci-dessus, vous pouvez utiliser les variables d'environnement (STANFORD_PARSER & STANFORD_MODELS) pour pointer vers cette 'pots' dossier. Je suis sous Linux, donc si vous utilisez Windows, veuillez utiliser quelque chose comme: C://folder//jars.
Ouvrir la stanford-parser-3.x.x-models.jar à l'aide d'un gestionnaire d'Archives (7zip).
Parcourir à l'intérieur du fichier jar; edu/stanford/pnl/modèles/lexparser. Encore une fois, extraire le fichier nommé 'englishPCFG.ser.gz'. Rappelez-vous l'emplacement où vous avez extrait de ce ser.gz fichier.
Lors de la création d'un StanfordParser exemple, vous pouvez fournir le modèle de chemin en tant que paramètre. C'est le chemin complet du modèle, dans notre cas /location/of/englishPCFG.ser.gz.
Essayer mon exemple! (n'oubliez pas le changement du pot de chemins et de modifier le modèle de chemin d'accès à la ser.gz emplacement)
nltk.parse.stanford
? Je n'ai quenltk.tag.stanford
dans NLTK2.0.4
.AttributeError: 'StanfordParser' object has no attribute 'raw_batch_parse'
raw_parse_sents()
draw
méthode? J'utilise la dernière version de NLTK, mais il ne semble pas avoir cette mise en œuvre. Connaissez-vous des alternatives?for line in sentences: for sentence in line: sentence.draw()
Vous ne pouvez exécuter draw() sur un objet de l'Arborescence 😉NLTK official 3rd party tools
de la documentation.STANFORDTOOLSDIR
être dansCLASSPATH
pour l'analyseur jarfiles et la parser_model jarfiles, par exempleexport CLASSPATH=$STANFORDTOOLSDIR/stanford-parser-full-2015-04-20/stanford-parser.jar:$STANFORDTOOLSDIR/stanford-parser-full-2015-04-20/stanford-parser-3.5.2-models.jar
Obsolète Réponse
La réponse ci-dessous est obsolète, veuillez utiliser la solution sur https://stackoverflow.com/a/51981566/610569 pour NLTK v3.3 et au-dessus.
ÉDITÉ
Remarque: La réponse suivante ne fonctionnera que sur:
À la fois comme outils de changements assez rapidement et l'API peut paraître très différents de 3 à 6 mois plus tard. Merci de traiter la réponse suivante temporelle et pas une éternelle correctif.
Toujours se référer à https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software pour la dernière instruction sur la façon d'interface Stanford PNL outils à l'aide de NLTK!!
TL;DR
Alors:
En Long:
Tout d'abord, il faut noter que Stanford PNL outils sont écrits en Java et NLTK est écrit en Python. La façon NLTK est à l'interface de l'outil est par l'appel de l'outil Java par le biais de l'interface de ligne de commande.
Deuxièmement, le
NLTK
API pour le Stanford des outils de TALN ont vraiment changé depuis la version 3.1. Il est donc conseillé de mettre à jour votre NLTK paquet v3.1.Troisièmement, le
NLTK
API Stanford, des Outils de TALN s'enroule autour de la personne des outils de TALN, par exemple Stanford POS tagger, Stanford NER Tagger, Stanford Parser.Pour le POS et le TNS tagger, il NE PAS s'enrouler autour de la Stanford de Base de la PNL paquet.
Pour le Stanford Parser, c'est un cas particulier où il s'enroule autour de la Stanford et l'Analyseur de Stanford de Base de la PNL (personnellement, je n'ai pas utilisé celui-ci en utilisant NLTK, je préfère suivre @dimazest démonstration sur http://www.eecs.qmul.ac.uk/~dm303/stanford-dependency-parser-nltk-and-anaconda.html )
Noter que NLTK v3.1, la
STANFORD_JAR
etSTANFORD_PARSER
variables est obsolète et N'est PLUS utiliséEn Plus:
ÉTAPE 1
En supposant que vous avez installé Java correctement sur votre système d'exploitation.
Maintenant, installer/mettre à jour votre NLTK version (voir http://www.nltk.org/install.html):
sudo pip install -U nltk
sudo apt-get install python-nltk
Pour Windows (Utiliser le binaire de 32 bits de l'installation):
(Pourquoi ne pas en 64 bits? Voir https://github.com/nltk/nltk/issues/1079)
Puis de la paranoïa, vérifiez votre
nltk
à l'intérieur de la version de python:Ou sur la ligne de commande:
Assurez-vous de voir
3.1
que la sortie.Pour encore plus de paranoïa, vérifiez que tous vos favori Stanford des outils de TALN API sont disponibles:
(Note: Les importations ci-dessus sera SEULEMENT assurez-vous d'utiliser un bon NLTK version qui contient ces Api. Ne pas voir les erreurs dans l'importation ne signifie pas que vous avez correctement configuré les NLTK API à utiliser le Stanford Outils)
ÉTAPE 2
Maintenant que vous avez vérifié que vous avez la bonne version de NLTK que contient le nécessaire Stanford PNL outils de l'interface. Vous devez télécharger et extraire tout le nécessaire Stanford des outils de TALN.
TL;DR, dans Unix:
Dans Windows /Mac:
ÉTAPE 3
Configurer les variables d'environnement telles que NLTK peut trouver le chemin d'accès au fichier automatiquement. Vous devez définir les variables suivantes:
Ajouter approprié Stanford PNL
.jar
fichier à laCLASSPATH
variable d'environnement.stanford-ner-2015-04-20/stanford-ner.jar
stanford-postagger-full-2015-04-20/stanford-postagger.jar
stanford-parser-full-2015-04-20/stanford-parser.jar
et le modèle d'analyseur de fichier jar,stanford-parser-full-2015-04-20/stanford-parser-3.5.2-models.jar
Ajouter le modèle approprié répertoire de la
STANFORD_MODELS
variable (c'est à dire le répertoire où vous pouvez trouver où la pré-formés modèles sont sauvegardés)stanford-ner-2015-04-20/classifiers/
stanford-postagger-full-2015-04-20/models/
Dans le code, voir ce qu'il recherche l'
STANFORD_MODELS
répertoire avant d'ajouter le nom du modèle. Voir que, l'API a également automatiquement essaie de rechercher les environnements d'OS pour la `CLASSPATH)Noter que NLTK v3.1, la
STANFORD_JAR
variables est obsolète et N'est PLUS utilisé. Des extraits de Code dans les Stackoverflow questions risquent de ne pas fonctionner:TL;DR pour l'ÉTAPE 3 sur Ubuntu
(Pour Windows: Voir https://stackoverflow.com/a/17176423/610569 pour les instructions de configuration des variables d'environnement)
Vous DOIT définir les variables comme ci-dessus avant de commencer python, puis:
Sinon, vous pouvez essayer d'ajouter les variables d'environnement à l'intérieur de python, comme les réponses précédentes ont suggéré, mais vous pouvez aussi directement dire l'analyseur/tagger pour initialiser le chemin direct où vous avez gardé le
.jar
fichier et vos modèles.Il n'est PAS nécessaire de définir les variables d'environnement si vous utilisez la méthode suivante MAIS lorsque l'API de ses changements de noms de paramètres, vous aurez besoin de changer en conséquence. C'est pourquoi il est PLUS judicieux de définir les variables d'environnement que de modifier votre code python pour répondre à la NLTK version.
Par exemple (sans définir toutes les variables d'environnement):
Obsolète Réponse
La réponse ci-dessous est obsolète, veuillez utiliser la solution sur https://stackoverflow.com/a/51981566/610569 pour NLTK v3.3 et au-dessus.
Édité
De l'Stanford parser (2015-04-20), la sortie par défaut de la
lexparser.sh
a modifié le script ci-dessous ne fonctionnera pas.Mais cette réponse est conservé pour l'héritage souci, il faudra encore travailler avec http://nlp.stanford.edu/software/stanford-parser-2012-11-12.zip bien.
Réponse Originale À Cette Question
Je vous suggère de ne pas jouer avec Jython, JPype. Laissez python n'python trucs et laissez java java, obtenir le Stanford Parser la sortie par le biais de la console.
Après que vous avez installé le Stanford Parser dans votre répertoire home
~/
, il suffit d'utiliser cette python recette pour obtenir le plat entre crochets analyser:len(i.strip()) > 0
sinon j'ai eu une erreur d'index. Je suppose que mon analyseur de sortie a au moins une ligne qui a été purement espaces.'
s, vous obtiendrez des erreurs étranges. Il y a solutions pour appeler les choses sur la ligne de commandeIl y a python interface pour le stanford parser
http://projects.csail.mit.edu/spatial/Stanford_Parser
La Stanford de Base de la PNL logiciel page présente une liste des wrappers python:
http://nlp.stanford.edu/software/corenlp.shtml#Extensions
Si je me souviens bien, le Stanford parser est une bibliothèque java, par conséquent, vous devez disposer d'un interprète de Java en cours d'exécution sur votre serveur/ordinateur.
Je l'ai utilisé une fois un serveur, combiné avec un script php. Le script php exec() de la fonction d'une commande de ligne de l'appel à l'analyseur de la sorte:
Je ne me souviens pas de tous les détails de cette commande, il a ouvert la fileToParse, analysé, et a écrit la sortie dans le resultFile. PHP serait alors d'ouvrir le fichier de résultat pour une utilisation ultérieure.
La fin de la commande indique à l'analyseur est détaillé à la valeur NULL, pour éviter de ligne de commande informations de déranger le script.
Je ne sais pas beaucoup sur Python, mais il y a peut-être un moyen de faire des appels de ligne de commande.
Il pourrait ne pas être l'itinéraire exact que vous avez été, mais j'espère que ça va vous donner un peu d'inspiration. Le meilleur de la chance.
Noter que cette réponse s'applique à NLTK v 3.0, et de ne pas les versions plus récentes.
Ici est une adaptation de danger98 du code qui fonctionne avec nltk3.0.0 sur windoze, et sans doute les autres plates-formes ainsi, adapter les noms de répertoire en fonction de votre configuration:
Noter que le traitement de la commande a changé (voir le code source à la http://www.nltk.org/_modules/nltk/parse/stanford.html), et que vous avez besoin de définir la JAVAHOME variable. J'ai essayé de le faire lire le fichier de grammaire in situ dans le pot, mais ont jusqu'à présent échoué à le faire.
Vous pouvez utiliser le Stanford Analyseurs de sortie pour créer un Arbre dans nltk (nltk.d'arbre en arbre.De l'arbre).
En supposant que le stanford parser vous donne un fichier dans lequel il y a exactement un arbre d'analyse pour chaque phrase.
Alors que cet exemple fonctionne, même si cela peut sembler très pythonic:
Je suis sur une machine windows, et vous pouvez simplement utiliser l'analyseur normalement comme vous le faites à partir de la commande de ce type, mais comme dans un répertoire différent de sorte que vous n'avez pas besoin de modifier le lexparser.le fichier bat. Il suffit de mettre dans le chemin d'accès complet.
La partie la plus délicate pour moi a été de réaliser comment faire pour exécuter un programme java à partir d'un chemin d'accès différent. Il doit y avoir une meilleure façon, mais cela fonctionne.
Noter que cette réponse s'applique à NLTK v 3.0, et de ne pas les versions plus récentes.
Une légère mise à jour (ou tout simplement de rechange) sur danger89 globale de réponse sur l'utilisation de Stanford Parser en NLTK et Python
Avec stanford parser-plein-2015-04-20, JRE 1,8 et nltk 3.0.4 (python 2.7.6), il semble que vous n'avez plus besoin d'extraire le englishPCFG.ser.gz à partir de stanford-parser-x.x.x-models.jar ou la mise en place de n'importe quel os.environ
Noter que cette réponse s'applique à NLTK v 3.0, et de ne pas les versions plus récentes.
Ici est la version windows de alvas la réponse de
NOTES:
Dans
lexparser.bat
vous avez besoin de changer tous les chemins en chemin absolu pour éviter la java des erreurs telles que "la classe n'est pas trouvé"Je vous recommande vivement d'appliquer cette méthode sous windows depuis que j'ai Essayé plusieurs réponses sur la page et toutes les méthodes communique python avec Java échoue.
souhait de vous entendre si vous réussissez sur windows et souhaitez vous pouvez me dire comment vous surmonter tous ces problèmes.
de recherche wrapper python pour stanford coreNLP pour obtenir la version de python
Noter que cette réponse s'applique à NLTK v 3.0, et de ne pas les versions plus récentes.
Depuis, personne n'a vraiment mentionné et c'est quelque chose me préoccupait beaucoup, ici, c'est une autre façon d'utiliser Stanford parser en python:
de cette façon, vous n'avez pas besoin de s'inquiéter à propos de la voie plus rien.
Pour ceux qui ne peuvent pas l'utiliser correctement sur Ubuntu ou d'exécuter le code dans Eclipse.
J'ai pris plusieurs heures et a finalement trouvé une solution simple pour les utilisateurs de Windows. Fondamentalement sa version résumée d'un réponse existant par alvas, mais facile à suivre(espérons-le) pour ceux qui sont nouveaux à stanford la PNL et sont de la Fenêtre utilisateurs.
1) Télécharger le module que vous souhaitez utiliser, tels que les TNS, POS etc. Dans mon cas, j'ai voulu utiliser le TNS, donc j'ai téléchargé le module de http://nlp.stanford.edu/software/stanford-ner-2015-04-20.zip
2) Décompressez le fichier.
3) Définir les variables d'environnement(classpath et stanford_modules) à partir du dossier décompressé.
4) définir les variables d'environnement JAVA, là où vous avez installé JAVA. pour moi, c'était en dessous de
5) importer le module que vous souhaitez
6) appel de la pré-entraîné modèle qui est présent dans le classificateur dossier dans le dossier dézippé. ajouter ".gz" à la fin de l'extension de fichier. pour moi le modèle que je voulais utiliser, a été
english.all.3class.distsim.crf.ser
7) Maintenant exécuter l'analyseur!! et nous sommes en fait!!!!
Obsolète Réponse
La réponse ci-dessous est obsolète, veuillez utiliser la solution sur https://stackoverflow.com/a/51981566/610569 pour NLTK v3.3 et au-dessus.
ÉDITÉ
Remarque: La réponse suivante ne fonctionnera que sur:
À la fois comme outils de changements assez rapidement et l'API peut paraître très différents de 3 à 6 mois plus tard. Merci de traiter la réponse suivante temporelle et pas une éternelle correctif.
Toujours se référer à https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software pour la dernière instruction sur la façon d'interface Stanford PNL outils à l'aide de NLTK!!
TL;DR
La suite du code vient de https://github.com/nltk/nltk/pull/1735#issuecomment-306091826
Dans le terminal:
En Python:
Veuillez jeter un oeil à http://www.nltk.org/_modules/nltk/parse/corenlp.html pour plus d'informations sur le Stanford API. Jetez un oeil à la docstrings!
Noter que cette réponse s'applique à NLTK v 3.0, et de ne pas les versions plus récentes.
Je ne peux pas laisser cela comme un commentaire en raison de la réputation, mais depuis que j'ai passé (perdu?) certains de temps à résoudre ce que je préfère partager mon problème/solution pour obtenir cet analyseur de travailler dans NLTK.
Dans le excellent réponse de alvas, il est mentionné que:
Ce qui m'a conduit à tort à:
STANFORD_MODELS
(et ne se soucient que monCLASSPATH
)../path/tostanford-parser-full-2015-2012-09/models directory
* pratiquement vide* (ou avec un fichier jar dont le nom ne correspond pas à nltk regex)!Si l'OP, comme moi, je voulais juste utiliser l'analyseur, il peut être source de confusion que lorsqu'il n'est pas télécharger quoi que ce soit d'autre (pas de POStagger, aucun PARTENAIRE,...) et de suivre toutes ces instructions, nous obtenons toujours une erreur.
Finalement, pour tout
CLASSPATH
donné (à la suite des exemples et des explications dans les réponses de ce fil) je reçois toujours le message d'erreur:voir:
http://nlp.stanford.edu/software/lex-parser.shtml
OU:
Si, important, j'ai pu charger correctement et d'utiliser l'analyseur si j'appelle la fonction avec tous les arguments et le chemin d'accès entièrement spécifié, comme dans:
Solution pour Parser seul:
Donc l'erreur vient de
NLTK
et comment il est à la recherche pour les bocaux à l'aide de l'fournisSTANFORD_MODELS
etCLASSPATH
variables d'environnement. Pour résoudre cela,*-models.jar
, avec la mise en forme correcte (pour correspondre à la regex dansNLTK
code, donc pas de -corenlp-....jar) doit être situé dans le dossier désigné parSTANFORD_MODELS
.À savoir, j'ai d'abord créé:
Ensuite ajouté dans
.bashrc
:Et enfin, par la copie de
stanford-parser-3.6.0-models.jar
(ou version correspondante), dans:J'ai pu obtenir
StanfordParser
à la charge en douceur en python, avec la classiqueCLASSPATH
que les points destanford-parser.jar
. En fait, en tant que tel, vous pouvez appelerStanfordParser
sans paramètres, la valeur par défaut d'un travail juste.Je suis en utilisant nltk version 3.2.4. Et suivants du code a fonctionné pour moi.
De sortie: