smo*_*med 5 java nlp stanford-nlp
我是nlp的新手,我正在尝试使用stanford解析器从文本中提取(NP)句子,我想检索文本中标记的部分(NP)
如果一个部件被标记(NP)并且其中的一个较小的部分也被标记(NP)我想采取较小的部分.
到目前为止,我设法按以下方法做我想做的事情:
private static ArrayList<Tree> extract(Tree t)
{
ArrayList<Tree> wanted = new ArrayList<Tree>();
if (t.label().value().equals("NP") )
{
wanted.add(t);
for (Tree child : t.children())
{
ArrayList<Tree> temp = new ArrayList<Tree>();
temp=extract(child);
if(temp.size()>0)
{
int o=-1;
o=wanted.indexOf(t);
if(o!=-1)
wanted.remove(o);
}
wanted.addAll(temp);
}
}
else
for (Tree child : t.children())
wanted.addAll(extract(child));
return wanted;
}
Run Code Online (Sandbox Code Playgroud)
此方法的返回类型是树的列表,当我执行以下操作时:
LexicalizedParser parser = LexicalizedParser.loadModel();
x = parser.apply("Who owns club barcelona?");
outs=extract(x);
for(int i=0;i<outs.size();i++){System.out.println("tree #"+i+": "+outs.get(i));}
Run Code Online (Sandbox Code Playgroud)
是:
tree #0: (NP (NN club) (NN barcelona))
Run Code Online (Sandbox Code Playgroud)
我希望输出"club barcelona"
立即,没有标签,我尝试了.labels();
属性,.label().value();
他们返回标签
Chr*_*ing 10
你可以得到一个子树tr下的单词列表
tr.yield()
Run Code Online (Sandbox Code Playgroud)
您可以使用Sentence中的便捷方法将其转换为String表单:
Sentence.listToString(tr.yield())
Run Code Online (Sandbox Code Playgroud)
你可以在你正在做的时候走一棵树,但是如果你要做很多这样的事情,你可能想看一下tregex,它可以通过声明模式(如NPs)更容易地找到树中的特定节点他们下面没有NP.做你正在寻找的一个巧妙的方法是:
Tree x = lp.apply("Christopher Manning owns club barcelona?");
TregexPattern NPpattern = TregexPattern.compile("@NP !<< @NP");
TregexMatcher matcher = NPpattern.matcher(x);
while (matcher.findNextMatchingNode()) {
Tree match = matcher.getMatch();
System.out.println(Sentence.listToString(match.yield()));
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3544 次 |
最近记录: |