好的,我有以下代码来训练OpenNLP的NER标识符
FileReader fileReader = new FileReader("train.txt");
ObjectStream fileStream = new PlainTextByLineStream(fileReader);
ObjectStream sampleStream = new NameSampleDataStream(fileStream);
TokenNameFinderModel model = NameFinderME.train("pt-br", "train", sampleStream, Collections.<String, Object>emptyMap());
nfm = new NameFinderME(model);
我不知道如果缺少某些东西我是否做错了,但分类不起作用。我假设train.txt错了。
发生的错误是所有令牌只分类为一种类型。
我的train.txt数据类似于以下示例,但有更多的条目变化和数量。另一件事是我每次都会逐字逐句地分类,而不是所有的标记。
<START:distance> 8000m <END>
<START:temperature> 100ºC <END>
<START:weight> 50kg <END>
<START:name> Renato <END>
有人可以证明我做错了吗?
答案 0 :(得分:22)
您的训练数据不正常。
您应该将所有实体放在句子中的上下文中:
At an altitude of <START:distance> 8000m <END> the temperature of boiling water is less than <START:temperature> 100ºC <END> .
The climber <START:name> Renato <END> is carrying <START:weight> 50kg <END> of equipment.
如果您的训练数据来自真实世界的句子,并且您所分类的句子具有相同的风格,那么您将获得更好的结果。例如,如果您要处理新闻,则应该使用报纸语料库进行培训。
此外,您需要数千个句子来构建您的模型!也许你可以从一百个开始引导并使用可怜的模型来改进你的语料库并再次训练你的模型。
当然,您应该对一个句子的所有标记进行分类,否则将无法确定实体的类型。