gpt4 book ai didi

python - 使用 spaCy 通过 BIO 方案注释文本

转载 作者:行者123 更新时间:2023-12-03 08:56:35 25 4
gpt4 key购买 nike

我需要根据规则方法使用 BIO 方案注释文本语料库(我有一个预定义的标记及其标签列表)。我使用 spaCy 的 EntityRuler 类来完成此任务。我的问题是是否有一种简洁有效的方法来使用 spaCy 实现 BIO 标记?另外,我正在努力实现多 token 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和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"}]}

它将仅选择第一个(最短)标记ipratropium(如输出中所示),而不是整个ipratropium-albuterol。有没有一种简单的方法告诉 spaCy 选择最长的标记?

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

最佳答案

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

pd.DataFrame([(e.text, e.ent_iob_, e.ent_type_) for e in doc])


0 1 2
0 He O
1 has O
2 been O
3 prescribed O
4 ipratropium B DRUG
5 - O
6 albuterol O
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

然后可以使用连字符以适当的格式轻松组合最后两列。 SpaCy 太棒了!

关于python - 使用 spaCy 通过 BIO 方案注释文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54871122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com