94 votes

Comment utiliser le parseur de Stanford dans NLTK en utilisant Python ?

Est-il possible d'utiliser Stanford Parser dans NLTK ? (Je ne parle pas de Stanford POS).

3voto

user3418976 Points 1

Notez que cette réponse s'applique à NLTK v 3.0, et non aux versions plus récentes.

Voici la version Windows de la réponse d'alvas

sentences = ('. '.join(['this is sentence one without a period','this is another foo bar sentence '])+'.').encode('ascii',errors = 'ignore')
catpath =r"YOUR CURRENT FILE PATH"

f = open('stanfordtemp.txt','w')
f.write(sentences)
f.close()

parse_out = os.popen(catpath+r"\nlp_tools\stanford-parser-2010-08-20\lexparser.bat "+catpath+r"\stanfordtemp.txt").readlines()

bracketed_parse = " ".join( [i.strip() for i in parse_out if i.strip() if i.strip()[0] == "("] )
bracketed_parse = "\n(ROOT".join(bracketed_parse.split(" (ROOT")).split('\n')
aa = map(lambda x :ParentedTree.fromstring(x),bracketed_parse)

NOTES :

  • Sur lexparser.bat vous devez changer tous les chemins en chemin absolu pour éviter les erreurs java telles que "class not found" (classe non trouvée)

  • Je vous recommande vivement d'appliquer cette méthode sous Windows car j'ai essayé plusieurs réponses sur la page et toutes les méthodes de communication de python avec Java échouent.

  • Je souhaite avoir de vos nouvelles si vous réussissez sous Windows et si vous pouvez me dire comment vous avez surmonté tous ces problèmes.

  • chercher python wrapper for stanford coreNLP pour obtenir la version python


3voto

Ted Petrou Points 20559

Je suis sur une machine Windows et vous pouvez simplement exécuter l'analyseur syntaxique normalement comme vous le faites à partir de la commande comme mais dans un répertoire différent ainsi vous n'avez pas besoin d'éditer le fichier lexparser.bat. Il suffit de mettre le chemin complet.

cmd = r'java -cp \Documents\stanford_nlp\stanford-parser-full-2015-01-30 edu.stanford.nlp.parser.lexparser.LexicalizedParser -outputFormat "typedDependencies" \Documents\stanford_nlp\stanford-parser-full-2015-01-30\stanford-parser-3.5.1-models\edu\stanford\nlp\models\lexparser\englishFactored.ser.gz stanfordtemp.txt'
parse_out = os.popen(cmd).readlines()

La partie la plus délicate pour moi était de réaliser comment exécuter un programme java à partir d'un chemin différent. Il doit y avoir un meilleur moyen, mais celui-ci fonctionne.

3voto

SYK Points 38

Notez que cette réponse s'applique à NLTK v 3.0, et non aux versions plus récentes.

Une légère mise à jour (ou simplement une alternative) de la réponse complète de danger89 sur l'utilisation de Stanford Parser dans NLTK et Python.

Avec stanford-parser-full-2015-04-20, JRE 1.8 et nltk 3.0.4 (python 2.7.6), il semble que vous n'ayez plus besoin d'extraire le fichier englishPCFG.ser.gz de stanford-parser-x.x.x-models.jar ou de configurer un quelconque os.environ.

from nltk.parse.stanford import StanfordParser

english_parser = StanfordParser('path/stanford-parser.jar', 'path/stanford-parser-3.5.2-models.jar')

s = "The real voyage of discovery consists not in seeking new landscapes, but in having new eyes."

sentences = english_parser.raw_parse_sents((s,))
print sentences #only print <listiterator object> for this version

#draw the tree
for line in sentences:
    for sentence in line:
        sentence.draw()

2voto

H. Rev. Points 141

Notez que cette réponse s'applique à NLTK v 3.0, et non aux versions plus récentes.

Je ne peux pas laisser de commentaire à cause de ma réputation, mais comme j'ai passé (perdu ?) du temps à résoudre ce problème, je préfère partager mon problème/solution pour faire fonctionner ce parseur dans NLTK.

Dans le excellent réponse d'alvas il est mentionné que :

Par exemple, pour le Parser, il n'y aura pas de répertoire de modèle.

Cela m'a conduit à tort à :

  • pas être attentif à la valeur que je mets à STANFORD_MODELS (et ne se soucie que de mon CLASSPATH )
  • quitter ../path/tostanford-parser-full-2015-2012-09/models directory * virtuellement vide* (ou avec un fichier jar dont le nom ne correspond pas au regex de nltk) !

