【发布时间】:2019-05-21 04:01:02
【问题描述】:
我们有一个报告编写工具,我们正在尝试为其添加搜索功能。本质上,用户将能够输入问题并根据句子中的标准获得报告。我们尽量保持开放式,不需要特定的句子结构,这就是我们考虑尝试 OpenNLP NER 的原因。
一个例子是:
“上个季度的艺术出勤率是多少”
标记为:
what was <START:dept> Arts <END> <START:filter> attendance <END> last <START:calc> quarter <END>
我们已经尝试针对不同的部门、过滤器等提出许多不同的问题变体。我们仍然没有达到 15k,只有 14.6k,所以仍在朝着这个方向努力。
就分析问题而言,这是它的开始:
InputStream tokenStream = getClass().getResourceAsStream("/en-token.bin"); //$NON-NLS
TokenizerModel tokenModel = new TokenizerModel(tokenStream);
Tokenizer tokenizer = new TokenizerME(tokenModel);
for (String name : modelNames) {
tokenizedQuestion = tokenizer.tokenize(question);
String alteredQuestion = question;
TokenNameFinderModel entityModel = new TokenNameFinderModel(getClass().getResourceAsStream(name));
NameFinderME nameFinder = new NameFinderME(entityModel);
Span[] nameSpans = nameFinder.find(tokenizedQuestion);
for (Span span : nameSpans) {
if (span.getType().equals("dept")) {
deptList.add(span);
} else if (span.getType().equals("filter")) {
filterList.add(span);
} else if (span.getType().equals("calculation"){
calculationList.add(span);
}
}
现在的问题是,如果您输入“Bugs Bunny 上一部卡通片是什么” 'Bugs' 作为部门,'Bunny' 作为过滤器,'cartoon' 作为计算。
我猜我们的培训问题彼此相似,现在假设“过去是”后面的内容是一个部门。
1. 这是一个正确的假设吗?是否有更好的方法来训练这些模型?
2. 将每个实体分解成自己的模型是最好的选择吗?我确实尝试过这个,并且有 105 个单元测试后来都失败了,所以希望先尝试一些更简单的东西,哈哈。
我还在这里阅读了有关自定义 NER 模型的多个主题,但我发现的大部分内容是如何启动一个。还有一个关于多个实体模型如何不起作用的线程。我忘记了帖子是在哪里发现的,为类型添加 null 可以让您在同一模型中标记多个类型,它似乎工作得相当好。
tokenNameFinderModel = NameFinderME.train("en", null, sampleStream, TrainingParameters.defaultParams(), new TokenNameFinderFactory());
tokenNameFinderModel.serialize(modelOut);
提前感谢您的任何帮助!
【问题讨论】:
标签: java opennlp named-entity-recognition