Python 使用spaCy使用BIO方案注释文本
我需要使用基于规则方法的BIO-scheme对文本语料库进行注释(我有一个预定义的标记及其标记列表)。我正在使用spaCy的Python 使用spaCy使用BIO方案注释文本,python,annotations,spacy,Python,Annotations,Spacy,我需要使用基于规则方法的BIO-scheme对文本语料库进行注释(我有一个预定义的标记及其标记列表)。我正在使用spaCy的EntityRuler类来完成此任务。我的问题是,是否有一种简洁有效的方法来实现spaCy的生物标记?此外,我正在努力实现多标记生物标记: 'He used sodium-bicarb 5 gr' -> ['O', 'O', 'B-DRUG', 'I-DRUG', 'I-DRUG', 'B-STRENGTH', 'I-STRENGTH') 我有一个简单的(基于规
EntityRuler
类来完成此任务。我的问题是,是否有一种简洁有效的方法来实现spaCy的生物标记?此外,我正在努力实现多标记生物标记:
'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"}]}
而不是整个异丙托品沙丁胺醇
将仅拾取第一个(最短)代币异丙托品
(如输出中所示)。有没有简单的方法告诉spaCy选择最长的令牌
任何想法都将受到高度赞赏。好吧,这是一个令人尴尬的简单解决方案,但希望其他人会感兴趣。只需使用令牌的
.ent\u iob\u
和.ent\u type\u
属性即可。即:
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
然后我们可以很容易地用连字符将最后两列以适当的格式组合起来。斯帕西很棒