“合并”依赖和选区树

时间:2015-10-17 14:53:44

标签: java stanford-nlp

我正在进行一项研究,其中我使用CoreNlp来解析句子,使用各种可用的注释器(主要是选区和情感)。

我现在正在尝试创建一个“合并”树,其中包括选区和依赖信息,我将从中提取语法(可以考虑PCFG)。

我想尝试像图像中左边的树一样:

trees (图片来自Relational-Realizational Parsing (Tsarfaty and Sima’an, 2008)

是否有一些“简单”的方法可以使用提供的解析器输出(在代码中)来获得类似的东西?

或者,您可能知道基于Stanford NLP库的任何实现吗?

GrammaticalStructure会在这里有用吗?为每个节点制作一个GS并在每个选区节点读取typedDependencies()是否有意义?

2 个答案:

答案 0 :(得分:1)

以下是使用选区和依赖关系解析的一些代码的草图。

Properties props = new Properties();
props.setProperty("annotators","tokenize, ssplit, pos, lemma, parse");
StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
String sampleDoc = "This is the first sentence.  This is the second one.";
Annotation annotation = new Annotation(sampleDoc);
pipeline.annotate(annotation);
List<CoreMap> sentences = annotation.get(CoreAnnotations.SentencesAnnotation.class);
for (CoreMap sentence : sentences) {
  Tree tree = sentence.get(TreeCoreAnnotations.TreeAnnotation.class);
  SemanticGraph deps = sentence.get(SemanticGraphCoreAnnotations.BasicDependenciesAnnotation.class);
}

对于您的项目,您将需要学习这两个类:

http://nlp.stanford.edu/nlp/javadoc/javanlp/edu/stanford/nlp/trees/Tree.html

http://nlp.stanford.edu/nlp/javadoc/javanlp/edu/stanford/nlp/semgraph/SemanticGraph.html

Tree类表示选区解析,SemanticGraph类表示依赖解析。

答案 1 :(得分:0)

创建一个&#34;代码段&#34; (相当冗长的一个)创建一个合并的选区和依赖树所需的代码,它沿着上面提到的路线 - 遍历两棵树。

Merge Constituency and Dependency

高级别的过程:

  1. 使用解析器/管道获取选区树

  2. 获取树的语法结构,并从中输入类型依赖项(注意 - 保持标点符号)

  3. 将类型化的依赖项转换为依赖关系树

  4. 根据匹配的节点覆盖范围跨度合并依赖关系和选区树。

  5. 代码(类):

    • class MyComp extends React.Component { changeText = text => { this.setState({ ... }); }; render () { ... } } - 代表一个范围及覆盖它的节点(用于匹配范围)

    • DependencySpan - 依赖关系树中的一个节点,它保存对核心标签的引用(核心标签又有一个用于获取范围的相关单词索引)

    • DependencyTreeNode - 合并的选区+依赖关系节点。

    • MergedNode - 合并树的实际代码 - 按照上面算法的方式工作。包括main(测试的入口点)。

    我不能100%肯定的一件事是为什么&#34;情绪&#34;注释器是必需的 - 没有它创建语法结构会引发错误。

    免责声明 - 我不熟悉斯坦福NLP库及其所有选项。代码基于我在网上找到的其他示例,并且可以有更好的方法来执行此任务。