0

我一直在使用斯坦福解析器进行 CFG 分析。我可以将输出显示为树,但我真正想要的是标签计数。

所以我可以出去,例如(取自Stack Overflow 上的另一个查询):

(ROOT (S (NP (PRP$ My) (NN dog)) (ADVP (RB also)) (VP (VBZ likes) (NP (JJ eating) (NN sausage))) (. .)))

但我真正想要的是 CSV 文件中输出的标签计数:

PRP - 1
JJ - 1

斯坦福解析器是否可以做到这一点,特别是当我想处理多个文本文件时,还是应该使用不同的程序?

4

2 回答 2

1

前面的答案虽然是正确的,但会遍历解析树中的所有节点。虽然没有现成的方法可以返回 POS 标签计数,但您可以使用edu.stanford.nlp.trees.Trees类中的方法直接获取叶节点,如下所示:

我在Function代码中使用 Guava 来增加一点优雅,但是一个简单的 for 循环也可以。

Tree tree = sentence.get(TreeAnnotation.class); // parse tree of the sentence
List<CoreLabel> labels = Trees.taggedLeafLabels(tree); // returns the labels of the leaves in a Tree, augmented with POS tags.
List<String> tags = Lists.transform(labels, getPOSTag);
for (String tag : tags)
    Collections.frequency(tags, tag);

在哪里

Function<CoreLabel, String> getPOSTag = new Function<CoreLabel, String>() {
    public String apply(CoreLabel core_label) { return core_label.get(PartOfSpeechAnnotation.class); }
};
于 2014-01-29T05:33:19.603 回答
1

是的,这很容易实现。

你会需要:

导入 java.util.HashMap;
导入 edu.stanford.nlp.trees.Tree;

我从另一个问题中假设您已经有一个现有的 Tree 对象。我怀疑您只想要一个包含离开节点的列表(在您的示例中为 PRP、NN、RB ...),但您通常可以为每个节点执行此操作。

然后遍历所有节点并只计算叶子:

Tree tree = ...
for (int i = 1; i < tree.size(); i++) {
  Tree node = tree.getNodeNumber(i);

  if (node.isLeaf()) {
    // count here
  }
}

计数是使用 HashMap 完成的,您会在此处找到有关 stackoverflow 的许多示例。基本上从 Hashmap 开始,使用标签作为键,标签计数作为值。

编辑:对不起,纠正了代码中的否定错误。

于 2014-01-28T14:31:59.027 回答