繁体   English   中英

修复自定义OpenNLP NER模型

[英]Fixing a custom OpenNLP NER model

我们有一个报告编写工具,我们正在尝试添加搜索功能。 基本上,用户可以输入问题并根据句子中的标准返回报告。 我们试图尽可能保持开放性,不需要特定的句子结构,这就是为什么我们想要尝试OpenNLP NER。

一个例子是:

“上季度的艺术出席率是多少”

标记为:

what was <START:dept> Arts <END> <START:filter> attendance <END> last <START:calc> quarter <END>

我们试图通过不同的部门,过滤器等提出许多不同的问题变体。我们仍然只有14.6k的15k,所以仍然努力。

至于分析问题,这是它的开始:

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'作为过滤器,'卡通'作为计算。

我猜测我们的训练问题是彼此相似的,现在它假设跟随“什么是”是一个部门。
1.这是一个正确的假设,是否有更好的方法来训练这些模型?
2.将每个实体分解为自己的模型是最好的选择吗? 我确实尝试了这个并且有105个单元测试后来失败了,所以希望先尝试更简单的东西,哈哈。

此外,我在这里阅读了关于自定义NER模型的多个线程,但我发现的大多数是如何启动它。 还有一个关于多个实体模型如何不起作用的线索。 我忘了帖子在哪里我发现将null放入类型允许你在同一个模型中标记多个类型,它似乎工作得相当好。

 tokenNameFinderModel = NameFinderME.train("en", null, sampleStream, TrainingParameters.defaultParams(), new TokenNameFinderFactory()); 
 tokenNameFinderModel.serialize(modelOut);

在此先感谢您的帮助!

我们的最终目标是能够训练我们分类的某些单词的模型,并且必须正确地对每个单词进行分类,而不管句子结构如何。 在OpenNLP中,我们无法实现这一目标。

我猜测我们的训练问题是彼此相似的,现在它假设跟随“什么是”是一个部门。
1.这是一个正确的假设,是否有更好的方法来训练这些模型?

根据我的测试和结果,我得出结论是,单词的顺序和模式起了作用。 我没有任何文件可以支持。 我也找不到任何可以解决OpenNLP的问题。

  1. 将每个实体分解为自己的模型是最好的选择吗?

根据经验和测试,我正在尽可能地解决单独的模型,这是最好的培训方式。 不幸的是,即使采用这种方法,我们仍然无法实现我们的目标。

最终我们采取了切换到StanfordNLP NER模型的方法。 您仍然可以围绕特定于域的语言执行自定义实现,并可以选择在属性文件中关闭排序:

usePrev=false
useNext=false
useDisjunctive=false
useSequences=false
usePrevSequences=false

StanfordNLP中的自定义NER参考: Stanford CoreNLP:培训您自己的自定义NER标记器

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM