使用spaCy使用BIO方案注释文本

问题描述 投票:0回答:1

我需要使用基于规则方法的BIO方案来注释文本语料库(我有一个预定义的令牌及其标签列表)。我正在使用spaCy的EntityRuler类来完成这项任务。我的问题是,是否有一种利用spaCy实现BIO标记的简洁有效的方法?此外,我正在努力实现多令牌BIO标记:

 'He used sodium-bicarb 5 gr' -> 
['O', 'O', 'B-DRUG', 'I-DRUG', 'I-DRUG', 'B-STRENGTH', 'I-STRENGTH')

我有一个简单的(基于规则的)脚本来标记我感兴趣的实体:

import numpy as np
import pandas as pd
import spacy
from spacy.pipeline import EntityRuler

nlp = spacy.load('en')
ruler = EntityRuler(nlp).from_disk('drug_patterns.jsonl')
nlp.add_pipe(ruler, before='ner')


text = 'He has been prescribed ipratropium-albuterol a small dose of 20mg, denzapine and amil-co'
doc = nlp(text)

for ent in doc.ents:
    print(ent.text, ent.start_char, ent.end_char, ent.label_)

输出:

ipratropium 23 34 DRUG
20mg 61 65 STRENGTH
denzapine 67 76 DRUG
amil-co 81 88 DRUG

所以,我不知道如何将'amil-co'分成三个标签'B-DRUG, I-DRUG and I-DRUG'

理想情况下,我希望有以下注释:

    token          BIO
0   He             O
1   has            O
2   been           O
3   prescribed     O
4   ipratropium    B-DRUG
5   -              I-DRUG
6   albuterol      I-DRUG
7   a              O
8   small          O
9   dose           O
10  of             O
11  20             B-STRENGTH
12  mg             I-STRENGTH
13  ,              O
14  denzapine      B-DRUG
15  and            O
16  amil           B-DRUG
17  -              I-DRUG
18  co             I-DRUG
19  .              O

另外,在我的词汇drug_patterns.json中,我可能会出现一次相同的长令牌:

{"label": "DRUG", "pattern": [{"lower": "ipratropium"}]}
{"label": "DRUG", "pattern": [{"lower": "ipratropium"}, {"lower": "bromide"}]}
{"label": "DRUG", "pattern": [{"lower": "ipratropium"}, {"lower": "-"}, {"lower": "albuterol"}]}

而不是整个qazxsw poi将只选择第一个(最短的)令牌qazxsw poi(如输出中所示)。有没有一种简单的方法告诉spaCy选择最长的令牌?

任何想法将受到高度赞赏。

python annotations spacy
1个回答
1
投票

嗯,这是一个令人尴尬的简单解决方案,但希望其他人可能会感兴趣。只需使用令牌的ipratropium-albuterolipratropium属性。即:

.ent_iob_

然后可以轻松地将最后两列以适当的格式与连字符组合。 SpaCy很棒!

© www.soinside.com 2019 - 2024. All rights reserved.