如何在Spacy中将基于规则的匹配优先于经过训练的NER模型?

时间:2019-08-29 05:38:48

标签: python-3.x nlp spacy

我正在为生物医学文本(Pubmed的癌症论文)建立命名实体识别模型。我使用spacy训练了3种实体(DISEASE,GENE和DRUG)类型的自定义NER模型。此外,我将模型与rule based components to improve the accuracy of my model组合在一起。

这是我当前的代码-


# 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的模式中添加了该基因。

是否有一种方法可以将基于规则的匹配的预测优先于已训练的模型?另外,我还有其他方法可以通过结合基于规则的匹配来获得正确的结果吗?

1 个答案:

答案 0 :(得分:2)

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

nlp.add_pipe(ruler, before="ner")

或告诉EntityRuler覆盖现有实体:

ruler = EntityRuler(nlp, overwrite_ents=True)

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