我将斯坦福解析器用于实现。
我想使用句子的树来提取各种信息。

我在使用代码:
Get certain nodes out of a Parse Tree

我有我的CoreMap句子和相应的树:

Tree sentenceTree=  sentence.get(TreeCoreAnnotations.TreeAnnotation.class);
for (Tree sentenceTree: t) {
String pos = sentenceTree.label().value();
String wd = sentenceTree.firstChild().label().value();
Integer wdIndex = ??
CoreLabel token = sentence.get(CoreAnnotations.TokensAnnotation.class).get(wdIndex);


}

我无法提取引理,有人知道怎么做吗?

我尝试了以下代码,它可以正常工作,但会生成一些警告,而且也不是很干净:

Annotation a = new Annotation("geese");
ss.pipeline.annotate(a);
CoreMap se = a.get(CoreAnnotations.SentencesAnnotation.class).get(0);
CoreLabel token = se.get(CoreAnnotations.TokensAnnotation.class).get(0);
String lemma = token.get(CoreAnnotations.LemmaAnnotation.class);
System.out.println(lemma); // goose


有没有人建议?

谢谢!

最佳答案

我有同样的问题,但是我用Pairs leaf和leaf index的HashMap解决了。此代码将打印每个匹配的叶子的名词化的名词化版本。

        List<CoreLabel> tokens = sentence.get(TokensAnnotation.class);
        Tree tree = sentence.get(TreeAnnotation.class);
        TregexPattern pattern = TregexPattern.compile("NNP | NNS | NN | NNPS");
        TregexMatcher matcher = pattern.matcher(tree);

        HashMap<Tree, Integer> leafDict = new HashMap<>();
        int i = 0;
        for(Tree leaf : tree.getLeaves()) {
            leafDict.put(leaf, i);
            i++;
        }

        while (matcher.find()) {
            int index = leafDict.get( matcher.getMatch().firstChild());
            String result = tokens.get(index).get(LemmaAnnotation.class);
            System.out.println(result);
        }


仅当搜索的节点位于叶之前一级时,此解决方案才有效。

08-27 14:36