如何在spaCy中获取令牌的BILUO标签?

时间:2017-07-13 15:23:22

标签: python nlp spacy

目前,在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

2 个答案:

答案 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 的答案,如果您更喜欢获得完整的令牌(例如 OU-PERB-ORGI-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 前缀和实体类型之外,找不到任何方法。