Java 如何使用斯坦福语法分析器获取德语句子的语法结构对象?

Java 如何使用斯坦福语法分析器获取德语句子的语法结构对象?,java,stanford-nlp,Java,Stanford Nlp,我将斯坦福解析器(3.5.2版)用于NLP应用程序,该应用程序依赖于依赖项解析分析以及其他来源的信息。到目前为止,我已经让它为英语工作,就像这样: import java.io.StringReader; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import edu.stanford.nlp.ling.HasWord; import edu.stanford.nlp.ling

我将斯坦福解析器(3.5.2版)用于NLP应用程序,该应用程序依赖于依赖项解析分析以及其他来源的信息。到目前为止,我已经让它为英语工作,就像这样:

import java.io.StringReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import edu.stanford.nlp.ling.HasWord;
import edu.stanford.nlp.ling.TaggedWord;
import edu.stanford.nlp.process.Tokenizer;
import edu.stanford.nlp.parser.lexparser.LexicalizedParser;
import edu.stanford.nlp.trees.GrammaticalStructure;
import edu.stanford.nlp.trees.GrammaticalStructureFactory;
import edu.stanford.nlp.trees.TreebankLanguagePack;
import edu.stanford.nlp.trees.TypedDependency;


/**
* Stanford Parser Wrapper (for Stanford Parser Version 3.5.2).
* 
*/

public class StanfordParserWrapper {

public static void parse(String en, String align, String out) {

// setup stanfordparser
String grammar = "edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz";
String[] options = { "-outputFormat", "wordsAndTags, typedDependencies" };
LexicalizedParser lp = LexicalizedParser.loadModel(grammar, options);
TreebankLanguagePack tlp = lp.getOp().langpack();
GrammaticalStructureFactory gsf = tlp.grammaticalStructureFactory();

// read document
Iterable<List<? extends HasWord>> sentences;
Reader r = new Reader(en);
String line = null;
List<List<? extends HasWord>> tmp = new ArrayList<List<? extends HasWord>>();
while ((line = r.getNext()) != null) {
    Tokenizer<? extends HasWord> token = tlp.getTokenizerFactory()
        .getTokenizer(new StringReader(line));
    List<? extends HasWord> sentence = token.tokenize();
    tmp.add(sentence);
}
sentences = tmp;

Reader alignment = new Reader(align);
Writer treeWriter = new Writer(out);

// parse
long start = System.currentTimeMillis();
// System.err.print("Parsing sentences ");
int sentID = 0;
for (List<? extends HasWord> sentence : sentences) {
    Tree t = new Tree();
    t.setSentID(++sentID);
    System.out.println("parse Sentence " + t.getSentID() + " "
        + sentence + "...");
    // System.err.print(".");

    edu.stanford.nlp.trees.Tree parse = lp.parse(sentence);

    // ROOT node
    Node root = new Node(true, true);
    t.setNode(root);

    // tagging
    int counter = 0;
    for (TaggedWord tw : parse.taggedYield()) {
    Node n = new Node();
    n.setNodeID(++counter);
    n.setSurface(tw.value());
    n.setTag(tw.tag());
    t.setNode(n);
    }

    t.setSentLength(t.getNodes().size() - 1);

    // labeling
    GrammaticalStructure gs = gsf.newGrammaticalStructure(parse);
    List<TypedDependency> tdl = gs.typedDependenciesCCprocessed();
    for (TypedDependency td : tdl) {
    Node dep = t.getNodes().get(td.dep().index());
    Node gov = t.getNodes().get(td.gov().index());
    dep.setLabel(td.reln().toString());
    gov.setChild(dep);
    dep.setParent(gov);
    }

    // combine with alignment
    t.initialize(alignment.readNextAlign());
    treeWriter.write(t);
}
long stop = System.currentTimeMillis();
System.err.println("...done! [" + (stop - start) / 1000 + " sec].");

treeWriter.close();
}

public static void main(String[] args) {
if (args.length == 3) {
    parse(args[0], args[1], args[2]);
} else {
    System.out.println("Usage:");
}
}
}
“德国行动”模式也是如此。显然,我需要在这里做一些不同的事情,因为德国模型不支持语法结构工厂。还有什么方法可以从德语文本中获得语法结构,还是我必须以完全不同的方式为德语编写代码?如果是这样的话,我会很感激一些指点,我已经找了很多信息,但是找不到我想要的

这似乎是相关的:然而,它只是告诉我语法结构工厂是支持中文模型的,而不是我需要做的德语解析

非常感谢


你没有。斯坦福解析器不支持德语的依赖性分析(这是从语法结构工厂得到的)

您可以尝试其他依赖项解析器。虽然Stanford用户需要基于规则将组成树转换为依赖树,但替代方案通常是概率性的

  • 具有依赖项解析和德语模型
  • 您可以使用(我认为有一些版本的语料库和语法分析器兼容)
  • 或者你也可以看看(但要小心,这是序言)

谢谢您的回答!我去看看。或者我会先学中文:-)
Exception in thread "main" java.lang.UnsupportedOperationException: No GrammaticalStructureFactory defined for edu.stanford.nlp.trees.international.negra.NegraPennLanguagePack
at edu.stanford.nlp.trees.AbstractTreebankLanguagePack.grammaticalStructureFactory(AbstractTreebankLanguagePack.java:591)
at StanfordParserWrapper.parse(StanfordParserWrapper.java:46)
at StanfordParserWrapper.main(StanfordParserWrapper.java:117)