【问题标题】:Fixing a custom OpenNLP NER model修复自定义 OpenNLP NER 模型
【发布时间】: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


    【解决方案1】:

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

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-31
      • 1970-01-01
      • 2020-08-30
      • 1970-01-01
      相关资源
      最近更新 更多