由于我无法评论 Chaitanya 给出的答案,所以在这里添加更多他的答案。
斯坦福 CoreNLP 套件实现了柯林斯头部查找器启发式和语义头部查找器启发式,形式为
- 柯林斯寻头人
- ModCollins 寻头器
- 语义寻头器
您所需要的只是实例化三者之一并执行以下操作。
Tree tree = sentence.get(TreeCoreAnnotations.TreeAnnotation.class);
headFinder.determineHead(tree).pennPrint(out);
您可以遍历树的节点并在需要时确定中心词。
PS:我的回答是基于 20140104 发布的 StanfordCoreNLP 套件。
这是一个简单的 dfs,可让您提取句子中所有名词短语的中心词
public static void dfs(Tree node, Tree parent, HeadFinder headFinder) {
if (node == null || node.isLeaf()) {
return;
}
//if node is a NP - Get the terminal nodes to get the words in the NP
if(node.value().equals("NP") ) {
System.out.println(" Noun Phrase is ");
List<Tree> leaves = node.getLeaves();
for(Tree leaf : leaves) {
System.out.print(leaf.toString()+" ");
}
System.out.println();
System.out.println(" Head string is ");
System.out.println(node.headTerminal(headFinder, parent));
}
for(Tree child : node.children()) {
dfs(child, node, headFinder);
}
}