2011-02-13 5 views
9

Quiero analizar una lista de oraciones con el analizador de NLP de Stanford. Mi lista es ArrayList, ¿cómo puedo analizar toda la lista con LexicalizedParser?Cómo analizar una lista de oraciones?

que desea obtener de cada frase esta forma:

Tree parse = (Tree) lp1.apply(sentence); 

Respuesta

1

En realidad documentación de Stanford PNL proporciona muestra de cómo analizar frases.

Puede encontrar la documentación here

+2

También vea los ejemplos de ParserDemo que vienen con el analizador. Puede llamar a apply() directamente en una cadena que es una oración. –

20

Aunque se puede cavar en la documentación, voy a proporcionar el código aquí en SO, sobre todo porque los enlaces se mueven y/o mueren. Esta respuesta particular usa toda la tubería. Si no estoy interesado en todo el proceso, proporcionaré una respuesta alternativa en solo un segundo.

El siguiente ejemplo es la forma completa de utilizar la tubería de Stanford. Si no está interesado en la resolución de correferencia, elimine dcoref de la 3ª línea de código. Entonces, en el ejemplo a continuación, la tubería divide la oración por usted (el anotador ssplit) si solo la introduce en un cuerpo de texto (la variable de texto). ¿Tienes solo una oración? Bueno, eso está bien, puedes alimentar eso como la variable de texto.

// creates a StanfordCoreNLP object, with POS tagging, lemmatization, NER, parsing, and coreference resolution 
    Properties props = new Properties(); 
    props.put("annotators", "tokenize, ssplit, pos, lemma, ner, parse, dcoref"); 
    StanfordCoreNLP pipeline = new StanfordCoreNLP(props); 

    // read some text in the text variable 
    String text = ... // Add your text here! 

    // create an empty Annotation just with the given text 
    Annotation document = new Annotation(text); 

    // run all Annotators on this text 
    pipeline.annotate(document); 

    // these are all the sentences in this document 
    // a CoreMap is essentially a Map that uses class objects as keys and has values with custom types 
    List<CoreMap> sentences = document.get(SentencesAnnotation.class); 

    for(CoreMap sentence: sentences) { 
     // traversing the words in the current sentence 
     // a CoreLabel is a CoreMap with additional token-specific methods 
     for (CoreLabel token: sentence.get(TokensAnnotation.class)) { 
     // this is the text of the token 
     String word = token.get(TextAnnotation.class); 
     // this is the POS tag of the token 
     String pos = token.get(PartOfSpeechAnnotation.class); 
     // this is the NER label of the token 
     String ne = token.get(NamedEntityTagAnnotation.class);  
     } 

     // this is the parse tree of the current sentence 
     Tree tree = sentence.get(TreeAnnotation.class); 

     // this is the Stanford dependency graph of the current sentence 
     SemanticGraph dependencies = sentence.get(CollapsedCCProcessedDependenciesAnnotation.class); 
    } 

    // This is the coreference link graph 
    // Each chain stores a set of mentions that link to each other, 
    // along with a method for getting the most representative mention 
    // Both sentence and token offsets start at 1! 
    Map<Integer, CorefChain> graph = 
     document.get(CorefChainAnnotation.class); 
1

Así como había prometido, si no desea acceder a la tubería llena de Stanford (aunque creo que es el método recomendado), puede trabajar con la clase LexicalizedParser directamente. En este caso, descargaría la última versión de Stanford Parser (mientras que el otro usaría las herramientas CoreNLP). Asegúrese de que, además del frasco del analizador, tenga el archivo de modelo para el analizador apropiado con el que desea trabajar. Código de ejemplo:

LexicalizedParser lp1 = new LexicalizedParser("englishPCFG.ser.gz", new Options()); 
String sentence = "It is a fine day today"; 
Tree parse = lp.parse(sentence); 

Tenga en cuenta que esto funciona para la versión 3.3.1 del analizador.

Cuestiones relacionadas