Est-il possible d'utiliser Stanford Parser dans NLTK ? (Je ne parle pas de Stanford POS).
Réponses
Trop de publicités?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
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.
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()
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 monCLASSPATH
) - 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.
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())