Token Classification
Transformers
Safetensors
ONNX
Transformers.js
modernbert
punctuation
punctuation-restoration
asr
speech-recognition
transcription
mmbert
Instructions to use seamon67/Punctuation-Restoration with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use seamon67/Punctuation-Restoration with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("token-classification", model="seamon67/Punctuation-Restoration")# pip install -U transformers accelerate # Load model directly from transformers import AutoTokenizer, AutoModelForTokenClassification tokenizer = AutoTokenizer.from_pretrained("seamon67/Punctuation-Restoration") model = AutoModelForTokenClassification.from_pretrained("seamon67/Punctuation-Restoration", device_map="auto") - Transformers.js
How to use seamon67/Punctuation-Restoration with Transformers.js:
// npm i @huggingface/transformers import { pipeline } from '@huggingface/transformers'; // Allocate pipeline const pipe = await pipeline('token-classification', 'seamon67/Punctuation-Restoration'); - Notebooks
- Google Colab
- Kaggle
Download code/punct/build_evals.py from seamon67/Punctuation-Restoration: direct link, hf CLI and curl.
- Browser
- Download file 4.25 kB
-
https://huggingface.co/seamon67/Punctuation-Restoration/resolve/main/code/punct/build_evals.py
- Command line
-
hf download hf://seamon67/Punctuation-Restoration/code/punct/build_evals.py
-
curl -L -o build_evals.py https://huggingface.co/seamon67/Punctuation-Restoration/resolve/main/code/punct/build_evals.py
4.25 kB
| """Evaluation sets for punctuation restoration (evaluation only, never training). python punct/build_evals.py OUT_DIR (CPU job) | |
| - flores: FLORES-200 devtest (CC-BY-SA-4.0): consecutive sentences of the same source article joined into one paragraph | |
| (written news / travel / wiki text, all languages but those in common.SKIP). | |
| - ted: TED2020 (OPUS; CC-BY-NC-ND-4.0) talk transcripts and their translations: 5 consecutive subtitle sentences, 200 | |
| paragraphs per language (spoken style). | |
| - europarl: Europarl v8 (OPUS): 5 consecutive sentences, 200 per language, the 12 languages of kredor/punctuate-all. | |
| oliverguhr/fullstop-* and kredor/punctuate-all were trained on Europarl, so this set is in-domain for them. | |
| Output OUT_DIR/{set}.parquet: text (original, punctuated), lang (FLORES-style code), doc. | |
| """ | |
| import io, os, random, sys, tarfile, urllib.request, zipfile | |
| import pandas as pd | |
| sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) | |
| from common import SKIP, units | |
| OUT = sys.argv[1]; os.makedirs(OUT, exist_ok=True) | |
| rng = random.Random(0) | |
| def get(url): | |
| for k in range(5): | |
| try: | |
| return urllib.request.urlopen(url, timeout=900).read() | |
| except Exception as e: | |
| print("retry", url, e, flush=True) | |
| raise RuntimeError(url) | |
| # FLORES-200 devtest | |
| tf = tarfile.open(fileobj=io.BytesIO(get("https://dl.fbaipublicfiles.com/nllb/flores200_dataset.tar.gz"))) | |
| files = {m.name: m for m in tf.getmembers() if m.isfile()} | |
| meta = next(n for n in files if n.endswith("metadata_devtest.tsv")) | |
| md = pd.read_csv(tf.extractfile(files[meta]), sep="\t") | |
| urls = md.URL.tolist() | |
| rows = [] | |
| for n in sorted(files): | |
| if "/devtest/" not in n or not n.endswith(".devtest"): | |
| continue | |
| code = os.path.basename(n)[:-8] | |
| if code in SKIP: | |
| continue | |
| sents = tf.extractfile(files[n]).read().decode("utf-8").split("\n")[:len(urls)] | |
| cur, doc = [], None | |
| for s, u in zip(sents, urls): | |
| if u != doc and cur: | |
| rows.append((("" if code.startswith(("zho", "jpn", "yue")) else " ").join(cur), code, doc)); cur = [] | |
| cur.append(s.strip()); doc = u | |
| if cur: | |
| rows.append((" ".join(cur), code, doc)) | |
| pd.DataFrame(rows, columns=["text", "lang", "doc"]).to_parquet(f"{OUT}/flores.parquet") | |
| print("flores", len(rows), len({r[1] for r in rows}), flush=True) | |
| def opus(corpus, ver, l2, code, n=200, k=5): | |
| a, b = sorted([l2, "en"]) if l2 != "en" else ("de", "en") | |
| z = zipfile.ZipFile(io.BytesIO(get(f"https://object.pouta.csc.fi/OPUS-{corpus}/{ver}/moses/{a}-{b}.txt.zip"))) | |
| name = next(x for x in z.namelist() if x.endswith(f".{a}-{b}.{l2}")) | |
| lines = z.read(name).decode("utf-8").split("\n") | |
| out, tries = [], 0 | |
| while len(out) < n and tries < 50 * n: | |
| tries += 1; i = rng.randrange(0, len(lines) - k) | |
| par = [x.strip() for x in lines[i:i + k]] | |
| if any(len(x) < 3 for x in par) or any(units(x, code)[2][-1:] in ([], ["0"]) for x in par): | |
| continue # empty lines, headings, lines without final punctuation | |
| out.append((("" if code.startswith(("zho", "jpn")) else " ").join(par), code, f"{corpus}:{i}")) | |
| print(corpus, code, len(out), flush=True) | |
| return out | |
| TED = dict(en="eng_Latn", de="deu_Latn", fr="fra_Latn", es="spa_Latn", it="ita_Latn", pt="por_Latn", nl="nld_Latn", pl="pol_Latn", | |
| ru="rus_Cyrl", uk="ukr_Cyrl", cs="ces_Latn", ro="ron_Latn", hu="hun_Latn", el="ell_Grek", bg="bul_Cyrl", tr="tur_Latn", | |
| ar="arb_Arab", he="heb_Hebr", fa="pes_Arab", hi="hin_Deva", id="ind_Latn", vi="vie_Latn", ja="jpn_Jpan", ko="kor_Hang", | |
| zh_cn="zho_Hans") | |
| EP = dict(en="eng_Latn", de="deu_Latn", fr="fra_Latn", es="spa_Latn", it="ita_Latn", pt="por_Latn", nl="nld_Latn", pl="pol_Latn", | |
| cs="ces_Latn", bg="bul_Cyrl", sk="slk_Latn", sl="slv_Latn") | |
| for corpus, ver, langs, name in [("TED2020", "v1", TED, "ted"), ("Europarl", "v8", EP, "europarl")]: | |
| rows = [] | |
| for l2, code in langs.items(): | |
| try: | |
| rows += opus(corpus, ver, l2, code) | |
| except Exception as e: | |
| print("FAILED", corpus, l2, e, flush=True) | |
| pd.DataFrame(rows, columns=["text", "lang", "doc"]).to_parquet(f"{OUT}/{name}.parquet") | |
| print("done", flush=True) | |