我在C#中使用Stanford-NLP包。我已经能够编译和执行这样的程序包,但是在多个输入中利用coref包时遇到了困难,特别是试图预先填充"预先填充"来自先前输入的第二个输入的corefs。
在我的示例程序中,我通过stdin读取了一组文本,并使用以下方法解析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);
我无法正常工作的是利用先前输入的结果作为下一个输入的核心。
例如:
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 :(得分:0)
在我看来,连接字符串是唯一的方法。这个工具(StanfordCoreNLP)的工作方式通常是你给它输入文本,然后你会得到一个图形作为输出。所以,让我们说文本A产生图A.你要做的是给文本B和图A,作为输入产生图B,但只能输入文本。这与给出文本A + B作为输入有什么不同,虽然产生图B?
具体来说,我发现让管道工作的唯一方法是在管道的注释功能中提供注释输入(就像你一样)。以下是工具的java文档中的Annotation的描述:
表示文档中文本范围的注释。基本上 只是知道文本的CoreMap实现。你的意思是 在常见情况下使用CoreAnnotations中的注释键,但是 可以为不寻常的注释定义定制的注释。
使用示例中的变量,如果可以执行以下操作:
pipeline.annotate(annotation,graph);
然后您可以考虑以前的图表。但为什么要添加该图而不是其各自的文本?
我可能在这里遗漏了一些东西。我知道这不是你要找的答案。坦率地说,我想留下这个评论(但不能,因为赏金)。虽然我目前在java中使用StanfordCoreNLP,但对于共同引用之外的东西,可能会有更好的(或实际的)答案,以及更有资格提供它的人。