【问题标题】:Custom Model training opennlp自定义模型训练 opennlp
【发布时间】:2018-10-28 18:29:15
【问题描述】:

您好已经提到了thisthisthisthis,但仍然发现很难构建自定义名称查找器模型。 代码如下:

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



    }

}

我在尝试执行行时不断收到错误:

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

要求我转换参数 1. 当我将其更改为

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)

第二个问题是:

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

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

问候,

【问题讨论】:

  • 当您询问错误时,请始终发布完整且准确的错误。
  • @JBNizet 我添加了错误。

标签: java opennlp custom-model-binder


【解决方案1】:

第一个错误:您的方法需要一个 InputStreamFactory。您正在尝试传递 InputStream。 InputStream 不是 InputStreamFactory。就像披萨不是汽车一样。

如果有人(编译器)向您要汽车,而您给他披萨,他将无法开车。通过告诉他“相信我,这个披萨是一辆汽车”来假装披萨是一辆汽车(这就是铸造所做的)不会解决问题。

所以你实际上需要传递一个 InputStreamFactory。查看此接口的 javadoc,您会看到它有一个方法createInputStream(),它不接受任何参数,并且应该创建并返回一个 InputStream。

因此,一个有效的值应该是

() -> new FileInputStream(trainingDataFilePath)

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

第二个错误更简单:当调用一个方法时,你不应该指定参数的类型。仅当定义一个方法时。所以

NameFinderME.train("en", 
                   "asian.person", 
                   sampleStream, 
                   TrainingParameters.defaultParams(),
                   TokenNameFinderFactory nameFinderFactory);

应该是

NameFinderME.train("en", 
                   "asian.person", 
                   sampleStream, 
                   TrainingParameters.defaultParams(),
                   nameFinderFactory);

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

【讨论】:

  • 非常感谢您提供帮助。我不是 Java 开发人员。我想在这里训练这个模型并将其移植到 R 语言中。我已按照您的建议修复了第一个错误。第二个错误仍未解决并报错:nameFinderFactory cannot be resolved to a variable
  • 错误是不言自明的。您试图将变量作为参数传递,但该变量不存在。抱歉,这是 Java 代码,因此您实际上是 Java 开发人员,因此应该学习该语言的基础知识。如果您不愿意这样做,您应该将该任务分配给 Java 开发人员,而不是希望我们为您完成。
  • 非常感谢您的帮助。我的意思是说我在 try{} 之前声明了变量,但是 obv 它抛出了空指针异常。按照你的建议查看了 javadoc,所以不确定用什么初始化这个变量。这里是麻烦的部分TokenNameFinderFactory nameFinderFactory = null; try { model = NameFinderME.train("en", "asian.person", sampleStream, TrainingParameters.defaultParams(), nameFinderFactory); }
  • 这不是 Java 问题。这是一个 OpenNLP 问题。我对这个图书馆一无所知。我当然可以阅读它的文档来了解它的内容、TokenNameFinderFactory 是什么、可能的实现是什么等等。但你真的应该这样做。
  • 我通过阅读文档解决了这个问题 :) 刚刚在 try{} 之前用 TokenNameFinderFactory nameFinderFactory = new TokenNameFinderFactory(); 初始化,一切都完成了......再次感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-13
  • 1970-01-01
  • 2021-01-12
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
相关资源
最近更新 更多