CRFClassifier java.lang.NoSuchFieldError:maxAdditionalKnownLCWords

时间:2015-12-21 15:08:40

标签: java nlp stanford-nlp

我正在尝试使用Stanford NLP库的CRFClassifier。

训练有素的模型应该在.ser文件中,但是当我将反序列化的对象传递给CRFClassifier构造函数时,我得到错误:

java.lang.NoSuchFieldError: maxAdditionalKnownLCWords

这是我尝试过的,我也尝试使用同一目录中提供的属性文件。无论我是否通过了prop文件,我都会得到同样的错误:

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

    }

}

这是输出:

java.io.ObjectInputStream@6ff3c5b5
{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)

有人知道这里出了什么问题吗?

1 个答案:

答案 0 :(得分:1)

请参阅NERDemo.java中给出的代码,了解如何以编程方式加载CRFC分类器。

如果在分发目录中运行,这些命令应运行正常:

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

通常,请确保您的CLASSPATH仅使用该分发目录中的当前jar。如果你的CLASSPATH中有过时的jar,你可能会遇到一些错误。

如果你有正确的CLASSPATH:

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

并且正在对分类器文件夹中当前分发提供的模型进行反序列化。