Я нашел скрипт https://github.com/nkrnrnk/BertPunc для восстановления пунктуации. И у меня есть один вопрос об этом методе.
Я кратко объясню логику c автора. Для каждого слова назначается один из четырех токенов: Другое (0), ПЕРИОД (1), КОММА (2), ВОПРОС (3). Далее все слова конвертируются в токены BERT. Вот пример:
2045 0
2003 0
2200 0
2210 0
3983 0
2301 0
2974 0
1999 0
2068 2
Далее мы делаем отступы. Мы устанавливаем сегмент (например, восемь слов) и для каждого слова мы берем два слова перед токеном и четыре слова после токена. Также мы добавляем токен заполнения после каждого слова. Для самого первого слова нет слов раньше. Поэтому слово берется с конца. Аналогично, для последнего слова нет слов после, и поэтому слово берется с самого начала. Вот пример этого.
[1999, 2068, 2045, 0, 2003, 2200, 2210, 3983] 0
[2068, 2045, 2003, 0, 2200, 2210, 3983, 2301] 0
[2045, 2003, 2200, 0, 2210, 3983, 2301, 2974] 0
[2003, 2200, 2210, 0, 3983, 2301, 2974, 1999] 0
[2200, 2210, 3983, 0, 2301, 2974, 1999, 2068] 0
[2210, 3983, 2301, 0, 2974, 1999, 2068, 2045] 0
[3983, 2301, 2974, 0, 1999, 2068, 2045, 2003] 0
[2301, 2974, 1999, 0, 2068, 2045, 2003, 2200] 0
[2974, 1999, 2068, 0, 2045, 2003, 2200, 2210] 2
В первом столбце содержатся токены, а во втором столбце символы пунктуации. В первом столбце «0» соответствует заполнению. Далее мы делаем TensorDataset, а затем DataLoader. Во втором столбце «0» соответствует «другому», а «2» соответствует «периоду». Наконец, мы обучаем модель:
for inputs, labels in data_loader_train:
inputs, labels = inputs.cuda(), labels.cuda()
output = model(inputs)
Алгоритм работает хорошо, но я не понимаю следующее. Какой смысл ставить прокладку посередине? Может быть, мы можем сделать восстановление пунктуации с BERT более простым способом?