2014-09-29 34 views
2

我在C#中使用Stanford-NLP包。我已經能夠編譯和執行這樣一個軟件包,但是在多次輸入中利用coref軟件包困難重重,特別是試圖在先前輸入的第二個輸入中「預先填充」corefs。在多個問題中提及Corefs

在我的例子程序,我在一組通過標準輸入文本的閱讀,並使用有CoreNLP庫通過解析:

props.setProperty("annotators", "tokenize, ssplit, pos, lemma, ner, parse, dcoref, sentiment"); 

我做了COREF用一個實例:

CorefCoreAnnotations.CorefChainAnnotation coref = new CorefCoreAnnotations.CorefChainAnnotation(); 

我用這來解析我輸入:

var annotation = new Annotation(text); 
pipeline.annotate(annotation); 

我能得到corefs出來的代碼的:

Map graph = (Map)annotation.get(coref.getClass()); 
Console.WriteLine(graph); 

我無法工作的是利用先前輸入的結果作爲下一個輸入的coref。

例如:

Input 1: Jane went to the store. She was purchasing bread. 
Coref Result: She -> Jane 

Input 2: She also bought apples. 
Coref Result: null 

我想擁有的是輸入「召回」以前corefs和「知道」的「她」是簡。

雖然我可以將字符串連接在一起,但我正在尋找一個交互過程。

回答

0

在我看來,連接字符串是唯一的方法。這種工具(StanfordCoreNLP)通常工作的方式是,您將文本輸入到該文件中,並將圖形作爲輸出。所以,讓我們說文本A產生圖A.你想要做的是給文本B和圖A作爲產生圖B的輸入,但只有文本輸入是可能的。與給出文本A + B作爲輸入有什麼不同,以產生圖B?

具體而言,我發現讓管道工作的唯一方法是在管道的註釋函數中提供註釋輸入(與您一樣)。以下是該工具的Java文檔中註釋的說明:

表示文檔中文本範圍的註釋。基本上 只是一個知道文本的CoreMap的實現。您的意思是 可以在CoreAnnotations中使用註釋密鑰作爲常見情況,但 可以爲非常規註釋定義定製密鑰。

在您的示例使用變量,如果有可能做這樣的事情:

pipeline.annotate(annotation,graph); 

然後,你可以拿以前的圖表考慮。但爲什麼要添加該圖,而不是其各自的文本?

我可能會錯過這裏的東西。我知道這不是你正在尋找的答案。坦率地說,我想留下這個評論(但不能,因爲賞金)。雖然我目前在java中使用StanfordCoreNLP,但對於共同引用之外的其他內容,可能會有更好的(或實際的)回答,以及更有資格提供它的人。

+0

我試圖做到這一點的原因是允許用戶輸入基於以前的輸入是上下文。如果有其他工具可以做到這一點,那就沒問題了。我試圖將此工具用作「對話」,軟件代理會響應用戶輸入。要做到這一點,它需要回憶談話的參考和核心內容,以及衡量整個對話的總體情緒。 因此,由於這是我知道的唯一可以解析和推斷包括corefs在內的情緒的工具,因此我試圖讓它與「以前的圖形」一起工作並獲得我的corefs。 – 2014-10-16 13:50:13

+0

我仍然不明白爲什麼你不能使用「以前的文本」,而不是代表它的「上一個圖」。我不明白這將如何減少交互性(性能是我能想到的唯一問題)。你能給出一個更具體的例子,你想要你的工具的行爲?演示代理和用戶之間的這種對話場景。說明爲什麼連接文本會降低交互性。 – 2014-10-23 09:12:12