package com.mycorenlp;

import java.util.List;
import java.util.Map;
import java.util.Properties;

import edu.stanford.nlp.dcoref.CorefChain;
import edu.stanford.nlp.dcoref.CorefCoreAnnotations.CorefChainAnnotation;
import edu.stanford.nlp.ling.CoreAnnotations.NamedEntityTagAnnotation;
import edu.stanford.nlp.ling.CoreAnnotations.PartOfSpeechAnnotation;
import edu.stanford.nlp.ling.CoreAnnotations.SentencesAnnotation;
import edu.stanford.nlp.ling.CoreAnnotations.TextAnnotation;
import edu.stanford.nlp.ling.CoreAnnotations.TokensAnnotation;
import edu.stanford.nlp.ling.CoreLabel;
import edu.stanford.nlp.pipeline.Annotation;
import edu.stanford.nlp.pipeline.StanfordCoreNLP;
import edu.stanford.nlp.semgraph.SemanticGraph;
import edu.stanford.nlp.semgraph.SemanticGraphCoreAnnotations.CollapsedCCProcessedDependenciesAnnotation;
import edu.stanford.nlp.trees.Tree;
import edu.stanford.nlp.trees.TreeCoreAnnotations.TreeAnnotation;
import edu.stanford.nlp.util.CoreMap;

/**
 * Ref: http://www.cnblogs.com/tec-vegetables/p/4153144.html
 * @author shijie
 *
 */
public class CoreNLPMain {
    
    public static void main(String[] args) {
        long begin = System.currentTimeMillis();
        process();
        long end = System.currentTimeMillis();
        
        System.out.println("Total time: " + (end - begin));
    }
    
    public static void process() {
     // 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 = "Stanford University is located in California. It is a great university. Meg is CEO of HP. Tomorrow is a nice day!"; // 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)) { // TODO 还有哪些class? 
                // this is the text of the token  拆分后的单词
                String word = token.get(TextAnnotation.class);
                // this is the POS tag of the token 词性：动词VBZ，副词,名词NNP，形容词JJ，冠词DT......
                String pos = token.get(PartOfSpeechAnnotation.class);
                // this is the NER label of the token 命名实体。 例如：ORGANIZATION，O，LOCATION，DATE，TIME，PERSON
                String ne = token.get(NamedEntityTagAnnotation.class);
                System.out.println("word = " + word + " pos = " + pos + " ne = " + ne);
            }
            System.out.println("--------------------- End of one sentence--------------------------");
            // this is the parse tree of the current sentence
            Tree tree = sentence.get(TreeAnnotation.class);
            System.out.println("TreeAnnotation = " + tree);
            // 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!
        // coreference 表示指代关系
        Map<Integer, CorefChain> graph = document.get(CorefChainAnnotation.class);
        System.out.println(graph);
    }
}

@@ -3057,16 +3057,41 @@
 E%EF%BC%8CPERSON
+ %E7%9B%AE%E7%9A%84%E6%98%AF%E8%AF%86%E5%88%AB%E8%AF%AD%E6%96%99%E4%B8%AD%E4%BA%BA%E5%90%8D%E3%80%81%E5%9C%B0%E5%90%8D%E3%80%81%E7%BB%84%E7%BB%87%E6%9C%BA%E6%9E%84%E5%90%8D%E7%AD%89%E5%91%BD%E5%90%8D%E5%AE%9E%E4%BD%93
 %0D%0A      

add comments for NER