我如何在OpenNLP中训练命名实体识别器标识符?

Ren*_*ani 9 java nlp named-entity-recognition opennlp

好的,我有以下代码来训练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); 
Run Code Online (Sandbox Code Playgroud)

我不知道如果缺少某些东西我是否做错了,但分类不起作用.我假设train.txt错了.

发生的错误是所有令牌都只分类为一种类型.

我的train.txt数据类似于以下示例,但具有更多的条目变化和数量.另一件事是我每次都是从文本中逐字逐句地分类,而不是所有的标记.

<START:distance> 8000m <END>
<START:temperature> 100ºC <END>
<START:weight> 50kg <END>
<START:name> Renato <END>
Run Code Online (Sandbox Code Playgroud)

有人可以证明我做错了吗?

wco*_*len 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.
Run Code Online (Sandbox Code Playgroud)

如果您的训练数据来自真实世界的句子,并且您所分类的句子具有相同的风格,那么您将获得更好的结果.例如,如果您要处理新闻,则应使用报纸语料库进行培训.

您还需要数千个句子来构建您的模型!也许你可以从一百个开始引导并使用可怜的模型来改进你的语料库并再次训练你的模型.

当然,您应该对句子的所有标记进行分类,否则将无法确定实体的类型.