修复自定义OpenNLP NER模型

时间:2019-05-14 23:33:05

标签: java opennlp ner

我们有一个报告编写工具,我们正在尝试向其中添加搜索功能。本质上,用户将能够根据句子中的标准键入问题并获得报告。我们正在尝试尽可能保持开放性,不需要特定的句子结构,这就是为什么我们考虑尝试OpenNLP NER。

一个例子是:

“上个季度的艺术出席率是什么”

标记为:

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

我们尝试用不同的部门,过滤器等来提出问题的许多不同变体。我们仍然不是仅以14.6k的速度将15k变成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”作为过滤器以及“ cartoon”作为计算。

我猜我们的培训问题彼此相似,现在假设“原为”之后是部门。
1.这是一个正确的假设吗?有没有更好的方法来训练这些模型?
2.将每个实体分解成自己的模型的最佳选择是吗?
我确实尝试过此方法,但后来进行了105项单元测试,因此失败了,希望首先尝试更简单的方法,大声笑。

我在这里也阅读了有关自定义NER模型的多个主题,但是我发现的大部分内容都是如何开始的。还有一个关于多个实体模型不起作用的话题。我忘记了发帖人的位置,我发现将null用作类型可以让您在同一模型中标记多个类型,而且效果似乎很好。

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

在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

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

  

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

根据我的测试和结果,我得出的结论是,单词的顺序和样式起着重要作用。我没有任何文档支持。同样,我找不到任何可以通过OpenNLP解决的东西。

  
      
  1. 将每个实体分解成自己的模型的最佳选择是什么?
  2.   

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

我们最终要做的是切换到StanfordNLP NER模型。您仍然可以围绕域特定语言进行自定义实现,并可以选择关闭属性文件中的排序:

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

StanfordNLP中自定义NER的参考: Stanford CoreNLP: Training your own custom NER tagger