nlp - 将自定义实体添加到 SpaCy 的 NER 时出现问题
问题描述
- 我使用https://spacy.io/usage/training#example-new-entity-type向 en_core_web_lg 添加了一个名为“orgName”的新实体
- 我所有的训练数据(26k 句子)都标有“orgName”。
- 为了解决灾难性的遗忘问题,我在这 26k 原始句子上运行 en_core_web_lg 并添加 ORG、PROD、FAC 等实体作为标签,而不是面对碰撞实体,我创建了重复项。因此,对于标记为“orgName”的句子 A,我创建了一个重复的 A2,其中包含 ORG、PROD、FAC 等,最终得到大约 52k 个句子。
- 我使用 100 次迭代进行了训练。
现在,问题是即使在训练句子上测试模型,它也没有显示 ORG、PROD、FAC 等,而只显示“orgName”。
你认为问题出在哪里?
解决方案
原则上,你试图解决灾难性遗忘问题的方式,通过重新训练它的旧预测,对我来说似乎是一个好方法。
但是,如果您有相同句子的重复版本,但注释不同,并将其提供给 NER 分类器,您可能会混淆模型。原因是它不仅看正面例子,而且还明确地将未注释的单词视为负面案例。
所以如果你有“Bob living in London”,而你只注释了“London”,那么它会认为 Bob 肯定不是 NE。如果然后你有第二个句子你只注释 Bob,它将“忘记”伦敦是一个 NE,因为现在它没有被注释。所以一致性真的很重要。
我建议实施更高级的算法来解决冲突。一种选择是总是只取最长的带注释的实体Span
。但如果跨度通常完全相同,您可能需要重新考虑您的标签方案。哪些实体最常发生碰撞?我会假设 ORG 和 OrgName?你真的需要ORG吗?也许两者可以“合并”为同一个实体?
推荐阅读
- snakemake - 我的工作流程忽略了通过 Inputfunction 决定的路径
- python - 使用 nibabel 以“SPM”样式保存 nifti
- docker - nginx conf 位置指令中的 if 语句在评估环境变量时抛出错误
- salt-stack - 如何实现等待其他小兵完成某些工作然后执行某些状态的状态?
- node.js - 如何阻止来自某些国家或地区的 api 访问?
- sqlite - 当我单击 mlflow 中的模型时出现错误
- javascript - 来自控制器的 SignalR 调用
- java - 为什么我们需要在同一个类中使用构造函数链接而不是使用方法?
- php - 如何加快或延迟 file_get_contents PHP 以抓取完整加载的页面?
- jupyter-notebook - 全新安装后,Jupyter notebook 要求输入密码