Python - Преобразование распознавания именованных объектов с помощью тегов BILOU?
Я пытаюсь преобразовать NER с тегами BILOU, но есть немного документации о тегах BILOU, кроме того, что я нашел здесь. Я даже не могу найти реализацию в кодировании, кроме как в SpaCy, но только для английского языка. На этом сайте есть реализация кодирования тегов Conll IOB, которую я пытаюсь преобразовать в теги BILOU. От
[(Ирфан,PER),(Hanandra,PER),(Пратам,PER)]
в
[(Ирфан,B-PER),(Hanandra I-PER),(Пратам 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), (Ирфан,PER)]
когда это должно быть так
[(Siapa,U-QUEST),(Ирфан U-PER)
Где ошибка в моем алгоритме?