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