首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义模型培训

自定义模型培训
EN

Stack Overflow用户
提问于 2018-10-28 09:46:26
回答 1查看 209关注 0票数 0

Hi已经提到了,但是仍然觉得很难建立一个自定义的名字查找器模型。以下是代码:

代码语言:javascript
复制
public class CustomClassifierTrainer {

    private static final TokenNameFinderFactory TokenNameFinderFactory = null;
    static String onlpModelPath = "/Users/user/eclipse-workspace/openNLP/OpenNLP_models/en-ner-asiannames.bin";
    // training data set
    static String trainingDataFilePath = "/Users/user/eclipse-workspace/openNLP/trainingData/asiannames.txt";

    public static void main(String[] args) throws IOException {

        Charset charset = Charset.forName("UTF-8");

        ObjectStream<String> lineStream =
                new PlainTextByLineStream(new FileInputStream(trainingDataFilePath), charset);

        ObjectStream<NameSample> sampleStream = new NameSampleDataStream(lineStream);

        TokenNameFinderModel model;

        try {
          model = NameFinderME.train("en", "asian.person", sampleStream, TrainingParameters.defaultParams(),
                  TokenNameFinderFactory nameFinderFactory);
        }
        finally {
          sampleStream.close();
        }

        BufferedOutputStream modelOut = null;
        try {
          modelOut = new BufferedOutputStream(new FileOutputStream(onlpModelPath));
          model.serialize(modelOut);
        } finally {
          if (modelOut != null) 
             modelOut.close();      
        }



    }

}

在尝试执行行时,我一直会收到一个错误:

代码语言:javascript
复制
ObjectStream<String> lineStream = new PlainTextByLineStream(new FileInputStream(trainingDataFilePath), charset);

当我将论点改为

代码语言:javascript
复制
ObjectStream<String> lineStream = new PlainTextByLineStream((InputStreamFactory) new FileInputStream(trainingDataFilePath), charset);

然后,我得到一个运行时错误,说你不能转换这个。下面是我将其转换为Exception in thread "main" java.lang.ClassCastException: class java.io.FileInputStream cannot be cast to class opennlp.tools.util.InputStreamFactory (java.io.FileInputStream is in module java.base of loader 'bootstrap'; opennlp.tools.util.InputStreamFactory is in unnamed module of loader 'app') at openNLP.CustomClassifierTrainer.main(CustomClassifierTrainer.java:35)时的错误

第二个问题是一致的:

代码语言:javascript
复制
try {
  model = NameFinderME.train("en", "asian.person", sampleStream, TrainingParameters.defaultParams(),
              TokenNameFinderFactory nameFinderFactory);
}

给出语法错误。不知道这里出了什么问题。任何帮助将不胜感激,因为我已经尝试了上述链接上的所有代码片段。

致以敬意,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-28 10:01:11

第一个错误:您的方法需要一个InputStreamFactory。你想要通过一个InputStream。InputStream不是InputStreamFactory。就像比萨不是一辆车。

如果有人(编译器)向你要一辆车,而你给他一辆必胜客,他就不能开车了。假装比萨是一辆汽车,告诉他“相信我,这匹萨是一辆车”(这是演员的做法)不会解决问题。

因此,您需要实际传递一个InputStreamFactory。查看这个接口的javadoc,您将看到它有一个方法createInputStream(),它不以任何参数作为参数,应该创建和返回一个InputStream。

因此,一个有效值将是

代码语言:javascript
复制
() -> new FileInputStream(trainingDataFilePath)

即不接受输入并创建新输入流的lambda,因此可以推断为InputStreamFactory。

第二个错误甚至更简单:在调用方法时,不应该指定参数的类型。只有在定义方法时。所以

代码语言:javascript
复制
NameFinderME.train("en", 
                   "asian.person", 
                   sampleStream, 
                   TrainingParameters.defaultParams(),
                   TokenNameFinderFactory nameFinderFactory);

应该是

代码语言:javascript
复制
NameFinderME.train("en", 
                   "asian.person", 
                   sampleStream, 
                   TrainingParameters.defaultParams(),
                   nameFinderFactory);

使用更简单的东西来学习Java语法。学习读取错误消息而不是忽略它们,并读取您正在使用的类的javadoc。这很关键。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53030193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档