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).

7voto

silverasm Points 511

La page Stanford Core NLP software contient une liste de wrappers python :

http://nlp.stanford.edu/software/corenlp.shtml#Extensions

6voto

bob dope Points 479

Si je me souviens bien, l'analyseur syntaxique de Stanford est une bibliothèque Java, et vous devez donc avoir un interpréteur Java sur votre serveur/ordinateur.

Je l'ai utilisé une fois sur un serveur, combiné avec un script de php. Le script utilisait la fonction exec() de php pour faire un appel en ligne de commande à l'analyseur syntaxique comme ceci :

<?php

exec( "java -cp /pathTo/stanford-parser.jar -mx100m edu.stanford.nlp.process.DocumentPreprocessor /pathTo/fileToParse > /pathTo/resultFile 2>/dev/null" );

?>

Je ne me souviens pas de tous les détails de cette commande, elle ouvre le fileToParse, l'analyse, et écrit la sortie dans le resultFile. PHP ouvrait alors le fichier résultat pour une utilisation ultérieure.

La fin de la commande dirige le verbose de l'analyseur vers NULL, pour éviter que des informations inutiles de la ligne de commande ne viennent perturber le script.

Je ne connais pas bien Python, mais il y a peut-être un moyen de faire des appels en ligne de commande.

Ce n'est peut-être pas l'itinéraire exact que vous espériez, mais j'espère que cela vous donnera de l'inspiration. Bonne chance.

6voto

Avery Andrews Points 61

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

Voici une adaptation du code de danger98 qui fonctionne avec nltk3.0.0 sur windoze, et vraisemblablement les autres plateformes également, ajustez les noms de répertoire en fonction de votre configuration :

import os
from nltk.parse import stanford
os.environ['STANFORD_PARSER'] = 'd:/stanford-parser'
os.environ['STANFORD_MODELS'] = 'd:/stanford-parser'
os.environ['JAVAHOME'] = 'c:/Program Files/java/jre7/bin'

parser = stanford.StanfordParser(model_path="d:/stanford-grammars/englishPCFG.ser.gz")
sentences = parser.raw_parse_sents(("Hello, My name is Melroy.", "What is your name?"))
print sentences

Notez que la commande d'analyse syntaxique a changé (voir le code source à www.nltk.org/_modules/nltk/parse/stanford.html), et que vous devez définir la variable JAVAHOME. J'ai essayé de lui faire lire le fichier de grammaire in situ dans le jar, mais je n'y suis pas parvenu jusqu'à présent.

4voto

Sadik Points 406

Vous pouvez utiliser la sortie de Stanford Parsers pour créer un arbre dans nltk (nltk.tree.Tree).

En supposant que l'analyseur syntaxique stanford vous donne un fichier dans lequel il y a exactement un arbre d'analyse pour chaque phrase. Alors cet exemple fonctionne, même s'il n'a pas l'air très pythique :

f = open(sys.argv[1]+".output"+".30"+".stp", "r")
parse_trees_text=[]
tree = ""
for line in f:
  if line.isspace():
    parse_trees_text.append(tree)
tree = ""
  elif "(. ...))" in line:
#print "YES"
tree = tree+')'
parse_trees_text.append(tree)
tree = ""
  else:
tree = tree + line

parse_trees=[]
for t in parse_trees_text:
  tree = nltk.Tree(t)
  tree.__delitem__(len(tree)-1) #delete "(. .))" from tree (you don't need that)
  s = traverse(tree)
  parse_trees.append(tree)

4voto

Zhong Zhu Points 83

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

Puisque personne ne l'a vraiment mentionné et que cela me préoccupe beaucoup, voici une autre façon d'utiliser l'analyseur syntaxique de Stanford en python :

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

de cette façon, vous n'avez plus besoin de vous soucier de la question du chemin.

Pour ceux qui ne peuvent pas l'utiliser correctement sur Ubuntu ou exécuter le code dans Eclipse.

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