当前位置: 首页 > 知识库问答 >
问题:

修复自定义OpenNLP NER模型

山高峰
2023-03-14

我们有一个报告编写工具,我们正在尝试添加搜索功能。基本上,用户可以输入一个问题,并根据句子中的标准返回一份报告。我们正在尽可能地保持开放性,不需要特定的句子结构,这就是为什么我们想尝试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 last Cartono是什么”,你会得到“Bugs”作为一个部门,“Bunny”作为一个过滤器,“Cartony”作为一个计算。

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

我也读了很多关于自定义NER模型的文章,但我发现的大部分是如何启动一个。还有一个关于多实体模型如何不起作用的线索。我忘了帖子在哪里了,我发现在类型中输入null可以在同一个模型中标记多个类型,而且它似乎工作得相当好。

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

提前感谢任何和所有的帮助!

共有1个答案

拓拔俊艾
2023-03-14

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

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

根据我的测试和结果,我的结论是肯定的,单词的顺序和模式起到了一定的作用。但我没有任何文件支持这一点。我也找不到任何东西可以绕过OpenNLP。

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

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

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

斯坦福大学CoreNLP:培训你自己的定制标签

 类似资料:
  • 如果您是一位经验丰富的ML开发人员,而且ML Kit的预训练的模型不能满足您的需求,您可以通过ML Kit使用定 的TensorFlow Lite模型。 使用Firebase托管您的TensorFlow Lite模型或将其与您的应用程序打包在一起。然后,使用ML Kit SDK来使用您的自定义模型的最佳版本构建应用。如果您使用Firebase托管您的模型,ML Kit会自动更新您的用户的所用版本。

  • 需要 10.2.0+ 您可以在*.vue文件中定义自定义语言块。 自定义块的内容将由在vue-loader'选项的loaders对象中指定的加载器处理,然后由组件模块require。 配置类似于[先进的Loader配置](../ configurations / advanced.md)中描述的配置,除了匹配使用标记名称而不是lang`属性。 如果找到一个自定义块的匹配加载器,它将被处理; 否则将

  • 问题内容: 在我正在使用的新Web应用程序上使用自定义字体时,我一直遇到一个奇怪的问题。 此自定义字体(FF DIN)似乎自然具有垂直的偏心线高,这迫使我放置一些padding-tophack以补偿元素(如按钮和输入)的顶部空间。 示例:绿色字体(Helvetica Neue)正确对齐,而我们使用的自定义字体(FF DIN)垂直偏离中心: 有没有已知的方法可以自然地解决CSS上的居中问题,从而以某

  • 我有一个包括几个子模式的用户模式。我有两个相似的子模式,其中一个是可以识别的,但另一个是一直未定义的。我的用户架构如下: 在上面的模式中,我有一个项目在post路线中工作得很好。表单已正确发布、保存和显示,但无法发布跟踪器的相同路由,并给出“跟踪器未定义”错误: 项目后路由: 以下是追踪者的帖子: 请注意,项目模式和跟踪器模式都保存在一个模型文件夹中,并且在app.js中是必需的

  • 主要内容:自定义模块编写说明文档到目前为止,读者已经掌握了导入 Python 标准库并使用其成员(主要是函数)的方法,接下来要解决的问题是,怎样自定义一个模块呢? 前面章节中讲过,Python 模块就是 Python 程序,换句话说,只要是 Python 程序,都可以作为模块导入。例如,下面定义了一个简单的模块(编写在 demo.py 文件中): 可以看到,我们在 demo.py 文件中放置了变量(name 和 add)、函数(

  • 从MinDoc v0.13及以上版本开始支持自定义模板(仅Markdown编辑器)。 创建自定义模板 用户可在编辑项目时将编辑器内的内容报错为模板: 点击保存按钮右侧的公文包按钮会弹出保存为模板的界面: 填写模板名称点击立即保存即可。 全局模板是指,在其他项目中可用,目前仅支持管理员保存全局模板,非管理员及时选中了全局,保存时也是仅项目内可用。 使用自定义模板 点击编辑器上的模板按钮可以显示选择模