【问题标题】:Stanford.NLP for .NET not loading models.NET 的 Stanford.NLP 不加载模型
【发布时间】:2016-11-26 02:58:38
【问题描述】:

我正在尝试运行示例代码provided here for Stanford.NLP for .NET

我通过 Nuget 安装了该软件包,下载了 CoreNLP zip 存档,并解压缩了 stanford-corenlp-3.7.0-models.jar。解压后,我找到了 stanford-corenlp-full-2016-10-31\edu\stanford\nlp\models 中的“models”目录。

这是我要运行的代码:

 public static void Test1()
    {
        // Path to the folder with models extracted from `stanford-corenlp-3.6.0-models.jar`
        var jarRoot = @"..\..\..\stanford-corenlp-full-2016-10-31\edu\stanford\nlp\models\";

        // Text for processing
        var text = "Kosgi Santosh sent an email to Stanford University. He didn't get a reply.";

        // Annotation pipeline configuration
        var props = new Properties();
        props.setProperty("annotators", "tokenize, ssplit, pos, lemma, parse, ner,dcoref");
        props.setProperty("ner.useSUTime", "0");

        // We should change current directory, so StanfordCoreNLP could find all the model files automatically
        var curDir = Environment.CurrentDirectory;
        Directory.SetCurrentDirectory(jarRoot);
        var pipeline = new StanfordCoreNLP(props);
        Directory.SetCurrentDirectory(curDir);

        // Annotation
        var annotation = new Annotation(text);
        pipeline.annotate(annotation);

        // Result - Pretty Print
        using (var stream = new ByteArrayOutputStream())
        {
            pipeline.prettyPrint(annotation, new PrintWriter(stream));
            Console.WriteLine(stream.toString());
            stream.close();
        }
    }

运行代码时出现以下错误:

在 stanford-corenlp-3.6.0.dll 中发生了“java.lang.RuntimeException”类型的第一次机会异常 stanford-corenlp-3.6.0.dll 中发生了“java.lang.RuntimeException”类型的未处理异常 附加信息:edu.stanford.nlp.io.RuntimeIOException: Error while loading a tagger model(可能缺少模型文件)

我做错了什么?我真的很想让这个工作。 :(

【问题讨论】:

    标签: c# .net nlp stanford-nlp


    【解决方案1】:

    Mikael Kristensen 的回答是正确的。 stanfrod-corenlp-ful-*.zip 存档包含文件stanford-corenlp-3.7.0-models.jar,其中包含模型(这是一个 zip 存档)。在 Java 世界中,您将 jar 添加到类路径中,它会自动解析模型在存档中的位置。

    CoreNLP 有一个文件DefaultPaths.java,它指定了模型文件的路径。所以当你用Properties对象实例化StanfordCoreNLP时,没有指定模型位置,你应该保证模型可以通过默认路径找到(与Environment.CurrentDirectory相关)。

    保证Environment.CurrentDirectory + "edu/stanford/nlp/models/ner/english.all.3class.distsim.crf.ser.gz"等路径存在文件的最简单方法是将jar存档解压缩到该文件夹​​,并将当前目录临时更改为解压缩文件夹。

    var jarRoot = "nlp.stanford.edu/stanford-corenlp-full-2016-10-31/jar-modules/";
    ...
    var curDir = Environment.CurrentDirectory;
    Directory.SetCurrentDirectory(jarRoot);
    var pipeline = new StanfordCoreNLP(props);
    Directory.SetCurrentDirectory(curDir);
    

    另一种方法是指定管道所需的所有模型的路径(它实际上取决于annotators 的列表)。 此选项更复杂,因为您必须找到正确的属性键,并指定所有使用模型的路径。但如果您想最小化部署包的大小,它可能会很有用。

    var props = new Properties();
    props.put("annotators", "tokenize, ssplit, pos, lemma, ner, depparse");
    props.put("ner.model",
              "edu/stanford/nlp/models/ner/english.all.3class.distsim.crf.ser.gz");
    props.put("ner.applyNumericClassifiers", "false");
    var pipeline = new StanfordCoreNLP(props);
    

    【讨论】:

    • 按照 Mikael Kristensen 的建议,我将路径更改为指向 jar 根目录,并且成功了。感谢您的帮助!
    • @ShervinShahrdar 并不重要,但这应该是公认的答案。
    【解决方案2】:

    我遇到了同样的问题。 要修复它,请改用stanford-corenlp-3.6.0-models.jar。 (Nuget 包的版本必须和 CoreNLP 库的版本完全一致。实际上是 3.6.0)。

    【讨论】:

      【解决方案3】:

      我认为你弄错了模型的路径。 它应该指向 jar 根文件夹。

      试试这个路径:

      var jarRoot = @"..\..\..\stanford-corenlp-full-2016-10-31"
      

      【讨论】:

      • 为我工作。谢谢!
      猜你喜欢
      • 2011-04-30
      • 2014-04-22
      • 2011-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-23
      • 2018-10-27
      • 1970-01-01
      相关资源
      最近更新 更多