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: он принимает слова по одному в строке и обрабатывает их перекрывающимися окнами, чтобы слово у края окна всё равно решалось с контекстом с обеих сторон.

Ограничения

Обучена на литературном книжном тексте. На спонтанной речи расстановка конечных точек заметно слабее: в начитке предложение кончается там, где стоит точка в книге, а в живой речи граница задаётся паузой, которой модель не видит — она работает только с текстом.

Редкие знаки (:, , ;) предсказываются плохо, см. таблицу.

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for lab-ii/sakha-punctuation

Finetuned
(4205)
this model