'No se puede devolver la cabeza del árbol nulo o de la hoja' con CoreNLP en Android

Quiero usar CoreNLP en mi proyecto de Android. Pero cuando creo una instancia de CoreNLP como esta:

import java.util.Properties; import edu.stanford.nlp.ling.CoreAnnotations; import edu.stanford.nlp.neural.rnn.RNNCoreAnnotations; import edu.stanford.nlp.pipeline.Annotation; import edu.stanford.nlp.pipeline.StanfordCoreNLP; import edu.stanford.nlp.sentiment.SentimentCoreAnnotations; import edu.stanford.nlp.trees.Tree; import edu.stanford.nlp.util.CoreMap; public class NLP { private StanfordCoreNLP pipeline; Properties props; public NLP() { props = new Properties(); props.setProperty("annotators", "tokenize, ssplit, pos, parse, sentiment"); pipeline = new StanfordCoreNLP(props);//-->ERROR, SEE BELOW } public int findSentiment(String line) { int mainSentiment = 0; if (line != null && line.length() > 0) { int longest = 0; Annotation annotation = pipeline.process(line); for (CoreMap sentence : annotation .get(CoreAnnotations.SentencesAnnotation.class)) { Tree tree = sentence .get(SentimentCoreAnnotations.AnnotatedTree.class); int sentiment = RNNCoreAnnotations.getPredictedClass(tree); String partText = sentence.toString(); if (partText.length() > longest) { mainSentiment = sentiment; longest = partText.length(); } } } return mainSentiment; } } 

El proyecto enlaza con los siguientes archivos .jar:

  • ejml-0.23.jar
  • stanford-corenlp-3.4.1.jar
  • stanford-corenlp-3.4.1-models.jar

En mi entorno java de escritorio con java 1.8.0_92, este código se ejecuta correctamente, pero al ejecutar el código en un Android (después de compilar sin error), estoy recibiendo el error cuando la clase NLP se instancia:

Causado por: java.lang.IllegalArgumentException: No se puede devolver la cabeza del árbol nulo o de la hoja. en edu.stanford.nlp.trees.AbstractCollinsHeadFinder.determineHead (AbstractCollinsHeadFinder.java:158) en edu.stanford.nlp.trees.AbstractCollinsHeadFinder.determineHead (AbstractCollinsHeadFinder.java:138) en edu.stanford.nlp.pipeline.ParserAnnotator. ParserAnnotator.java:132) en edu.stanford.nlp.pipeline.AnnotatorImplementations.parse (AnnotatorImplementations.java:132) en edu.stanford.nlp.pipeline.StanfordCoreNLP $ 10.create (StanfordCoreNLP.java:719) en edu.stanford. nlp.pipeline.AnnotatorPool.get (AnnotatorPool.java:85) en edu.stanford.nlp.pipeline.StanfordCoreNLP.construct (StanfordCoreNLP.java:292) en edu.stanford.nlp.pipeline.StanfordCoreNLP. (StanfordCoreNLP.java:129 ) en edu.stanford.nlp.pipeline.StanfordCoreNLP. (StanfordCoreNLP.java:125)

Estoy utilizando CoreNLP 3.4.1. No es la versión más reciente, pero funciona con Java 7 en Android. ¿Cómo puedo usar CoreNLP correctamente en Android?

One Solution collect form web for “'No se puede devolver la cabeza del árbol nulo o de la hoja' con CoreNLP en Android”

¿Por qué ocurre este problema?

Estaba buscando la respuesta. He comprobado el frasco. Hay una clase AbstractCollinsHeadFinder.java . De esta clase, este error viene

edu.stanford.nlp.trees.AbstractCollinsHeadFinder.determineHead (AbstractCollinsHeadFinder.java:158) en edu.stanford.nlp.trees.AbstractCollinsHeadFinder.determineHead (AbstractCollinsHeadFinder.java:138)

Hay dos causas principales de este error.

  1. Si el árbol es nulo, entonces se produce este error.
  2. Si el árbol es hoja, entonces se produce este error.

     @Override public Tree determineHead(Tree t, Tree parent) { if (nonTerminalInfo == null) { throw new IllegalStateException("Classes derived from AbstractCollinsHeadFinder must create and fill HashMap nonTerminalInfo."); } // The error mainly generate for the following condition if (t == null || t.isLeaf()) { throw new IllegalArgumentException("Can't return head of null or leaf Tree."); } if (DEBUG) { log.info("determineHead for " + t.value()); } Tree[] kids = t.children(); ------------- ------------- return theHead; } 

Enlace de recursos:

  1. https://github.com/stanfordnlp/CoreNLP/blob/master/src/edu/stanford/nlp/trees/AbstractCollinsHeadFinder.java#L163

Compruebe los parámetros:

También he comprobado su código. En su setProperty (…), hay algunos parámetros. Tal vez haya algún parámetro que falta . Por lo tanto, puede crear un objeto siguiendo el código.

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

Enlace de recursos:

crea un objeto StanfordCoreNLP


Un programa de ejemplo simple y completo:

 import java.io.*; import java.util.*; import edu.stanford.nlp.io.*; import edu.stanford.nlp.ling.*; import edu.stanford.nlp.pipeline.*; import edu.stanford.nlp.trees.*; import edu.stanford.nlp.trees.TreeCoreAnnotations.*; import edu.stanford.nlp.util.*; public class StanfordCoreNlpExample { public static void main(String[] args) throws IOException { PrintWriter xmlOut = new PrintWriter("xmlOutput.xml"); Properties props = new Properties(); props.setProperty("annotators", "tokenize, ssplit, pos, lemma, ner, parse"); StanfordCoreNLP pipeline = new StanfordCoreNLP(props); Annotation annotation = new Annotation( "This is a short sentence. And this is another."); pipeline.annotate(annotation); pipeline.xmlPrint(annotation, xmlOut); // An Annotation is a Map and you can get and use the // various analyses individually. For instance, this // gets the parse tree of the 1st sentence in the text. List<CoreMap> sentences = annotation .get(CoreAnnotations.SentencesAnnotation.class); if (sentences != null && sentences.size() > 0) { CoreMap sentence = sentences.get(0); Tree tree = sentence.get(TreeAnnotation.class); PrintWriter out = new PrintWriter(System.out); out.println("The first sentence parsed is:"); tree.pennPrint(out); } } } 

Enlace de recursos:

  1. El Stanford CoreNLP Natural Language Processing Toolkit
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.