2015-10-17 81 views
1

我正在研究使用CoreNlp为了解析句子,使用各种可用的注释器(主要是选区和情绪)的研究。“合并”依赖关系和选区树

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

我试图得到类似的图像在左树:

​​ (从Relational-Realizational Parsing (Tsarfaty and Sima’an, 2008)图像)

有一些“简单”的方式与所提供的解析器输出工作(在代码就是)得到类似的东西?

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

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

回答

0

为创建合并选区和依赖树所需的代码创建了一个“代码片段”(相当长的一段代码),该代码遵循上述建议的线路 - 遍历两棵树。

Merge Constituency and Dependency

在较高水平的过程:

  1. 使用解析器/管道

  2. 从它那里得到的树和语法结构获得选区树,输入依赖性(注意 - 保持标点符号)

  3. 将类型化依赖转换为依赖树

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

的代码(类):

  • DependencySpan - 表示跨度和覆盖它的节点(用于匹配跨度)

  • DependencyTreeNode - 在依赖关系树中的节点,其保持参考核心标签(其反过来具有用于获得跨度的相关字索引)

  • MergedNode - 合并选区+依赖节点。

  • MergeConstituencyAndDependency - 合并树的实际代码 - 遵循上述算法。包括主要(测试的入口点)。

有一件事我不是100%肯定的是为什么需要“情绪”注释 - 没有它创造的语法结构将引发错误。

A免责声明 - 我不熟悉斯坦福NLP图书馆及其所有选项。代码松散地基于我在网上找到的其他例子,可能有更好的方法来完成这项任务。

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

树类代表选区解析和SemanticGraph类代表的依赖解析。

+0

谢谢 - 我真的很熟悉这些类,并想知道是否有一种“内置”合并方式或我可以使用的示例代码。我最终实现了一个基于两个类和我创建的中间节点格式的合并算法。我会尽快用我的代码回答。 –