我的目标是弄清楚给定的单词是介词还是从属结合。 stanford解析器的主要问题是它对于上面提到的两个语音部分都有一个 IN 标记。 因此,为了唯一地识别它们,我实施了以下程序:
我正在尝试迭代从Stanford解析器生成的nlp树。
图片优先:
我试图以这种方式......
if IN is found
{
parentValue = parent of IN
if parentValue is SBAR
{
get leaf or child of IN ... (ie word itself)
mark it as subordinating conjunction
}
if parentValue is PP
{
get leaf or child of IN ... (ie word itself)
mark it as preposition
}
}
为什么我先检查 IN ?
基本上,根据我的理解,如果一个句子有介词或从属结合,它或者在 PP或SBAR 之下得到尊重。但是,有可能可能没有 IN 作为孩子,它可以是另一个句子,NP或任何东西。所以,我首先找到 IN 。 (欢迎提出建议和更正。)
另外,我假设在将来遇到的任何句子中都不会出现低于IN 的惊喜。如果我错了,请纠正我。
我写了以下代码
package com.test.olabs.main;
import java.util.List;
import com.olabs.nlp.OlabsTokenizer;
import edu.stanford.nlp.ling.CoreLabel;
import edu.stanford.nlp.parser.lexparser.LexicalizedParser;
import edu.stanford.nlp.tagger.maxent.MaxentTagger;
import edu.stanford.nlp.trees.Tree;
public class MyTester {
public static void main(String[] args) {
MyTester t = new MyTester();
t.test();
}
String sentence = "It seemed as if whole town was mourning his death.";
private static final String ENG_BI_MODEL = "edu/stanford/nlp/models/pos-tagger/english-bidirectional/english-bidirectional-distsim.tagger";
private static final String PCG_MODEL = "edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz";
private static final MaxentTagger mxt = new MaxentTagger(ENG_BI_MODEL);
private static final LexicalizedParser parser = LexicalizedParser
.loadModel(PCG_MODEL);
Tree parentNode = null;
private void findPro(Tree t) {
System.out.println("findpro tree value " + t.label().value());
if (t.label().value().equals("IN")) {
System.out.println("-----------in IN");
if (parentNode.value().equals("PP"))
{
System.out.println("found prep " +t.label().value());
}
if (parentNode.value().equals("SBAR"))
{
System.out.println("----------in sbar "+t.label().value());
}
} else {
for (Tree child : t.children()) {
parentNode = t; // parent is t and childVar is child , we need
// to store parent ... so we stored it
findPro(child);
}
}
}
public Tree parse(String s) {
List<CoreLabel> tokens = OlabsTokenizer.tokenizeString(s);
mxt.tagCoreLabels(tokens);
Tree tree = parser.apply(tokens);
return tree;
}
void test() {
MyTester test = new MyTester();
Tree t = test.parse(sentence);
findPro(t);
}
}
我能用这段代码成功做到了什么? 我可以从树上获得 IN 。 2.我可以得到IN 的父,即 SBAR或PP (由于hackey代码,因为在树上调用.parent()会给你null)
问题是,现在我无法得到IN的孩子,我得到两个值 as和if 。您可以在上面的第一张图片中检查解析输出。 答案应仅如果。
此处输出如下:
findpro tree value ROOT
findpro tree value S
findpro tree value NP
findpro tree value PRP
findpro tree value It
findpro tree value VP
findpro tree value VBD
findpro tree value seemed
findpro tree value SBAR
findpro tree value IN
-----------in IN
----------in sbar IN
findpro tree value IN
-----------in IN
----------in sbar IN
findpro tree value S
findpro tree value NP
findpro tree value JJ
findpro tree value whole
findpro tree value NN
findpro tree value town
findpro tree value VP
findpro tree value VBD
findpro tree value was
findpro tree value VP
findpro tree value VBG
findpro tree value mourning
findpro tree value NP
findpro tree value PRP$
findpro tree value his
findpro tree value NN
findpro tree value death
findpro tree value .
findpro tree value .
基本上,循环进入 IN两次,PP 根本不打印。我认为它应该只进入IN一次并输出 if 。这是stanford解析器或我的代码中的这个错误吗?
我怎样才能正确完成这一切?需要帮助。
FYI, 我也试过它的第一部分 Identify prepositons and individual POS 但没有太多帮助。