перевод строки в табличный python

#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:

  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

  
  1. группируйте последовательные метки
 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
  
  1. группируйте текст вместе
 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.