插入和删除转换规则到类型依赖项

时间:2016-04-08 10:00:47

标签: java dependencies stanford-nlp

使用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)

  1. 插入: (a)nsubj(?? X0,?? X3) (b)dobj(?? X0,?? X1)
  2. 这里?? X0(追逐),?? X1(猫),?? X2(是)和?? X3(狗)

    现在我的问题是如何在java代码中实现这些规则。

1 个答案:

答案 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."

并遵循此算法:

  1. 检测依赖图中的模式或使用正则表达式(在这种情况下&#34;是&#34的VERB;)

  2. 创建X和Y.因此,您可以按照图表添加额外的单词,例如行列式。因此,在这种情况下,您将遵循行列式边缘来扩展&#34; cat&#34;进入&#34;猫#34;和#34;狗&#34;进入&#34;狗&#34;。

  3. 输出新更改的字符串:X Y,并小写所有内容。在这种情况下输出&#34;猫追赶狗&#34;

  4. 然后将新句子的第一个单词大写,并在结尾处添加标点符号。结果导致猫追赶了狗。&#34;

  5. 然后我只是将这个新String提供给Annotation并重新运行管道以获得新的依赖图。

    Annotation newSentenceAnnotation = new Annotation("The dog chased the cat.");
    pipeline.annotate(newSentenceAnnotation);
    
  6. 以下是使用语义图的一些链接:

    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