Как разбить предложения на Id предложения, слова и метки с pandas? - PullRequest
0 голосов
/ 29 апреля 2020

Я хочу преобразовать мой pandas фрейм данных в формат, который можно использовать в моделях NER.

У меня есть pandas фрейм данных, подобный этому:

```
Sentence_id    Sentence                                                       labels
1              Did not  enjoy the new Windows 8 and touchscreen functions.    Windows 8
1              Did not  enjoy the new Windows 8 and touchscreen functions.    touchscreen functions
```

Is его можно преобразовать в следующий формат: 100

```
Sentence_id    words          labels                                                       
1              Did            O
1              not            O
1              enjoy          O
1              the            O
1              new            O
1              Windows        B
1              8              I
1              and            O
1              touchscreen    B
1              functions      I
1              .              O
```

Первое слово в метках должно быть помечено как «B» (Начало), следующие слова в метках должны быть помечены как «I» (Внутри). Другие слова и знаки препинания должны быть помечены как O (Снаружи).

1 Ответ

0 голосов
/ 29 апреля 2020

Решение немного длинное. Но вы можете сделать это, используя df.iterrows().

import string

ids = df.Sentence_id.unique().tolist()     ## Assuming name of your dataframe is df
sentences = df.Sentence.unique().tolist()
labels = df.labels.unique().tolist()

def get_label(word, labels):
  if word == labels[0]:
    return 'B'
  elif word in labels and word!= labels[0]:
    return 'I'
  else:
    return 'O'

data = {}
exclude = set(string.punctuation)
for _, row in df.iterrows():
  words = ''.join(ch for ch in row['Sentence'] if ch not in exclude).split()
  puncts = ''.join(ch for ch in row['Sentence'] if ch in exclude).split()
  labels = row['labels'].split()
  for word in words: 
    if word in data:
      if word in labels:
        data[word][1] =  get_label(word, labels)
    else:
      data[word] = [row['Sentence_id'], get_label(word, labels)]
    for punct in puncts:
      data[punct] = [row['Sentence_id'],'O']

## Processing the dictionary to input into dataframe
ids = []
words = []
labels = []
for key, val in data.items():
  words.append(key)
  ids.append(data[key][0])
  labels.append(data[key][1])
new_df = pd.DataFrame({'Sentence_id':ids, 'words':words, 'labels':labels})
new_df

    Sentence_id words   labels
0   1           Did     O
1   1           .       O
2   1           not     O
3   1           enjoy   O
4   1           the     O
5   1           new     O
6   1           Windows B
7   1           8       I
8   1           and     O
9   1       touchscreen B
10  1         functions I
...