Sakha punctuation and capitalisation
Восстанавливает пунктуацию и заглавные буквы в тексте, который выдаёт распознаватель речи: строчными, без знаков препинания. Для якутского (саха) языка.
Обучена как разметка токенов с двумя головами поверх xlm-roberta-base.
Головы не разделены намеренно: решения зависят друг от друга — заглавная почти
всегда следует за точкой, и раздельные предсказания дают сочетания, которых в
языке не бывает.
Качество
Отложенная выборка — книги, которых не было в обучении.
| пунктуация | точность | P | R | F1 | примеров |
|---|---|---|---|---|---|
| общая | 92.37% | ||||
| NONE | 98.1 | 93.5 | 95.7 | 189 475 | |
| PERIOD | 96.8 | 97.4 | 97.1 | 19 080 | |
| COMMA | 68.1 | 82.7 | 74.7 | 23 760 | |
| QUESTION | 60.9 | 80.6 | 69.4 | 191 | |
| EXCLAM | 31.1 | 61.6 | 41.4 | 297 | |
| COLON | 24.8 | 66.9 | 36.2 | 740 | |
| DASH | 18.1 | 44.6 | 25.8 | 1 078 | |
| SEMICOLON | 5.1 | 39.0 | 9.1 | 59 |
| регистр | точность | P | R | F1 | примеров |
|---|---|---|---|---|---|
| общая | 97.16% | ||||
| LOWER | 98.2 | 98.6 | 98.4 | 189 601 | |
| TITLE | 93.4 | 92.1 | 92.7 | 41 852 | |
| UPPER | 82.6 | 76.7 | 79.5 | 3 227 |
Точка и запятая работают надёжно, и на них приходится 96% всех знаков в корпусе. Двоеточие, тире и точка с запятой — нет: их мало, и расставляются они по авторскому усмотрению, которое из одного предложения не выводится. Если нужен предсказуемый результат, используйте только точку и запятую.
Как обучалась
Метки берутся из книжного слоя, а не из транскриптов сегментов. Причина в том, что конечный знак предложения не имеет звукового выражения, выравниватель его не переносит, и в транскриптах он попросту отсутствует — а в книге есть.
Из корпуса исключены книги, чьё сканирование потеряло заглавные буквы. Без этого фильтра доля заглавных в части текстов падала почти до нуля, модель училась писать всё строчными, а отложенная выборка, набранная из тех же книг, этого не показывала: первая версия отчиталась о 98.22% по регистру, предсказывая «строчная» практически везде. После фильтра общая точность формально ниже (97.16%), но модель действительно различает все три класса.
Книги, читаемые в dev и test речевого корпуса, исключены — иначе оценка мерила бы запоминание тех же предложений.
Использование
import torch
from transformers import AutoTokenizer, AutoModel
ck = torch.load("punct_model.pt", map_location="cpu")
PUNCT = ck["punct_labels"] # NONE COMMA PERIOD QUESTION EXCLAM COLON SEMICOLON DASH
CASE = ck["case_labels"] # LOWER TITLE UPPER
class Tagger(torch.nn.Module):
def __init__(self, base, hidden=768):
super().__init__()
self.enc = AutoModel.from_pretrained(base)
self.drop = torch.nn.Dropout(0.1)
self.punct = torch.nn.Linear(hidden, len(PUNCT))
self.case = torch.nn.Linear(hidden, len(CASE))
def forward(self, input_ids, attention_mask):
h = self.drop(self.enc(input_ids=input_ids,
attention_mask=attention_mask).last_hidden_state)
return self.punct(h), self.case(h)
model = Tagger(ck["base"])
model.load_state_dict(ck["state_dict"])
model.eval()
tok = AutoTokenizer.from_pretrained(".")
Метки привязаны к первому под-токену каждого слова — там энкодер сосредотачивает информацию о слове целиком; остальные под-токены при обучении исключались из функции потерь, и при применении их надо игнорировать так же.
Готовый скрипт применения — punctuate.py: он принимает слова по одному в
строке и обрабатывает их перекрывающимися окнами, чтобы слово у края окна всё
равно решалось с контекстом с обеих сторон.
Ограничения
Обучена на литературном книжном тексте. На спонтанной речи расстановка конечных точек заметно слабее: в начитке предложение кончается там, где стоит точка в книге, а в живой речи граница задаётся паузой, которой модель не видит — она работает только с текстом.
Редкие знаки (:, —, ;) предсказываются плохо, см. таблицу.
Model tree for lab-ii/sakha-punctuation
Base model
FacebookAI/xlm-roberta-base