2014-02-12 3 views
1

Я пытаюсь раздобыть API-интерфейс Stanford CoreNLP. Я хотел бы получить простое предложение, чтобы быть лексемами, используя следующий код:Stanford CoreNLP дает NullPointerException

Properties props = new Properties(); 
    props.put("annotators", "tokenize"); 
    StanfordCoreNLP pipeline = new StanfordCoreNLP(props); 

    // read some text in the text variable 
    String text = "I wish this code would run."; 

    // 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); 

Это снимало с самого сайта Стэнфордского NLP, поэтому я надеялся, что он работал из коробки. К сожалению, это не так как это дает мне NullPointerException на:

for(CoreMap sentence: sentences) {... 

ответ

2

Код, который вы подобрали с сайта Стэнфордского NLP выполняет все аннотации на текстовой переменной. Для выполнения конкретных аннотаций вам необходимо соответствующим образом изменить код.

Для выполнения лексемизацию, это было бы достаточно

Properties props = new Properties(); 
props.put("annotators", "tokenize"); 
StanfordCoreNLP pipeline = new StanfordCoreNLP(props); 

Annotation document = new Annotation(text); 
pipeline.annotate(document); 
for (CoreLabel token: document.get(TokensAnnotation.class)) { 
    String word = token.get(TextAnnotation.class); 
} 

Эта строка кода будет возвращать Null, если аннотаторы не включает приговорить Splitter ("ssplit")

document.get(SentencesAnnotation.class); 

И так вы столкнувшись с NullPointerException.

1

Эта строка извлекает приговор аннотаций.

List<CoreMap> sentences = document.get(SentencesAnnotation.class); 

Но ваш конвейер содержит только токенизатор, а не разделитель предложений.

Изменить следующую строку:

 
    props.put("annotators", "tokenize, ssplit"); // add sentence splitter 
+0

Или если вы хотите, чтобы поток токена перебирался, вы можете использовать: 'for (токен CoreLabel: document.get (TokensAnnotation.class)) {...}' –

Смежные вопросы