2016-01-27 57 views
2

我正在嘗試使用Stanford Corenlp工具包來標註文本。我試圖使用這裏提供的代碼:http://stanfordnlp.github.io/CoreNLP/ 它運作良好。問題是當我想要使用嵌入在coreNLP工具包中的共同參考分辨率工具。這是行不通的。我使用了由stanford nlp group發佈的代碼。代碼是在這裏如下:如何獲得斯坦福核心nlp工具包中的Coreference Resolution註釋?

public class CorefExample { 

    public static void main(String[] args) throws Exception { 

    Annotation document = new Annotation("Barack Obama was born in Hawaii. He is the president. Obama was elected in 2008."); 

    Properties props = new Properties(); 
    props.setProperty("annotators", "tokenize,ssplit,pos,lemma,ner,parse,mention,coref"); 
    StanfordCoreNLP pipeline = new StanfordCoreNLP(props); 
    pipeline.annotate(document); 
    System.out.println("---"); 
    System.out.println("coref chains"); 
    for (CorefChain cc : document.get(CorefCoreAnnotations.CorefChainAnnotation.class).values())   {  
    System.out.println("\t"+cc); 
    } 
    for (CoreMap sentence : document.get(CoreAnnotations.SentencesAnnotation.class)) 
    { 
    System.out.println("---"); 
    System.out.println("mentions"); 
    for (Mention m : sentence.get(CorefCoreAnnotations.CorefMentionsAnnotation.class)) { 
     System.out.println("\t"+m); 
    } 
    } 
    } 
} 

但是當我要運行這些代碼,我得到空,這條線: 「sentence.get(CorefCoreAnnotations.CorefMentionsAnnotation.class)」 總是返回NULL,而我相信該工具包已經批准了核心提及。 我真的混了起來。解決辦法是什麼?我如何在Java代碼中接收coref annottaion?

+0

爲什麼你需要爲每個句子得到提及的核心參考?當我不得不處理它時,我只是使用CorefChainAnnotation中的信息,並將其與句子信息進行匹配,以檢查鏈中給出的令牌索引。 –

+0

Tx。我的意思是我只需要確定絕對提到,如「奧巴馬和他」。例如,如果我們有:「奧巴馬出生在美國,他是總統,他在2008年當選」,連鎖店是:奧巴馬和美國/奧巴馬和他/總統和2008年。你是如何過濾它的?我想你必須有一個選擇把它交給我。 (作爲corenlp在線演示http://nlp.stanford.edu:8080/corenlp/便於此功能!) –

回答

1

如果我運行最新的IT運行至完成斯坦福大學corenlp-3.6.0.jar的COREF頁面上的示例代碼,所以我沒有看到你所談論的空問題。

確保使用在網站上提供最新的jar,版本3.6.0

更新:

如果剪切和粘貼代碼此頁上:

http://stanfordnlp.github.io/CoreNLP/coref.html

並放入一個名爲CorefExample.java的文件中,然後執行:

javac -cp "stanford-corenlp-full-2015-12-09/*" CorefExample.java 
java -cp "stanford-corenlp-full-2015-12-09/*:." CorefExample 

您應該看到打印出的提及物。

我們已經更新了發行版,所以也請確保您最近下載了它。

如果您仍然有問題,我們將不得不弄清楚我剛剛描述和設置的內容。我只是剪切並粘貼代碼並按上述方式運行它,然後我看到打印出來的提示(我甚至在示例文本中添加了一個沒有提及的句子),並且我得到了提及(或空列表)的列表。所以如果你在最新的jar中使用精確的代碼,你不應該變爲null。

這將有助於知道您如何運行代碼,以便我們可以看到有什麼不同。

+0

我已經下載了最新版本(2015 V.3-6-0)。當我使用這個代碼:「pipeline.xmlPrint(annotation,xmlout);」 ,corefernce集將打印在我的控制檯(這裏/奧巴馬,他/印!)。即使使用此代碼:「annotation.get(CorefCoreAnnotation.CorefChainAnnotation.class);」 ,它顯示了句子中的整個鏈依賴關係,而不僅僅是提示。因此只有獲得提及的方法是:「annotation.get(CorefCoreAnnotation.CorefMentionAnnotation.class)」。但正如我所說,它返回空值。我甚至用不同的系統測試它,結果相同! :( –

+0

查看更新的答案 – StanfordNLPHelp

+0

順便一提確保其句子.get(CorefCoreAnnotation.CorefMnetionAnnotation.class)...每個句子都包含其提及的列表 – StanfordNLPHelp

0

我曾與3.7.0版本同樣的問題,而用一個「dcoref」(確定性的方法)參數,而不是「COREF」的指代消解。我不確定你在執行coreference解析和遇到錯誤時導入了哪些軟件包(在上面的代碼片段中沒有提到),但我想在this示例代碼中提到的軟件包。

在我的情況下,我手動包括了軟件包,並沒有從示例中複製它們。因此,提出的IntelliJ我請使用

import edu.stanford.nlp.coref.CorefCoreAnnotations; 
import edu.stanford.nlp.coref.data.CorefChain; 

在本例中,

或:

import edu.stanford.nlp.dcoref.CorefChain; 
import edu.stanford.nlp.dcoref.CorefCoreAnnotations; 

我選擇了第二個選項,這創造了零誤差爲我。實際上,不僅是sentence.get(CorefCoreAnnotations.CorefMentionsAnnotation.class)爲空,而且還有document.get(CorefCoreAnnotations.CorefChainAnnotation.class)