python-3.x - 如何在 Spacy 中优先考虑基于规则的匹配而不是经过训练的 NER 模型?
问题描述
我正在为生物医学文本(来自 Pubmed 的癌症论文)构建一个命名实体识别模型。我使用 spacy 为 3 种实体(疾病、基因和药物)类型训练了一个自定义 NER 模型。此外,我将模型与基于规则的组件相结合,以提高模型的准确性。
这是我当前的代码 -
# Loaded the trained NER Model
nlp = spacy.load("my_spacy_model")
# Define entity patterns for EntityRuler (just showing 2 relevant patterns here, it contains more patterns)
patterns = [{"label": "GENE", "pattern": "BRCA1"},
{"label": "GENE", "pattern": "BRCA2"}]
ruler = EntityRuler(nlp)
ruler.add_patterns(patterns)
nlp.add_pipe(ruler)
当我在以下文本上测试上述代码时 -
text = "Exceptional response to olaparib in BRCA2-altered breast cancer after PD-L1 inhibitor and chemotherapy failure"
我得到以下结果 -
DISEASE BRCA2-altered breast cancer
DRUG olaparib
GENE PD-L1
然而,正确的答案是——
GENE BRCA2
^^^^^^^^^^^
DISEASE breast cancer
^^^^^^^^^^^^^^^^^^^^^
DRUG olaparib
GENE PD-L1
该模型未识别BRCA2
为基因,我已将其添加到EntitytRuler
.
有没有办法将基于规则的匹配的预测优先于经过训练的模型?或者,我还能做些什么来通过结合基于规则的匹配来获得正确的结果?
解决方案
您可以在管道中的 NER 组件之前添加 EntityRuler:
nlp.add_pipe(ruler, before="ner")
或者告诉 EntityRuler 覆盖现有实体:
ruler = EntityRuler(nlp, overwrite_ents=True)
NER 预测在每种情况下可能略有不同,因为在第一个选项中,模型的预测可能会在存在现有实体跨度的情况下发生变化。
推荐阅读
- windows - 在 Windows 10 的 Qtcreator qbs 文件中导入 OpenCV .lib
- typescript - 我找不到关于如何将“.expire”转换为打字稿对象的 angular 6 解决方案
- sql - SQL JOIN 多个表,限制为 1
- javascript - 如何在手机上禁用脚本
- python - list.count() 表示列表中有两项时的一项
- verilog - 延迟后如何输出二进制数对应的方波?
- python - Pycharm在windows上找不到用pip安装的包或模块
- google-cloud-firestore - Firestore:获取服务器时间戳值以进行客户端时间比较
- javascript - 如果其连续元素是重复的,则通过保留该值的一个实例仅过滤掉该数组
- sql-server - 在没有 AVG 或 SUM 的 SQL Server 中将行透视到列