Si le PO, comme moi, voulait juste utiliser l'analyseur syntaxique, il peut être déroutant qu'en ne téléchargeant rien d'autre (pas de POStagger, pas de NER,...) et en suivant toutes ces instructions, on obtienne toujours une erreur.

Finalement, pour toute CLASSPATH (en suivant les exemples et les explications des réponses de ce fil de discussion), j'obtiendrais toujours l'erreur :

NLTK n'a pas pu trouver stanford-parser-( \d +)(.( \d +))+-models.jar ! Définissez la variable d'environnement CLASSPATH. Pour plus d'informations, voir stanford-parser-( \d +)(.( \d +))+-models.jar,

voir : http://nlp.stanford.edu/software/lex-parser.shtml

OU :

NLTK n'a pas pu trouver stanford-parser.jar ! Définissez la variable d'environnement CLASSPATH dans l'environnement. Pour plus d'informations, sur stanford-parser.jar, consultez : http://nlp.stanford.edu/software/lex-parser.shtml

Bien que Mais surtout, je pouvais charger et utiliser correctement le parseur si j'appelais la fonction avec tous les arguments et le chemin entièrement spécifiés, comme dans :

stanford_parser_jar = '../lib/stanford-parser-full-2015-04-20/stanford-parser.jar'
stanford_model_jar = '../lib/stanford-parser-full-2015-04-20/stanfor-parser-3.5.2-models.jar'    
parser = StanfordParser(path_to_jar=stanford_parser_jar, 
                    path_to_models_jar=stanford_model_jar)

Solution pour l'analyseur seul :

L'erreur vient donc de NLTK et comment il recherche des bocaux à l'aide de l'outil fourni STANFORD_MODELS y CLASSPATH les variables d'environnement. Pour résoudre ce problème, le *-models.jar avec le formatage correct (pour correspondre à la regex dans NLTK donc pas de -corenlp-....jar) doit être situé dans le dossier désigné par STANFORD_MODELS .

A savoir, j'ai d'abord créé :

mkdir stanford-parser-full-2015-12-09/models

Puis ajouté dans .bashrc :

export STANFORD_MODELS=/path/to/stanford-parser-full-2015-12-09/models

Et enfin, en copiant stanford-parser-3.6.0-models.jar (ou la version correspondante), dans :

path/to/stanford-parser-full-2015-12-09/models/

Je pourrais obtenir StanfordParser pour charger en douceur en python avec le classique CLASSPATH qui pointe vers stanford-parser.jar . En fait, en tant que tel, vous pouvez appeler StanfordParser sans paramètres, la valeur par défaut fonctionnera.

2voto

Enthusiast Points 1020

J'ai pris de nombreuses heures et j'ai finalement trouvé une solution simple pour les utilisateurs de Windows. En fait, il s'agit d'une version résumée d'un réponse existante par alvas, mais rendu facile à suivre (espérons-le) pour ceux qui sont nouveaux à la PNL de stanford et sont des utilisateurs de Window.

1) Téléchargez le module que vous souhaitez utiliser, tel que NER, POS etc. Dans mon cas, je voulais utiliser NER, j'ai donc téléchargé le module à partir de http://nlp.stanford.edu/software/stanford-ner-2015-04-20.zip

2) Décompressez le fichier.

3) Définissez les variables d'environnement (classpath et stanford_modules) à partir du dossier dézippé.

import os
os.environ['CLASSPATH'] = "C:/Users/Downloads/stanford-ner-2015-04-20/stanford-ner.jar"
os.environ['STANFORD_MODELS'] = "C:/Users/Downloads/stanford-ner-2015-04-20/classifiers/"

4) Définissez les variables d'environnement pour JAVA, comme dans l'endroit où vous avez installé JAVA. Pour moi, c'était ci-dessous

os.environ['JAVAHOME'] = "C:/Program Files/Java/jdk1.8.0_102/bin/java.exe"

5) Importez le module que vous voulez

from nltk.tag import StanfordNERTagger

6) appelez le modèle pré-entraîné qui est présent dans le dossier classifier du dossier dézippé. ajoutez ".gz" à la fin pour l'extension du fichier. pour moi le modèle que je voulais utiliser était english.all.3class.distsim.crf.ser

st = StanfordNERTagger('english.all.3class.distsim.crf.ser.gz')

7) Maintenant, exécutez le parseur et nous avons terminé !

st.tag('Rami Eid is studying at Stony Brook University in NY'.split())

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X