9

好的,我有以下代码来训练来自 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>

有人可以证明我做错了什么?

4

1 回答 1

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.

如果您的训练数据来自现实世界的句子并且与您正在分类的句子具有相同的风格,您将获得更好的结果。例如,如果您要处理新闻,您应该使用报纸语料库进行训练。

此外,您将需要数千个句子来构建您的模型!也许您可以从 100 开始引导并使用较差的模型来改进您的语料库并再次训练您的模型。

当然你应该对一个句子的所有标记进行分类,否则将没有上下文来决定一个实体的类型。

于 2011-08-05T09:45:32.987 回答