2015-12-21 2 views
0

Я пытаюсь использовать CRFClassifier библиотеки Стэнфордского NLP.CRFClassifier java.lang.NoSuchFieldError: maxAdditionalKnownLCWords

Подготовленная модель должна быть в файле .ser, но когда я прохожу десериализованный объект конструктору CRFClassifier я получаю ошибку:

java.lang.NoSuchFieldError: maxAdditionalKnownLCWords 

Это то, что я пытался, я также попытался использовать файл свойств, который был указан в том же каталоге. Я получаю ту же ошибку, независимо от того, проходит ли я файл пропеллера или нет, хотя:

import edu.stanford.nlp.process.*; 
import java.util.Collection; 
import edu.stanford.nlp.ling.*; 
import java.util.List; 
import java.io.*; 
import edu.stanford.nlp.io.*; 
import edu.stanford.nlp.ie.*; 
import edu.stanford.nlp.ie.crf.*; 
import java.util.*; 

public class StanfordParserTest { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     String propfile = "/Users/--------/Documents/Programming/Java/stanford-ner-2015-12-09/classifiers/english.all.3class.distsim.prop"; 
     FileReader p_file_reader = null; 
     Properties prop = new Properties(); 
     try{ 
      p_file_reader = new FileReader(propfile); 
     }catch(FileNotFoundException e){ 
      e.printStackTrace(); 
     } 
     if (p_file_reader != null){ 
      try{ 
       prop.load(p_file_reader); 
       p_file_reader.close(); 
      }catch(IOException e){ 
       e.printStackTrace(); 
      } 

     } 

     ObjectInputStream o_in = null; 
     String serializedClassifier = "/Users/--------/Documents/Programming/Java/stanford-ner-2015-12-09/classifiers/english.all.3class.distsim.crf.ser"; 
     try{ 
      FileInputStream f_in = new FileInputStream(serializedClassifier); 
      o_in = new ObjectInputStream(f_in); 
      f_in.close(); 
     }catch(FileNotFoundException e){ 
      e.printStackTrace(); 
     }catch(IOException e){ 
      e.printStackTrace(); 
     } 
     System.out.println(o_in); 
     System.out.println(prop); 
     AbstractSequenceClassifier<CoreLabel> classifier = null; 
     try{  
      classifier = CRFClassifier.getClassifier(o_in, prop); 
     }catch(ClassNotFoundException e){ 
      e.printStackTrace(); 
     } 
     catch(IOException e){ 
      e.printStackTrace(); 
     } 
     System.out.println(classifier); 

    } 

} 

Это выход:

[email protected] 
{useDisjunctive=true, useSequences=true, serializeTo=english.all.3class.distsim.crf.ser.gz, useOccurrencePatterns=true, unknownWordDistSimClass=0, useClassFeature=true, testFile=/u/nlp/data/ner/column_data/all.3class.test, useQN=true, useTypeSeqs=true, usePrevSequences=true, featureDiffThresh=0.05, wordFunction=edu.stanford.nlp.process.AmericanizeFunction, distSimLexicon=/u/nlp/data/pos_tags_are_useless/egw4-reut.512.clusters, wordShape=chris2useLC, usePrev=true, maxLeft=1, useNextRealWord=true, useTypeSeqs2=true, map=word=0,answer=1, disjunctionWidth=5, useWord=true, QNsize=25, useLastRealWord=true, numberEquivalenceDistSim=true, useDistSim=true, useNGrams=true, saveFeatureIndexToDisk=true, useLongSequences=true, useObservedSequencesOnly=true, readerAndWriter=edu.stanford.nlp.sequences.ColumnDocumentReaderAndWriter, maxNGramLeng=6, normalize=true, trainFileList=/u/nlp/data/ner/column_data/ace23.3class.train,/u/nlp/data/ner/column_data/muc6.3class.ptb.train,/u/nlp/data/ner/column_data/muc7.3class.ptb.train,/u/nlp/data/ner/column_data/conll.3class.train,/u/nlp/data/ner/column_data/wikiner.3class.train,/u/nlp/data/ner/column_data/ontonotes.3class.train,/u/nlp/data/ner/column_data/english.extra.3class.train, useNext=true, noMidNGrams=true, useTypeySequences=true, type=crf} 
Exception in thread "main" java.lang.NoSuchFieldError: maxAdditionalKnownLCWords 
    at edu.stanford.nlp.ie.AbstractSequenceClassifier.reinit(AbstractSequenceClassifier.java:185) 
    at edu.stanford.nlp.ie.AbstractSequenceClassifier.<init>(AbstractSequenceClassifier.java:152) 
    at edu.stanford.nlp.ie.crf.CRFClassifier.<init>(CRFClassifier.java:174) 
    at edu.stanford.nlp.ie.crf.CRFClassifier.getClassifier(CRFClassifier.java:2967) 
    at StanfordParserTest.main(StanfordParserTest.java:66) 

Кто-нибудь знает, что происходит здесь не так?

+0

Какую версию кода вы используете? Моя первоначальная догадка заключается в том, что ваша версия кода и версия модели несовместимы. –

+0

Спасибо за ваш комментарий. Я использую версию 3.6.0. Я загрузил пакет на следующий сайт: http://nlp.stanford.edu/software/CRF-NER.shtml. А затем использовала модель «english all» в соответствующей папке классификаторов. – eager2learn

ответ

1

Пожалуйста, обратитесь код, указанный в NERDemo.java, чтобы увидеть, как программно загрузить CRFClassifier.

Эти команды должны работать нормально, если запустить в каталоге распространения:

javac -cp "*" NERDemo.java 
java -mx400m -cp "*:.:lib/*" NERDemo classifiers/english.all.3class.distsim.crf.ser.gz sample.txt 

В общем, убедитесь, что ваш CLASSPATH только с использованием текущих баночки из этого каталога распределения. Если у вас устаревшие банки в CLASSPATH, вы можете получить некоторые ошибки.

Это должно работать, если у вас есть надлежащее CLASSPATH:

String serializedClassifier = "classifiers/english.all.3class.distsim.crf.ser.gz"; 
AbstractSequenceClassifier<CoreLabel> classifier = CRFClassifier.getClassifier(serializedClassifier); 

и десериализация модели, поставляемая с распределением тока, которые находятся в папке классификаторов.

+0

Спасибо за ваш ответ. Какие банки нужно добавить к пути? У меня есть следующее в каталоге: stanford-ner-3.6.0-javadoc, stanford-ner-3.6.0-sources, stanford-ner-3.6.0 и stanford-ner. И вот в каталоге lib: joda-time, jollyday-0.4.7, slf4j-api, slf4j-simple, stanford-ner-resources. Я добавил все из них в путь класса и получил исключение maxAdditionalKnownLCWords. Являются ли они несовместимыми, например. мне нужно использовать только stanford-ner-3.6.0 или stanford-ner, а не оба? – eager2learn

+0

Использование всех банок в папке распространения в порядке. Если вы снова загрузите папку распространения и запустите две команды выше в этой папке, NERDemo должен работать нормально. Это работает для меня на моем ноутбуке. Две причины, по которым это может не сработать, - это добавление банок в папку или перезапись файлов моделей. Так что новая загрузка должна исправить это. В вашем собственном коде реплицируйте то, что находится в NERDemo.java. Вы специально хотите использовать getClassifier, который принимает путь String к модели. – StanfordNLPHelp

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