如何在 Spacy 中优先考虑基于规则的匹配而不是训练有素的 NER 模型?

iCH*_*AIT 1 nlp python-3.x spacy

我正在为生物医学文本(来自 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)
Run Code Online (Sandbox Code Playgroud)

当我在以下文本中测试上述代码时 -

text = "Exceptional response to olaparib in BRCA2-altered breast cancer after PD-L1 inhibitor and chemotherapy failure"
Run Code Online (Sandbox Code Playgroud)

我得到以下结果 -

DISEASE  BRCA2-altered breast cancer
DRUG  olaparib
GENE PD-L1
Run Code Online (Sandbox Code Playgroud)

然而,正确答案是——

GENE BRCA2
^^^^^^^^^^^
DISEASE breast cancer
^^^^^^^^^^^^^^^^^^^^^
DRUG  olaparib
GENE PD-L1
Run Code Online (Sandbox Code Playgroud)

该模型未识别BRCA2为基因,我已将其添加到EntitytRuler.

有没有办法将基于规则的匹配的预测优先于经过训练的模型?或者,我还能做些什么来通过结合基于规则的匹配来获得正确的结果?

aab*_*aab 5

您可以在管道中的 NER 组件之前添加 EntityRuler:

nlp.add_pipe(ruler, before="ner")
Run Code Online (Sandbox Code Playgroud)

或者告诉 EntityRuler 覆盖现有实体:

ruler = EntityRuler(nlp, overwrite_ents=True)
Run Code Online (Sandbox Code Playgroud)

在每种情况下,NER 预测可能略有不同,因为在第一个选项中,模型的预测可能会因现有实体跨度的存在而发生变化。