#python #pandas
#python #pandas
Вопрос:
У меня есть строка с тегом NLP в этом формате:
ABC [B-ORG] Funding [I-ORG] Angela [I-PER] Ham [I-PER] Stockholm [S-LOC] Chief Executive Officer n Head of XYZ [E-ORG]
Мне нужно создать для этого вывод df —
Text Label
ABC Funding ORG
Angela Ham PER
Stockholm LOC
Chief Executive Officer
Head of
XYZ ORG
Пожалуйста, рассмотрите —
1. что в приведенном выше примере также есть строки без тегов, такие как Chief Executive Officer Head of», и их следует сохранить.
2. В строке есть символы новой строки (n), которые должны привести к следующей строке в df.
3. Группировка одного и того же последовательного текста с метками, такого как «ABC Funding», должна выполняться, если между строками нет n.
Ответ №1:
- используйте регулярное выражение для извлечения частей (есть разные способы сделать это) и вставки в dataframe
import re
ner_parts = re.findall('([w ] )s(?:[w-([w] )]|n)', string)
df = pd.DataFrame(ner_parts, columns=['text', 'label'])
text label
0 ABC ORG
1 Funding ORG
2 Angela PER
3 Ham PER
4 Stockholm LOC
5 Chief Executive Officer
6 Head of XYZ ORG
- группируйте последовательные метки
groups = (~(df.label == df.label.shift())).cumsum()
groups.name = 'group' #just for nice look at the end result
groups
0 1
1 1
2 2
3 2
4 3
5 4
6 5
- группируйте текст вместе
def merge_text(group):
return pd.Series([group['text'].str.cat(), group['label'].iat[0]],index=['text', 'label'])
df.groupby(groups).apply(merge_text)
text label
group
1 ABC Funding ORG
2 Angela Ham PER
3 Stockholm LOC
4 Chief Executive Officer
5 Head of XYZ ORG
Комментарии:
1. Это действительно близко. Однако «Главный исполнительный директор» не появится после regrex. Также «Head of» должен быть просто другой строкой и не объединяться с XYZ.