2016-11-26 1 views
2

Я пытаюсь запустить образец кода provided here for Stanford.NLP for .NET.Stanford.NLP для .NET не загружать модели

Я установил пакет через Nuget, загрузил zip-архив CoreNLP и извлек stanford-corenlp-3.7.0-models.jar. После извлечения я разместил каталог «models» в моделях stanford-corenlp-full-2016-10-31 \ edu \ stanford \ nlp \.

Вот код, который я пытаюсь запустить:

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 : Ошибка при загрузке модели тегов (возможно, отсутствующий файл модели)

Что я делаю неправильно? Я действительно хочу, чтобы это работало. :(

ответ

2

Я думаю, что вы получили путь к модели неверном Он должен указывать на банку корневую папку

Попробуйте этот путь вместо:..

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

Работал для меня. Благодаря! –

1

У меня была такая же проблема. Чтобы исправить это, используйте stanford-corenlp-3.6.0-models.jar вместо этого. (версия пакета NuGet должна быть точно такой же, как и в версии библиотеки CoreNLP. На самом деле 3.6.0).

2

Ответ Микаэля Кристенсена верен. stanfrod-corenlp-ful-*.zip архив содержит файлы stanford-corenlp-3.7.0-models.jar с моделями внутри (это zip-архив). В Java-мире вы добавляете этот jar в путь класса и автоматически разрешаете расположение моделей в архиве.

У CoreNLP есть файл DefaultPaths.java, который указывает путь к файлу модели. Поэтому, когда вы создаете объект StanfordCoreNLP с объектом Properties, который не указывает местоположение модели, вы должны гарантировать, что модели могут быть найдены по умолчанию (связанные с Environment.CurrentDirectory).

Самый простой способ гарантировать существование файлов на пути, например Environment.CurrentDirectory + "edu/stanford/nlp/models/ner/english.all.3class.distsim.crf.ser.gz", - это распаковать архив в папку и временно изменить текущий каталог на распакованную папку.

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); 
+0

Я изменил путь, чтобы указать на корневой каталог jar, как предложил Микаэль Кристенсен, и это сработало. Спасибо за помощь! –

Смежные вопросы