Obtenga los K mejores análisis de una oración con Stanford Parser

Quiero tener los K mejores análisis de una oración, pensé que esto se puede hacer con ExhaustivePCFGParser Class, el problema es que no sé cómo usar esta clase, más precisamente, ¿cómo puedo instanciar esta clase? (el constructor es: ExhaustivePCFGParser(BinaryGrammar bg, UnaryGrammar ug, Lexicon lex, Options op, Index stateIndex, Index wordIndex, Index tagIndex) ) pero no sé cómo ajustar todos estos parámetros

¿Hay alguna manera más fácil de tener los mejores análisis de K?

preguntado el 23 de diciembre de 12 a las 20:12

2 Respuestas

En general, haces las cosas a través de un LexicalizedParser objeto que es una "gramática" que proporciona todas estas cosas (las gramáticas, el léxico, los índices, etc.).

Desde la línea de comandos, funcionará lo siguiente:

java -mx500m -cp "*" edu.stanford.nlp.parser.lexparser.LexicalizedParser -printPCFGkBest 20 edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz data/testsent.txt

En el nivel de API, necesita obtener un LexicalizedParserQuery objeto. Una vez que tengas un LexicalizedParser lp (como en ParserDemo.java) puede hacer lo siguiente:

LexicalizedParser lp = ... // Load / train a model
LexicalizedParserQuery lpq = lp.parserQuery();
lpq.parse(sentence);
List<ScoredObject<Tree>> kBest = lpq.getKBestPCFGParses(20);

A LexicalizedParserQuery es una especie de equivalente a una expresión regular de Java Matcher.

Nota: en la actualidad, el análisis kBest funciona bien solo para gramáticas PCFG no factorizadas.

Respondido 09 Feb 15, 03:02

Gracias Chris, funciona :), solo quiero señalar que la oración en " lpq.parse(sentence);" tiene que ser una cadena tokenizada. - amina

De acuerdo, primero debe obtener una Lista de palabras, usando un DocumentPreprocessor o un Tokenizer (como en ParserDemo.java) o usando otro código propio que haga esto. - cristobal manning

@Amine, ¿lo hiciste funcionar? Estoy tratando de obtener los k mejores árboles de análisis de una oración a través de la API, pero obtengo una NullPointerException en edu.stanford.nlp.parser.lexparser.Debinarizer.transformTreeHelper (Debinarizer.java:34) if ((!newChild.isLeaf()) && newChild.label().value().indexOf('@') >= 0) - Josep Valls

Acabo de probar de nuevo con la versión v.3.2.0. Funciona para mi. Si tiene un error reproducible, envíelo. - cristobal manning

Esta es una solución alternativa que implementé en base a la respuesta anterior de Christopher Manning, suponiendo que desea usar Python. El envoltorio de Python para CoreNLP no tiene implementados los "árboles de análisis K-best", por lo que la alternativa es usar el comando de terminal

java -mx500m -cp "*" edu.stanford.nlp.parser.lexparser.LexicalizedParser -printPCFGkBest 20 edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz data/testsent.txt

Tenga en cuenta que debe tener Stanford CoreNLP con todos los archivos JAR descargados en un directorio, así como las bibliotecas Python de requisito previo instaladas (consulte las declaraciones de importación)

import os
import subprocess
import nltk
from nltk.tree import ParentedTree

ip_sent = "a quick brown fox jumps over the lazy dog."

data_path = "<Your path>/stanford-corenlp-full-2018-10-05/data/testsent.txt" # Change the path of working directory to this data_path
with open(data_path, "w") as file:
    file.write(ip_sent) # Write to the file specified; the text in this file is fed into the LexicalParser

os.chdir("/home/user/Sidney/Vignesh's VQA/SpElementEx/extLib/stanford-corenlp-full-2018-10-05") # Change the working directory to the path where the JAR files are stored
terminal_op = subprocess.check_output('java -mx500m -cp "*" edu.stanford.nlp.parser.lexparser.LexicalizedParser -printPCFGkBest 5 edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz data/testsent.txt', shell = True) # Run the command via the terminal and capture the output in the form of bytecode
op_string = terminal_op.decode('utf-8') # Convert to string object 
parse_set = re.split("# Parse [0-9] with score -[0-9][0-9].[0-9]+\n", op_string) # Split the output based on the specified pattern 
print(parse_set)

# Print the parse trees in a pretty_print format
for i in parse_set:
    parsetree = ParentedTree.fromstring(i)
    print(type(parsetree))
    parsetree.pretty_print()

Espero que esto ayude.

Respondido 16 Oct 19, 16:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.