大家已经提到了这个,这个,这个和这个,但是仍然发现很难建立一个自定义的名字查找器模型。。以下是代码:
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);
然后我收到一个运行时错误,说你不能强制转换这个。这是我在线程“main”中强制转换异常时的错误java.lang.ClassCastException:类java.io.FileInputStream不能强制转换为类opennlp.tools.util.InputStreamFactory(java.io.FileInputStream在loader'bootstrap'的模块java.base中;opennlp.tools.util.InputStreamFactory在openNLP的loader'app'的未命名模块中)。Custom分类器rainer.main(Custom分类器rainer.java:35)
第二个问题是:
try {
model = NameFinderME.train("en", "asian.person", sampleStream, TrainingParameters.defaultParams(),
TokenNameFinderFactory nameFinderFactory);
}
给出一个语法错误。不确定这里出了什么问题。如果有任何帮助,我将不胜感激,因为我已经尝试了上述链接上的所有代码片段。
祝好
第一个错误:您的方法需要一个InputStreamFactory。您正在尝试传递输入流。InputStream不是InputStreamFactory。就像披萨不是汽车一样。
如果有人(编译器)向你要一辆车,而你给了他一个披萨,他就不能开车了。假装披萨是一辆车,告诉他“相信我,这披萨是一辆车”(casting就是这么做的)并不能解决问题。
所以你需要通过一个InputStreamFactory。看看这个接口的javadoc,你会发现它有一个方法createInputStream()
,它不接受任何参数,应该创建并返回一个InputStream。
因此,有效值为
() -> new FileInputStream(trainingDataFilePath)
i、 e.不接受输入并创建新输入流的lambda,因此可以推断为InputStreamFactory。
第二个错误更简单:调用方法时不应该指定参数的类型。只有在定义方法时。所以
NameFinderME.train("en",
"asian.person",
sampleStream,
TrainingParameters.defaultParams(),
TokenNameFinderFactory nameFinderFactory);
应该是
NameFinderME.train("en",
"asian.person",
sampleStream,
TrainingParameters.defaultParams(),
nameFinderFactory);
用简单的东西练习,学习Java语法。学习阅读错误消息,而不是忽略它们,并阅读您正在使用的类的javadoc。这是至关重要的。
我的要求是像这样分析句子。“给我找一本饥饿的潮汐书。”或者“饥饿的潮水或破碎的镜子,哪一个更好。”饥饿的潮汐和破碎的镜子是书的名字,为此我需要创建一个自定义模型,在给定的令牌数组中找到书的标题。因此,稍后我可以根据给定的句子创建一个查询。请让我知道我如何做到这一点,或者如果有任何其他方法来分析这样的句子。
目前为止,我们只是使用了 TensorFlow 的高级 API —— tf.keras,它的功能很强大:搭建了各种神经网络架构,包括回归、分类网络、Wide & Deep 网络、自归一化网络,使用了各种方法,包括批归一化、丢弃和学习率调度。事实上,你在实际案例中 95% 碰到的情况只需要tf.keras就足够了(和tf.data,见第 13 章)。现在来深入学习 TensorFlow 的低级 Py
我正在尝试为多个实体训练自定义NER模型。以下是示例训练数据: 方法采用字符串参数。这个参数有什么用途?还有,我如何为多个实体(例如,在我的例子中,,,)训练一个模型 }
在之前的描述中,我们通常把机器学习模型和训练算法当作黑箱子来处理。如果你实践过前几章的一些示例,你惊奇的发现你可以优化回归系统,改进数字图像的分类器,你甚至可以零基础搭建一个垃圾邮件的分类器,但是你却对它们内部的工作流程一无所知。事实上,许多场合你都不需要知道这些黑箱子的内部有什么,干了什么。 然而,如果你对其内部的工作流程有一定了解的话,当面对一个机器学习任务时候,这些理论可以帮助你快速的找到恰
在之前的描述中,我们通常把机器学习模型和训练算法当作黑箱子来处理。如果你实践过前几章的一些示例,你惊奇的发现你可以优化回归系统,改进数字图像的分类器,你甚至可以零基础搭建一个垃圾邮件的分类器,但是你却对它们内部的工作流程一无所知。事实上,许多场合你都不需要知道这些黑箱子的内部有什么,干了什么。 然而,如果你对其内部的工作流程有一定了解的话,当面对一个机器学习任务时候,这些理论可以帮助你快速的找到恰
我发现很难创建自己的openNLP模型。谁能告诉我,如何拥有自己的模型。培训应该如何进行。 输入应该是什么,输出模型文件将存储在哪里。