File size: 1,558 Bytes
7ed86c3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
"""Pack OGA sentences into char-arm model batches, token-aligned.

char arm: tagger.dataset.encode_sentence (raw FORM encoding) -> Stoicheia (word-pooled).
Skips exactly the tokens tagger.dataset.encode_word() rejects (no Greek letters).

NOTE: this release drops the lemma-arm packing helpers (LemmaVocabMap, tag_sentences,
pack_lemma_rows, batch_lemma) that fed a LemmaDiff-grc encoder — LemmaDiff-grc is a separate,
unpublished side-repo. See parser/model.py's module docstring for the rationale.
"""
from __future__ import annotations

import numpy as np
import torch

from tagger.dataset import encode_sentence, batch_rows as char_batch_rows, pack_rows as char_pack_rows


def n_encodable(sent):
    return sum(1 for t in sent.tokens if encode_sentence_word_ok(t.form))


def encode_sentence_word_ok(form):
    from tagger.dataset import encode_word
    return encode_word(form) is not None


# ---------------------------------------------------------------- char arm (reuse tagger's)

def pack_char_rows(sents, T=2048, W=384):
    encs = [encode_sentence(s) for s in sents]
    pairs = [(i, e) for i, e in enumerate(encs) if e is not None]
    rows, trunc = char_pack_rows([e for _, e in pairs], T, W)
    return rows, pairs, trunc


def batch_char(rows, T, W, device):
    b = char_batch_rows(rows, T, W)
    return {k: (v.to(device) if torch.is_tensor(v) else v) for k, v in b.items()}, b["slots"]

# lemma-arm packing helpers (LemmaVocabMap, tag_sentences, pack_lemma_rows, batch_lemma) removed
# for this release — see module docstring above.