2015-06-20 69 views
1

我是斯坦福CoreNLP工具包的新手,並嘗試將其用於解決新聞文本中的共同性問題的項目。爲了使用Stanford CoreNLP共識系統,我們通常會創建一個流水線,它需要標記化,句子分割,詞類標註,詞形化,命名實體識別和解析。例如:使用斯坦福CoreNLP的共同決議解決方案

Properties props = new Properties(); 
props.setProperty("annotators", "tokenize, ssplit, pos, lemma, ner, parse, dcoref"); 
StanfordCoreNLP pipeline = new StanfordCoreNLP(props); 

// read some text in the text variable 
String text = "As competition heats up in Spain's crowded bank market, Banco Exterior de Espana is seeking to shed its image of a state-owned bank and move into new activities."; 

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

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

然後,我們可以很容易地拿到了一句註釋:

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

不過,我使用其他工具的預處理和只需要一個獨立的指代消解系統。這是很容易地創建標記和分析樹註釋,並將它們設置爲註釋:

// create new annotation 
Annotation annotation = new Annotation(); 

// create token annotations for each sentence from the input file 
List<CoreLabel> tokens = new ArrayList<>(); 
for(int tokenCount = 0; tokenCount < parsedSentence.size(); tokenCount++) { 

     ArrayList<String> parsedLine = parsedSentence.get(tokenCount); 
     String word = parsedLine.get(1); 
     String lemma = parsedLine.get(2); 
     String posTag = parsedLine.get(3); 
     String namedEntity = parsedLine.get(4); 
     String partOfParseTree = parsedLine.get(6); 

     CoreLabel token = new CoreLabel(); 
     token.setWord(word); 
     token.setWord(lemma); 
     token.setTag(posTag); 
     token.setNER(namedEntity); 
     tokens.add(token); 
    } 

// set tokens annotations to annotation 
annotation.set(TokensAnnotation.class, tokens); 

// set parse tree annotations to annotation 
Tree stanfordParseTree = Tree.valueOf(inputParseTree); 
annotation.set(TreeAnnotation.class, stanfordParseTree); 

但是,創建句話的註解是很棘手的,因爲據我所知,沒有任何文件來解釋它的全部細節。我能創造這句話的註釋中的數據結構,並將其設置爲註釋:

List<CoreMap> sentences = new ArrayList<CoreMap>(); 
annotation.set(SentencesAnnotation.class, sentences); 

我肯定不能是困難的,但對如何建立從標記註釋一句註解沒有文檔,即如何用實際的句子註釋填充ArrayList。

任何想法?

順便說一句,如果我使用由我的處理工具提供的令牌和分析樹註釋,並且只使用StanfordCoreNLP管道提供的句子註釋並應用StanfordCoreNLP獨立參考解析系統,我會得到正確的結果。因此,完全獨立的共同參與解決系統缺少的唯一部分是能夠根據標記註釋創建句子註釋。

回答

4

有一個AnnotationconstructorList<CoreMap> sentences參數,如果您有一個已經標記句子的列表設置該文件。

對於每個句子你想創建一個CoreMap對象如下。 (請注意,我還加了句和標記索引到每個句子和令牌對象,分別。)

int sentenceIdx = 1; 
List<CoreMap> sentences = new ArrayList<CoreMap>(); 
for (parsedSentence : parsedSentences) { 
    CoreMap sentence = new CoreLabel(); 
    List<CoreLabel> tokens = new ArrayList<>(); 
    for(int tokenCount = 0; tokenCount < parsedSentence.size(); tokenCount++) { 

     ArrayList<String> parsedLine = parsedSentence.get(tokenCount); 
     String word = parsedLine.get(1); 
     String lemma = parsedLine.get(2); 
     String posTag = parsedLine.get(3); 
     String namedEntity = parsedLine.get(4); 
     String partOfParseTree = parsedLine.get(6); 

     CoreLabel token = new CoreLabel(); 
     token.setWord(word); 
     token.setLemma(lemma); 
     token.setTag(posTag); 
     token.setNER(namedEntity); 
     token.setIndex(tokenCount + 1); 
     tokens.add(token); 
    } 

    // set tokens annotations and id of sentence 
    sentence.set(TokensAnnotation.class, tokens); 
    sentence.set(SentenceIndexAnnotation.class, sentenceIdx++); 

    // set parse tree annotations to annotation 
    Tree stanfordParseTree = Tree.valueOf(inputParseTree); 
    sentence.set(TreeAnnotation.class, stanfordParseTree); 

    // add sentence to list of sentences 
    sentences.add(sentence); 
} 

然後你可以用sentences列表創建Annotation實例:

Annotation annotation = new Annotation(sentences); 
+1

@塞巴斯蒂安·舒斯特非常感謝你,像一個魅力。剛添加'token.setValue(word);'設置標記值和'sentence.set(ValueAnnotation.class,SENTENCE_CONTENT)'設置語句值。 – tradt