我正在进行一项研究,其中我使用CoreNlp
来解析句子,使用各种可用的注释器(主要是选区和情感)。
我现在正在尝试创建一个“合并”树,其中包括选区和依赖信息,我将从中提取语法(可以考虑PCFG)。
我想尝试像图像中左边的树一样:
(图片来自Relational-Realizational Parsing (Tsarfaty and Sima’an, 2008))
是否有一些“简单”的方法可以使用提供的解析器输出(在代码中)来获得类似的东西?
或者,您可能知道基于Stanford NLP库的任何实现吗?
GrammaticalStructure
会在这里有用吗?为每个节点制作一个GS并在每个选区节点读取typedDependencies()
是否有意义?
答案 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
高级别的过程:
使用解析器/管道获取选区树
获取树的语法结构,并从中输入类型依赖项(注意 - 保持标点符号)
将类型化的依赖项转换为依赖关系树
根据匹配的节点覆盖范围跨度合并依赖关系和选区树。
代码(类):
class MyComp extends React.Component {
changeText = text => {
this.setState({ ... });
};
render () { ... }
}
- 代表一个范围及覆盖它的节点(用于匹配范围)
DependencySpan
- 依赖关系树中的一个节点,它保存对核心标签的引用(核心标签又有一个用于获取范围的相关单词索引)
DependencyTreeNode
- 合并的选区+依赖关系节点。
MergedNode
- 合并树的实际代码 - 按照上面算法的方式工作。包括main(测试的入口点)。
我不能100%肯定的一件事是为什么&#34;情绪&#34;注释器是必需的 - 没有它创建语法结构会引发错误。
免责声明 - 我不熟悉斯坦福NLP库及其所有选项。代码基于我在网上找到的其他示例,并且可以有更好的方法来执行此任务。