我在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的“回想”,“知道” Jane的是“ She”。
虽然可以将字符串连接在一起,但我正在寻找一个交互式过程。
最佳答案
在我看来,连接字符串是唯一的方法。该工具(StanfordCoreNLP)通常的工作方式是,给它输入文本,然后接收图形作为输出。因此,假设文本A产生了图A。您想要做的是给文本B和图A作为产生图B的输入,但只能输入文本。但是与产生文本A + B作为输入有什么不同呢?
具体来说,我发现使管道正常工作的唯一方法是在管道的注释功能中提供注释输入(如您所做的那样)。这是该工具的Java文档中对Annotation的描述:
表示文档中文本范围的注释。基本上
只是了解文本的CoreMap实现。你是故意的
在常见情况下使用CoreAnnotations中的注释键,但是
可以为非常规注释定义定制项。
如果可以执行以下操作,请在示例中使用变量:
pipeline.annotate(annotation,graph);
然后,您可以考虑先前的图形。但是为什么要添加该图而不添加其各自的文本?
我可能在这里错过了一些东西。我知道这不是您要找的答案。坦率地说,我想在此留下评论(但由于赏金的缘故,不能这样做)。尽管我目前在Java中使用StanfordCoreNLP,但除了共同引用之外,还有其他更好的答案(或者实际可行的答案),还有更有资格给出答案的人。