使用stanford coreNLP我已经提取了被动语态句子的所有类型依赖关系。现在我想让它成为主动声音。为此,我必须删除并插入一些新规则。例如,如果我们采取像句子 "这只猫被狗追赶了。"那么类型化的依赖表示如下: det(cat-2,The-1) nsubjpass(chased-4,cat-2) auxpass(chased-4,was-3) det(狗-7,the-6) 特工(追逐4,狗7) punct(chased-4,。-8)
将上述内容转换为活动语音的转换规则需要三次删除和两次插入: 1.匹配和删除: (a)nsubjpass(?? X0,?? X1) (b)辅助通道(?? X0,?? X2) (c)代理人(?? X0,?? X3)
这里?? X0(追逐),?? X1(猫),?? X2(是)和?? X3(狗)
现在我的问题是如何在java代码中实现这些规则。
答案 0 :(得分:0)
所以你想改变句子:
"The cat was chased by the dog."
成:
"The dog chased the cat."
如果我正在研究这个问题,我的第一直觉就是使用规则来生成新句子String,然后用这个文本重新构建一个新的Annotation对象。
所以我不会编辑图形或其他注释,我只是创建我想要的新String,并重建依赖图。
所以你可以想象有一条规则:
Pattern: X was VERB by Y --> Y <VERB> X
Example: "The cat was chased by the dog." --> "The dog chased the cat."
并遵循此算法:
检测依赖图中的模式或使用正则表达式(在这种情况下&#34;是&#34的VERB;)
创建X和Y.因此,您可以按照图表添加额外的单词,例如行列式。因此,在这种情况下,您将遵循行列式边缘来扩展&#34; cat&#34;进入&#34;猫#34;和#34;狗&#34;进入&#34;狗&#34;。
输出新更改的字符串:X Y,并小写所有内容。在这种情况下输出&#34;猫追赶狗&#34;
然后将新句子的第一个单词大写,并在结尾处添加标点符号。结果导致猫追赶了狗。&#34;
然后我只是将这个新String提供给Annotation并重新运行管道以获得新的依赖图。
Annotation newSentenceAnnotation = new Annotation("The dog chased the cat.");
pipeline.annotate(newSentenceAnnotation);
以下是使用语义图的一些链接:
http://nlp.stanford.edu/nlp/javadoc/javanlp/edu/stanford/nlp/semgraph/SemanticGraph.html
http://nlp.stanford.edu/nlp/javadoc/javanlp/edu/stanford/nlp/semgraph/SemanticGraphEdge.html
如果你看一下我们最近提供的这个演示,就会有一个名为DependencyMatchFinder.java的类,它演示了如何从Annotation访问SemanticGraph:
https://github.com/stanfordnlp/nlp-meetup-demo/blob/master/DependencyMatchFinder.java