我正在尝试使用BILOU标签转换NER,但是除了我在here中找到的内容之外,几乎没有关于BILOU标签的文档。除了SpaCy外,我什至找不到编码实现,而仅针对英语。我尝试将site的Conll IOB标签编码实现为BILOU标签。 来自
[((Irfan,PER),(Hanandra,PER),(Pratama,PER)]
进入
[((Irfan,B-PER),(Hanandra,I-PER),(Pratama,L-PER)]
这是我的代码:
def to_bilou(teranotisasi):
#print(teranotisasi)
proper_bilou_token = []
for idx, teranotisasi_token in enumerate(teranotisasi):
kata, tag, ner = teranotisasi_token
if ner != 'O':
nersesudah = teranotisasi[idx+1][2]
nersebelum = teranotisasi[idx-1][2]
if idx == 0:
if nersesudah != ner:
ner = "U-" + ner
elif nersebelum == 'O':
if nersesudah == 'O':
ner = "U-" + ner
elif nersesudah == ner:
ner = "B-" + ner
elif nersebelum == ner:
if nersesudah == 'O':
ner = "L-" + ner
else:
ner = "I-" + ner
# elif nersebelum != ner:
# if nersesudah == 'O':
# ner = "U-" + ner
proper_bilou_token.append((kata, tag, ner))
return proper_bilou_token
但是当两个不同的NER标签相遇(不是O)时会出现问题,例如 LOC符合PER 或 LOC符合ORG 时,它就不会使用BILOU标签进行编码
[(Siapa,QUEST),(Irfan,PER)]
什么时候应该这样
[(Siapa,U-QUEST),(Irfan,U-PER)
我的算法中的错误在哪里?