目前,在spaCy中,可以使用ent_iob_
属性(docs)获取令牌的IOB标签。 e.g:
>>> import spacy
>>> nlp = spacy.load('en')
>>> doc = nlp(u'My name is George Washington Singer, and I am an Englishman')
>>> [i.ent_iob_ for i in doc]
[u'O', u'O', u'O', u'B', u'I', u'I', u'O', u'O', u'O', u'O', u'O', u'B']
然而,在训练模型时,spacy需要BILUO(docs)。有没有办法将现成的IOB标签转换为BILUO,或直接获取BILUO标签?
Spacy版本1.8
答案 0 :(得分:3)
要将IOB转换为BILUO,spacy.gold具有_iob_to_biluo
函数。
>>> import spacy
>>> from spacy.gold import _iob_to_biluo
>>> nlp = spacy.load('en')
>>> doc = nlp(u'My name is George Washington Singer, and I am an Englishman')
>>> iobs = [i.ent_iob_ for i in doc]
>>> iob_to_biluo(iobs)
[u'O', u'O', u'O', u'B-', u'I-', u'L-', u'O', u'O', u'O', u'O', u'O', u'U-']
可以找到来源here。
答案 1 :(得分:0)
扩展 LukeG 的答案,如果您更喜欢获得完整的令牌(例如 O
、U-PER
、B-ORG
、I-ORG
),这应该有效(使用 spaCy 3.0 测试.5).
import spacy
from spacy.training import iob_to_biluo # this used to be in spacy.gold, changed in ver 3
nlp = spacy.load("en_core_web_lg")
doc = nlp("Germany is a country in Europe")
iob = [f"{token.ent_iob_}-{token.ent_type_}" if token.ent_iob_ != "O" else "O" for token in doc]
biluo = iob_to_biluo(iob)
print(biluo)
结果:
['U-GPE', 'O', 'O', 'O', 'O', 'U-LOC']
除了连接 iob 前缀和实体类型之外,找不到任何方法。