自定义模型训练 opennlp
Custom Model training opennlp
您好,已经提到 this, this, this and this,但仍然发现构建自定义名称查找器模型很困难。
这是代码:
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);
}
出现语法错误。不知道这里出了什么问题。任何帮助将不胜感激,因为我已经尝试了上述链接上的所有代码片段。
此致,
第一个错误:您的方法需要一个 InputStreamFactory。您正在尝试传递 InputStream。 InputStream 不是 InputStreamFactory。就像披萨不是汽车一样。
如果有人(编译器)向你要汽车,而你给他披萨,他就不会开车了。通过告诉他 "trust me, this pizza is a car"(这就是演员所做的)来假装披萨是汽车不会解决问题。
所以你需要实际传递一个InputStreamFactory。查看此接口的 javadoc,您会发现它只有一个方法 createInputStream()
,它不接受任何参数,并且应该创建和 return 一个 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。这很关键。
您好,已经提到 this, this, this and this,但仍然发现构建自定义名称查找器模型很困难。 这是代码:
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);
}
出现语法错误。不知道这里出了什么问题。任何帮助将不胜感激,因为我已经尝试了上述链接上的所有代码片段。
此致,
第一个错误:您的方法需要一个 InputStreamFactory。您正在尝试传递 InputStream。 InputStream 不是 InputStreamFactory。就像披萨不是汽车一样。
如果有人(编译器)向你要汽车,而你给他披萨,他就不会开车了。通过告诉他 "trust me, this pizza is a car"(这就是演员所做的)来假装披萨是汽车不会解决问题。
所以你需要实际传递一个InputStreamFactory。查看此接口的 javadoc,您会发现它只有一个方法 createInputStream()
,它不接受任何参数,并且应该创建和 return 一个 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。这很关键。