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

Python 3.x 在Spacy中,如何将基于规则的匹配优先于经过训练的NER模型?,python-3.x,nlp,spacy,Python 3.x,Nlp,Spacy,我正在为Pubmed的生物医学文本癌症论文构建命名实体识别模型。我使用spacy为疾病、基因和药物类型3个实体训练了一个定制的NER模型。此外,我将模型与 这是我目前的密码- 加载经过训练的NER模型 nlp=spacy.loadmy\U spacy\U模型 为EntityRuler定义实体模式此处仅显示2个相关模式,它包含更多模式 模式=[{label:GENE,pattern:BRCA1}, {标签:基因,模式:BRCA2}] 标尺=EntityRulernlp 尺子。添加\u图案 nlp.

我正在为Pubmed的生物医学文本癌症论文构建命名实体识别模型。我使用spacy为疾病、基因和药物类型3个实体训练了一个定制的NER模型。此外,我将模型与

这是我目前的密码-

加载经过训练的NER模型 nlp=spacy.loadmy\U spacy\U模型 为EntityRuler定义实体模式此处仅显示2个相关模式,它包含更多模式 模式=[{label:GENE,pattern:BRCA1}, {标签:基因,模式:BRCA2}] 标尺=EntityRulernlp 尺子。添加\u图案 nlp.add_管尺 当我在以下文本中测试上述代码时-

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预测可能略有不同,因为在第一个选项中,模型的预测可能会随着现有实体跨度的存在而改变。

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

nlp.add_pipe(ruler, before="ner")
或者告诉EntityRuler覆盖现有实体:

ruler = EntityRuler(nlp, overwrite_ents=True)

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

我已经尝试在NER组件之前添加EntityRuler。这对于我在问题中分享的特定情况很有帮助,但是,更新后的模型无法标记它先前能够识别的实体。它学习我提供的基于规则的实体,但忘记了它以前标记的许多实体。我如何克服这个问题?我尝试使用overwrite_ents=True,结果如下-乳腺癌药物olaparib基因PD-L1无法识别BRCA2作为基因。我想这是因为在给定的句子中,BRCA2 altered是一个单词,我没有规则。你能解释一下overwrite_ents=True在做什么吗?我读了相关的,但无法理解它在做什么。然后我认为overwrite_ents=True是更好的选择。Ines在这里给出了一个很好的解释:如果EntityRuler实体的任何部分与现有实体重叠,甚至部分重叠,EntityRuler将删除现有实体并添加新的EntityRuler实体。感谢链接和解释。不过,我还有一个后续问题,使用overwrite_ents=True,它给出了以下结果——“疾病乳腺癌药物OLAPRIB基因PD-L1”`它无法识别BRCA2作为基因。我认为这是因为在给定的文本中,BRCA2作为一个词。因为我的模式中没有这个,所以它没有标记它。如何解决这个问题?我已经尝试在NER组件之前添加EntityRuler。这对于我在问题中分享的特定情况很有帮助,但是,更新后的模型无法标记它先前能够识别的实体。它学习我提供的基于规则的实体,但忘记了它以前标记的许多实体。我如何克服这个问题?我尝试使用overwrite_ents=True,结果如下-乳腺癌药物olaparib基因PD-L1无法识别BRCA2作为基因。我想这是因为在给定的句子中,BRCA2 altered是一个单词,我没有规则。你能解释一下overwrite_ents=True在做什么吗?我读了相关的,但无法理解它在做什么。然后我认为overwrite_ents=True是更好的选择。Ines在这里给出了一个很好的解释:如果EntityRuler实体的任何部分与现有实体重叠,甚至部分重叠,EntityRuler将删除现有实体并添加新的EntityRuler实体。感谢链接和解释。不过,我还有一个后续问题,使用overwrite_ents=True,它给出了以下结果——“疾病乳腺癌药物OLAPRIB基因PD-L1”`它无法识别BRCA2作为基因。我认为这是因为在给定的文本中,BRCA2作为一个词。因为我的模式中没有这个,所以它没有标记它。我怎样才能解决这个问题?