斯坦福自然语言处理工具在.NET平台上无法加载模型

3
我正在尝试运行此处提供的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();
        }
    }

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

java.lang.RuntimeException类型的第一次机会异常在stanford-corenlp-3.6.0.dll中发生 java.lang.RuntimeException类型的未处理异常在stanford-corenlp-3.6.0.dll中发生 额外信息:edu.stanford.nlp.io.RuntimeIOException: 加载标签模型时出错(可能是缺少模型文件)

我做错了什么?我真的很想让它起作用。:(
3个回答

4
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根目录,然后它就可以工作了。感谢您的帮助! - Vin Shahrdar
@ShervinShahrdar 虽然这并不是很重要,但这可能应该成为被接受的答案。 - Owen

2

我认为您的模型路径有误,应该指向jar根目录。

请尝试使用以下路径:

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

对我有用。谢谢! - Vin Shahrdar

2
我遇到了同样的问题。 为了解决它,使用 stanford-corenlp-3.6.0-models.jar 替代即可。 (Nuget 包的版本必须与 CoreNLP 库的版本完全相同,实际上是 3.6.0)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接