{
  "meta": {
    "title": "Ukrainian Frequency",
    "series": "Ukrainian Frequency",
    "kind": "Field Data",
    "subject": "Open, lemma-based language-learning data for modern Ukrainian",
    "route": "/research/ukrainian-frequency",
    "updated": "2026-10-07",
    "nextReview": "2026-12",
    "cadence": "Quarterly, or when a thread ships a new release, or when the source corpus publishes a new edition.",
    "downloadBase": "/downloads/ukrainian-frequency/v0.2.0",
    "citation": "Lawrence, J. (2026). Ukrainian Frequency: a lemma-based, coverage-graded open frequency list (v0.2.0). jakelawrence.xyz/research/ukrainian-frequency. Derived from UberText 2.0 (Chaplynskyi, 2023).",
    "thesis": "A learner of Ukrainian hits a tooling wall the moment they pass the alphabet: the frequency lists are thin, wordform-based, or quietly calqued from Russian. This series builds the missing pieces as open data. Thread one is the foundation the rest stand on: a lemma-based, coverage-graded frequency list for modern Ukrainian, with the empirical proof of how slowly reading coverage actually accrues in a heavily inflected language.",
    "refreshLog": [
      {
        "date": "2026-10-07",
        "summary": "Corrected the credit for the stress column's baseline dictionary: ukrainian-word-stress is a lang-uk project started by Oleksiy Syvokon and maintained by Dmytro Chaplynskyi. The earlier text named the reader who pointed at it by email as its maintainer; he is neither its author nor its maintainer, and he asked for the record to be set straight. Fixed on the page, in the lookup pages, in the stress release README (stress/v1.0.0 regenerated; the data files are byte-identical, only README.md and its hash moved), in the Zenodo datasheet text and in the ukvocab package attribution. Cut as stress/v1.0.1 so the Zenodo record can carry the corrected README as a new version under the same concept DOI; v1.0.0 stays published and byte-identical in its data files."
      },
      {
        "date": "2026-10-03",
        "summary": "Added the word lookup and the dictionary's third reading of the stress column. Andrij Rudnitsky's email also described his own reading tool: Daniel Klinger's open Ukrainian-to-English dictionary (dmklinger/ukrainian, CC BY-SA 3.0) containerized behind a lookup API he dictates to from his watch. The dictionary is now a committed, hashed snapshot restricted to the list's lemmas (9,100 of 12,000 have an entry; the 2,900 gaps are a contrib worklist by frequency rank), and GET /api/uk/lookup/<word> answers any form of a word from memory, through the profiler's own form index, with the stress, the validated level, the rank, the course gloss, the open Wikimedia recording and the dictionary's definitions and gender, as JSON or as plain text for a watch; the page publishes the five-action Shortcut. Read against the stress column, the dictionary's stressed headwords agree on 99.8 percent of the 8,486 polysyllables it marks (apostrophe glyph and case folded, Wiktionary's either-stress notation read as two readings, hyphenated compounds compared part by part); the 16 disagreements are published as rows, six of them proper nouns, none acted on without a ledger entry, since both read the same Wiktionary and an agreement is mostly one source seen twice."
      },
      {
        "date": "2026-10-02",
        "summary": "Pre-registered the stress column's accuracy audit. Confident in the column has meant that the open sources agreed; the audit asks a native speaker. A seeded, stratified random sample of 348 in-scope rows (200 of the 9,674 confident, 60 of the 137 labeled variants and doublets, and every homograph: the 31 the corpus count decided and the 57 it could not) is drawn once and committed, re-derived in CI from the column and the seed; each row is a priced task on the Validation Desk (kind stress.verdict: correct, wrong with the stressed form required, both in use, unsure); the accepted verdicts come back as an overlay and the per-stratum accuracy with a 95 percent Wilson interval is re-derived from sample plus overlay. The criterion was fixed before any answer exists: the confident tier is validated at 150 judged rows with the interval's lower bound at 0.95 or above. A wrong verdict is a flag for the override ledger, never an automatic correction."
      },
      {
        "date": "2026-10-01",
        "summary": "Closed the three decisions the stress column shipped with. Proper nouns are out of scope, as most learner lists leave names out: every one of the 1,348 PROPN rows keeps the stress the pipeline found with the pipeline's own status in the note, carries the status proper_noun, and counts in no share, so the headline reads 9,674 of the 9,920 polysyllabic common words with one confident stress, 97.5 percent, 225 labeled and 21 missing. The 49 dictionary-only doublets are to be settled from a printed orthoepic dictionary (Pohribnyi), not goroh, and the release now ships doublets.csv as the worklist; each lookup enters the override ledger citing the page, and the builder refuses a row citing either source without an entry. The homographs were counted in UberText 2.0: for each of the 88 in-scope pairs, both en.wiktionary readings' paradigms, the inflected forms spelled differently between them, and how often those forms occur across all five subcorpora (2.3 billion tokens, every stream read to the end), after every candidate form the site's own VESUM lemmatizer reads as another word is struck (заходи is the imperative of заходи́ти and the plural of захід; 79 of 710 struck). 32 pairs are decidable by spelling, 31 were decided on a floor of twenty hits and a 1.5 ratio, four of them away from the first en.wiktionary entry (сходи́ти, тверди́ти on the thinnest evidence, зго́дитися, виріза́ти); the pairs spelled alike in every cell (о́рган, орга́н) stay labeled and say on the row that the primary is unverified. Where the goroh ledger and the corpus agree (зво́дити) the row keeps the count and the ledger's evidence rides along in source. Results are keyed by rank because пора is on the list twice."
      },
      {
        "date": "2026-10-01",
        "summary": "Shipped thread 07, word stress: a stressed form for every one of the 12,000 lemmas, published as its own hashed CC-BY-SA overlay (stress/v1.0.0) joined on rank rather than as a column on the CC-BY list, so the Wiktionary-derived rows' share-alike does not relicense the list or its Zenodo deposit. The baseline is the lang-uk ukrainian-word-stress dictionary (Andrij Rudnitsky pointed at it by email), read directly from its trie and filtered by the list's own part of speech instead of a tagger's guess on a bare lemma, which caught 18 of the tagger's errors; en.wiktionary and uk.wiktionary tell free variants, homographs and minor variants apart; a two-of-three vote settles the disagreements; 19 goroh.pp.ua tiebreaks and every manual decision sit in an overrides ledger the builder applies last, with a test that refuses a goroh-backed row changing without an entry. The handover's uk.wikipedia names pass, stopped at 27 of 173 by rate limits, was finished from here (two results with a mark on a consonant refused), lifting the column from 96.5 to 97.2 percent: of the 11,090 polysyllabic lemmas 10,785 carry one confident stress and 248 a label rather than a guess; 57 are missing, 36 of them proper nouns. Found and queued upstream: two data errors in the dictionary (йо́го for його́ at rank 40, підозрюва́тися for підо́зрюватися) and 13 headwords in this site's own paradigms file that inherit a wrong stress from en.wiktionary, published beside the file as corrections rather than patched into a verbatim mirror. Replaying the dictionary stage over all 12,000 lemmas reproduced the handover's rows except 39, which are relabeled honestly: 22 where the library's context model chose among trie readings, 17 hyphenated compounds the trie has no single entry for. The stress column ships in the ukvocab package and is registered as its own Zenodo deposit. Still open: the 93 homographs' primary stress is the first en.wiktionary entry until it is counted in the corpus; 54 dictionary-only doublets wait on a decision about citing goroh or a printed orthoepic dictionary; the proper nouns need a scope call."
      },
      {
        "date": "2026-09-24",
        "summary": "Published ukvocab 0.3.0 to PyPI, the first release of the package the docs had called a PyPI package since 0.2.0 without anything in the repo able to publish it. A manual workflow on the Zenodo posture (the version typed and checked against pyproject.toml, TestPyPI by default, the data tier gated, the wheel built, twine-checked, installed and tested as installed, a version the index already has refused) uploaded it through PyPI trusted publishing, so no token is stored anywhere. The combined license on the index is CC BY-NC-SA 4.0, the PULS levels' terms."
      },
      {
        "date": "2026-09-24",
        "summary": "Made the vocabulary test say what it is. The PULS co-author who reviewed it read the pseudowords as spelling errors, which is the known weakness of the one-letter-substitution method and a sign the lede sentence was not enough. The quiz now carries a notice above the checklist (half the words are invented), and after scoring the page names the pseudowords the taker marked known with the real lemma each was built from, plus all 60 behind a disclosure, never before scoring. Writing the render test caught a defect: the seed lists a few spellings at two ranks, and a rank-only guard let v1.1.0 build the pseudoword таж from тож (rank 1,331) while asking тож itself (rank 6,651) as a real item, so one answer leaked another. The builder now guards by lemma string across both roles and the bank is frozen again as v1.2.0, with a test that no source lemma is an item and no form repeats; v1.0.0 and v1.1.0 stay frozen beside it."
      },
      {
        "date": "2026-09-24",
        "summary": "Relabeled every artifact that carries a PULS level from CC-BY-SA 4.0 to CC BY-NC-SA 4.0, because the profile's authors answered the note of 2026-09-12 with that decision (O. Synchak, 2026-09-24; the CC-BY-SA marking had matched the paper on the July permission and the promise to change it if asked). The relabel reaches the validated overlay, the crosswalk (frozen again as v1.2.0, v1.0.0 and v1.1.0 kept beside it with their superseded markings), the aspect and multiword tables, the Wiktionary families, the profiler bundle (v1.2.0), the predicted levels (the model is trained on the profile's labels, so they carry its terms rather than argue the point), the three held Zenodo datasheets, the Hugging Face cards and the ukvocab package, now 0.3.0 with a combined CC BY-NC-SA license and the invariant reworded: PULS is the one NonCommercial source, by permission, and nothing else NonCommercial ships. Tables with no level column (government, collocations, examples, paradigms, the frequency list itself) keep their terms. Every artifact now cites the profile as its site asks, and the datasheets' co-author initials, three of four wrong, are corrected. The deposits stay held until puls.peremova.org posts its notice."
      },
      {
        "date": "2026-09-24",
        "summary": "The minimums' co-author answered the crosswalk's one open question, and the surface now records the answer in place of the guess. The preposition line (по, про and через at A1; до, для, від and без held to A2 while the profile validates all four at A1) is case government, on purpose: when a word was assigned to A1 or A2 the grammar it requires was weighed with it, and a preposition whose case a beginner has not yet met was moved to A2 deliberately. Two constraints the published volumes do not state came with it: thematic coverage was structured around the Official State Standard for Ukrainian as a Foreign Language, aligned with CEFR, and each level was held to a strict cap of 1,000 words, which forced high-utility, standard-aligned vocabulary over raw frequency. The profile was built from a corpus of existing UFL textbooks that do not cover every everyday topic evenly, so the two distributions differ by construction; the 2026-09-13 note that the minimums' standing among the profile's source textbooks could not be established stays as written, since which textbooks was not the question. Prose only: the explainer in both languages, section 06 and the open question in the method note, the hub card, the source notes and the two markdown sources moved from hypothesis to sourced confirmation (personal correspondence, 2026-09-24, paraphrased, logged in docs/ukrainian-frequency/borodin-correspondence.md). No figure moved, so the release, its hash and its version are unchanged, and the Zenodo hold on the PULS-derived deposits still waits on the PULS authors."
      },
      {
        "date": "2026-09-23",
        "summary": "Moved every tier onto list v0.2.0, steps 2 to 4 of the migration in docs/ukrainian-frequency/list-v0.2.0.md, in one coordinated change because the tests hold the tiers to one spine by rank and a tier moved alone would have left the page joining two lists. The default seed is now the v0.2.0 list and v0.1.0 is a frozen file, still built byte for byte (its Zenodo version DOI is minted) and named as the predecessor in the release card. Every tier was rebuilt from its committed source snapshot against the new seed rather than re-harvested, so the source snapshots stayed as dated: the validated overlay goes from 6,391 to 6,403 labels with no level changed (the five it lost are the junk duplicates the cleanup folded, the seventeen it gained are entered lemmas the profile knows); the course overlay is re-keyed by lemma and part of speech without the course clone; the Borodin joins, genre split, B1 aspect, usage and multiword tables, minimums crosswalk, vocab test and profiler re-derive; the paradigms and Wiktionary families are re-extracted from the 2026-09-20 kaikki dump, which lifts paradigm coverage to 71.3 percent; derussification is re-read against LanguageTool's current tables, which is where four of its five changes come from. The gap-fill model lost its two document-count features (the column v0.2.0 dropped as undefined) and its ladder is eight steps; it is retrained and republished with new figures rather than carried. Three bundles are frozen anew as v1.1.0 beside their predecessors: the minimums crosswalk, the vocab test and the profiler, whose lexicon now names its list and carries the index map from v0.1.0, so a known set a reader saved under the old list re-indexes when the bundle loads instead of pointing at other words. The Lightning deck keeps its v0.1.0 card ids, because they key every learner's review history; its forms bridge joins the paradigms through the crosswalk with a lemma guard. Two measurements that need the lemmatizer service, the round-trip and the relemmatize sample, now declare the list they were taken on and are held to it until they are repeated. The ukvocab package data tier is rebuilt from the published files."
      },
      {
        "date": "2026-09-23",
        "summary": "Published list v0.2.0 beside v0.1.0, the first step of the migration in docs/ukrainian-frequency/list-v0.2.0.md. The audit of the published downloads had found the source lemmatizer's mistakes standing in the list as lemmas: case forms as headwords, one compound split across tags it cannot have, names tagged as adverbs, non-words, two apostrophe glyphs, and a doc-count column that exceeds the row's own count in a fifth of the rows. v0.2.0 is the same 2023-04-03 source with a reviewed cleanup ledger applied over every source row and the owner's six decisions recorded in it: of the v0.1.0 rows 11,914 are kept, 68 merged into the lemma they belong to, 18 dropped (non-words, Russian words from Russian passages, ла), and 86 enter from below the cut; the token universe is unchanged and coverage moves by hundredths of a point. The bundle ships the list without the doc-count column, the crosswalk from every v0.1.0 rank as JSON and CSV, and the ledger itself, all hashed; latest.json now points at it. Nothing else on the page moved: RELEASE stays v0.1.0, the spine the CEFR overlay, derussification, paradigms, minimums, profiler and vocab-test tiers join on, and the page says so beside the download list. Those tiers migrate through the crosswalk in order, each with its drift checks green, and the ukvocab package and the Zenodo deposit follow once they have."
      },
      {
        "date": "2026-09-23",
        "summary": "Fixed a homograph defect in the thread-04 paradigm join and shipped the profiler bundle as v1.0.1. The join chose one Wiktionary entry per spelling and stamped it on the spelling's best rank, so where the list holds a spelling under two parts of speech the lower rank carried the other word's paradigm: the conjunction ніж (rank 222) was declined as the noun knife, слід (should) as trace, поза (outside) as pose, and the month лютий had no paradigm while fierce sat on its rank. The profiler maps forms through that table, so ножем read as the A1 conjunction. Each part of speech now gets its own entry on its own rank, re-extracted from the 2026-09-20 kaikki edition (which alone also gave the personal pronouns their case tables). Paradigm coverage 71.0 percent (from 70.6), 8516 inflecting lemmas, 121413 forms, 14.3 per lemma; the validation run moves up by about a point per level and the coarse ordering still holds. Profiler v1.0.0 stays frozen beside v1.0.1."
      },
      {
        "date": "2026-09-17",
        "summary": "Answered the nlp_uk question the B1 dossier had pinned since stage 3, and closed a deposit gap the multiword table left behind. The pinned premise was that the usage tables carry pymorphy3 lemmas while the validated profile was built with nlp_uk, so moving the parse layer to nlp_uk should tighten the joins those tables depend on. It was measured instead of adopted: the same 400,000-line Wikipedia prefix under the same clean-sentence filter, spaCy kept for the syntax it alone provides, and the lemma replaced per token by the VESUM headword from the repository's own lemmatizer service, one request per sentence so the disambiguator sees real context and alignment stays one to one. Over 194,242 sentences and 2,880,835 tokens the two conventions agree on 92.6 percent of tokens, and content words reach the list at 73.0 percent under pymorphy3 against 72.6 under nlp_uk, or 72.0 against 70.6 when the part of speech has to match as well. The premise was wrong, so nothing was rebuilt. What makes the comparison worth trusting is that the run reproduces this snapshot's own published rates first, 73.0 and 72.0 to the decimal, before comparing anything; a live check asserts that and a second asserts the tables still carry the convention the measurement left standing. The difference is a convention rather than an error on either side: nlp_uk makes a substantivized adjective its own headword, so rosiyskoyu reads rosiyska where this list has rosiyskyy, and a sentence-initial capital often reads as a proper noun, and agreement is lowest on the closed classes where the two tag conventions differ most, pronouns at 64.2 percent over 42,688 tokens, then determiners at 81.0 and proper nouns at 84.7, a ranking the browser tier derives from the table with a sample floor rather than asserting. The gap is 9,019 content tokens and it closes exactly, 38,454 moving off the list against 29,435 moving on, counted over the content tokens the rate is measured on; the per-part-of-speech disagreement classes are a different population and the artifact now says so, after a first version of this entry published their net as though it were the gap. Separately, the multiword table had shipped with both its CSVs documented in the b1-enrichment datasheet and never added to the deposit's file list, so the datasheet promised a downloader two files the bundle did not contain: the deposit now ships them, and a datasheet can no longer document a file its deposit does not ship, a guard that runs in the test suite rather than in a script nobody runs."
      },
      {
        "date": "2026-09-17",
        "summary": "Shipped the multiword table, the last open deliverable of the B1 extension's stage 3. A frequency list ranks lemmas, so a phrase is invisible to it: tomu shcho is counted as one very common conjunction plus one very common pronoun and nowhere as the connective it is. The table gives 142 expressions their own IDs, 63 discourse connectives from UK-DiMLex (MIT) and 79 multiword entries extracted from the two published Borodin minimums (CC BY 4.0, their notation for variants, aspect pairs, glosses and inflection hints parsed off rather than counted as phrases), each with the validated level and rank of every part and its own count over 4,694,436 word tokens of UberText's Wikipedia subcorpus. A part is a word form and not a lemma, so each one resolves in two recorded steps, as its own form where the list has it and otherwise through pymorphy3's normal forms, with the map committed so CI needs no analyzer: 235 of 307 parts joined as the form, 48 through the lemmatizer, 24 genuinely absent from the top-12,000, which is most of the everyday A1 and A2 vocabulary a news corpus has little use for. The measured finding is the gap the table exists to show: of the 98 expressions whose every part carries a validated level, 87 have every part at B1 or easier, so a coverage figure computed word by word counts them as already known. The level column is published as a floor and labeled one, because the profile levels words and not expressions: takym chynom is a frozen instrumental of a C1 noun and reads C1 part by part, which is as wrong for the unit as A1 would be. The signature interaction is that pair of readings, a toggle that renders the same expressions as their separately leveled parts or as the single unit that is on no list and is rarer than its own rarest part. The independent check is the PARSEME 2.0 Ukrainian corpus, which attests 35 of the 142, and it is read in one direction only: the corpus is NonCommercial, so it is never vendored, no expression enters the table because PARSEME has it, and the per-expression read is walled into its own snapshot that the release and the package exclude behind a fail-closed test. That corpus ships two sets of figures that disagree with each other; counting its files reconciles with its README and not with its stats file, and both are recorded rather than repeated."
      },
      {
        "date": "2026-09-14",
        "summary": "Closed the deploy gap and prepared the upstream and registry work. The lemmatizer now has a deploy path: a workflow builds the container on every change (which validates the Dockerfile), publishes it to GHCR, and, when the Fly deploy token exists, deploys it and runs the round-trip check against the live URL as the gate, refusing to go green if fewer than 99 percent of sampled lemmas round-trip, any apostrophe lemma fails, or 5000 characters take over two seconds; the site reads the service URL and bearer DB-first from the secrets store, so pointing production at the host needs no redeploy. Three upstream worklists were generated under contrib from committed evidence and nothing was submitted: for dict_uk, the 21 B1 verbs where PULS, Wiktionary and VESUM disagree on aspect, re-read against VESUM 6.8.0 through the service (16 questions for dict_uk, 2 for the PULS authors, 2 resolved by the current release); for the Ukrainian Wiktionary, the 4209 of 6285 validated lemmas with no page there, by rank, and 34 B1 verb pages that do not name the attested aspect partner; for UK-DiMLex, its 163 connectives checked part by part against the UberText dictionary (162 attested; the one gap is a lemma-convention artifact) and 11 Latin-i spellings in the file. Dataset cards for Hugging Face were generated from the Zenodo registry and the datasheets, with a push that refuses any dataset whose concept DOI does not exist yet, and a report on what a LINDAT/CLARIAH-CZ submission requires (there is no Ukrainian CLARIN repository, only a knowledge centre). The maintenance statement is a draft, not published, until the owner decides what he commits to."
      },
      {
        "date": "2026-09-14",
        "summary": "Stood up the hosted lemmatizer the profiler and any word-list join depend on: POST /api/lemmatize returns the VESUM headword, part of speech, a best-effort UD tag and the full morphological tags per token, with an ambiguous flag and every other surviving reading, in the convention this list was built with. The route normalizes (NFC, stress marks stripped, every apostrophe glyph folded), rate-limits per IP (30 a minute, 300 an hour), caches by content hash and retains nothing; it proxies to a JVM service (services/lemmatizer) that runs LanguageTool's Ukrainian tokenizer, tagger and rule-based disambiguator, the core nlp_uk's TagText wraps, over a pinned VESUM dictionary (morfologik-ukrainian-lt 6.8.0 with LanguageTool 6.8) that never leaves the server, one analysis call per request. The contract is published as an OpenAPI document and a page with a curl example. The round-trip check against this list is a committed artifact: of 436 sampled lemmas (ranks 1 to 200 in full, then every 50th) 435 come back as the list's own lemma, the one miss being a proper noun the dictionary does not know; all five apostrophe lemmas resolve; 5000 characters analyze in about 100 milliseconds wall time against a two-second budget. CI recomputes the headline from the rows and fails when a pin changes without a re-run. The service is built and checked here; it is not yet deployed, so the route answers 503 until LEMMATIZER_URL is set."
      },
      {
        "date": "2026-09-14",
        "summary": "Made the published data installable and archivable. The ukvocab Python package (packages/ukvocab, pip install ukvocab, pyarrow its only dependency) ships the top-12000 list with ranks, the validated PULS overlay, the Borodin A1 and A2 minimums, the crosswalk and the three B1 enrichment tables as Parquet loaded lazily, behind four functions: lookup, levels, coverage and sources, with every return value carrying its dataset, version and snapshot. It ships no predicted level, no VESUM-derived data and nothing NonCommercial. The data tier is generated from the published download files, never the seeds, so a package row count is a published row count, and two test suites hold it: the package's own pytest (row counts and hashes against the published files, a fixed 50-lemma sample of validated levels, the wheel built and installed locally) and a vitest twin that fails when a published file changes without a rebuild. Combined license CC-BY-SA 4.0 because the PULS levels run through most tables. Beside it, Zenodo deposit tooling: four deposits kept separate by license, each with a datasheet (what it is, how it was built, what it excludes, known defects, intended and unintended uses, attribution with DOIs, the PULS harvest date of 2026-07-23) and a checksum manifest, and a publish script that mints a new version DOI under one concept DOI per dataset and writes it back to a registry the page and the package read. No DOI is minted yet: the three PULS-derived deposits are held in the registry until the authors confirm the attribution wording, and the frequency list waits on the token."
      },
      {
        "date": "2026-09-13",
        "summary": "Closed two defects in the validated overlay and the gap-fill model, and rebuilt every tier on them. First, the POS-aware join was dropping the same lexeme under two tag conventions, not homographs: UD determiners the profile calls pronouns (який, цей, той at ranks 12, 19 and 35), ordinals it calls numerals (перший, другий), its indeclinable-word class (можна, треба), preposition-adverb and particle-adverb words, and substantivized adjectives (військовий, дорослий), 107 rows in all, 34 in the top thousand. Ten explicit cross-tag rules in six groups now recover them, each recorded on its row in a join field that is also a column of the public CSV, so the strict join is one filter away. The validated overlay grows from 6284 to 6391 lemmas (A1 859, A2 994, B1 1605, B2 2173, C1 760); 47 unrelated homographs stay dropped, and 132 spellings now sit at two ranks because the corpus tagger split one word into two readings, stated as a number. The Borodin A1 consensus base grows to 806 (75.7 percent A1), the labeled family count to 637 (219 at one level). Second, the model. Membership in the open A1 and A2 minima was its strongest weight and worth 9.4 points of exact match, and that lift was a graded word list read back as a feature: the flags fire on 1499 of the labels but on 84 of the lemmas being predicted, and whether those volumes sit among the profile's source textbooks could not be established. The two flags are now computed and reported but excluded from the shipped model, the ladder and the headline. Retrained on the 6391 labels under the same grouped folds (3388 groups), the honest model reads 40.2 exact and 82.9 within one (MAE 0.79, QWK 0.49) against a rank-only 37.4 / 75.2, ECE 0.024, 1750 of 4210 predictions confident; with the flags it would read 49.6 / 92.3, and that figure ships only as a labeled diagnostic. The corpus slice behind the usage tables was cut on the 1585-lemma B1 set, so the 20 B1 lemmas the join fix added have no usage rows until the corpus is re-parsed, and the README says so."
      },
      {
        "date": "2026-09-13",
        "summary": "Crosswalked the two published lexical minimums against the validated CEFR profile, which is the first time either has been read against the other rather than against this list. 10366 rows, one per lemma in the union: 1200 agreements, 583 words the syllabus teaches earlier than the profile validates them, 174 it teaches later, 84 validated-A1 and 692 validated-A2 words in neither volume, 172 minimum words the profile does not cover (mostly proper nouns, which is scope rather than a gap), and 7461 above a 2000-word syllabus by arithmetic. The sharpest reading is the prepositions: the A1 volume carries po, pro and cherez but defers do, dlia, vid and bez to A2, while the profile validates all four at A1 and the corpus ranks them 9, 21, 22 and 130. Four join defects had to be fixed first, each of which was manufacturing findings that were not real: the PULS harvest stores the apostrophe as the literal entity &#39; in 135 rows, so no apostrophe lemma joined; 67 snapshot rows quote a lemma containing a comma, so a naive split relabeled their level; an unspaced parenthesis continues the word it touches, so Buvai(te) was putting te at rank 27 into the A2 volume; and inside a spaced parenthesis the authors write alternatives after a semicolon and paradigm forms after a comma, so reading commas as headwords put ye, buv and bula in the A1 volume. Published as a hashed CC-BY release with all four sources attributed separately. The same entry-reading fix landed in the profiler's known-word sets, where keeping one lemma per entry had marked 58 A1 and 119 A2 words unknown, u from the A1 list's own first entry among them."
      },
      {
        "date": "2026-09-13",
        "summary": "Fixed the apostrophe in the thread-04 paradigm join and rebuilt it, which is the same class of defect the validated-CEFR join had: the frequency list writes the apostrophe as U+2019 and Wiktionary writes U+02BC or an ASCII quote, so a join keyed on the raw string had never matched an apostrophe lemma. 156 of the 158 apostrophe lemmas on the list (зв'язок 267, ім'я 311, здоров'я 395, з'явитися 456, п'ять 480, сім'я 565) carried no paradigm, no IPA and no audio, and in the text profiler every inflected form of them read as off-list. The join now folds the glyph for the key only; the emitted lemma stays the list's own spelling and the forms stay Wiktionary's own, verbatim. 118 of those lemmas gain a paradigm (the other 38 have no Wiktionary entry at all), and a profiler check of twelve real inflected forms goes from 2 resolved to 12. Two fail-closed tests now guard both halves, because a fix to either side alone strands the other: the apostrophe lemmas must resolve, and every apostrophe glyph the form index carries must be one the tokenizer folds to the same key typed text makes. The re-run also takes the current kaikki dump (2026-09-09, the edition the family graph already used), which is the only edition served, so its drift rides along and is reported rather than hidden: 833 lemmas gain forms and 958 lose them across the whole rank range, 81 of the losers in the top 1000. Net, paradigm coverage 69.5 to 70.6 percent, IPA 75.0 to 76.3, audio 61.7 to 62.6, and the inflection multiplier 15.0 to 14.2 on 120,655 forms over 8,477 inflecting lemmas. The extractor now requires --dump-date and records it, the field whose absence made that drift invisible. One published finding changes with it: the profiler's validation ordering. It read as monotone only because A1 and A2 tied at 85.4 in the first run; they now read 84.3 and 84.8. The page no longer claims the levels sort the same way, and says what the set actually shows: B1 sits 6.9 points below the two easier bands, A1 and A2 are 0.5 apart, and nine and ten texts cannot separate that."
      },
      {
        "date": "2026-09-13",
        "summary": "Fixed a join defect in the validated overlay and rebuilt every tier on it. The PULS platform renders the apostrophe as the HTML entity &#39; and the harvest kept that text verbatim, while the list writes U+2019, so no apostrophe lemma had ever matched: 77 list lemmas with a validated level (сім'я, п'ять, здоров'я, ім'я, з'явитися, пам'ять among them; 11 at A1, 14 at A2, 21 at B1, 24 at B2, 7 at C1) sat in the unlabeled set and received model predictions instead. The join now decodes entities and folds the three apostrophe glyphs to one key; the raw harvest stays as taken. The validated overlay grows from 6207 to 6284 lemmas (A1 823, A2 970, B1 1585, B2 2154, C1 752; 154 homographs dropped), the B1 verb set from 438 to 442, the Borodin A1 consensus base from 768 to 780 shared lemmas (75.4 percent A1, unchanged). The corpus parse was re-run with the same folding, which also lifts content-on-list coverage from 72.1 to 73.0 percent: government for 365 verbs, collocations for 1085 lemmas, examples for 1497 (gate 167 of 5571 dropped). The lemmatizer convention check folds the glyph too and reads 99.9 percent again. The gap-fill model, retrained on 6284 labels with 5716 unlabeled lemmas and 4251 predictions, reads 49.4 exact and 92.2 within one (MAE 0.59, QWK 0.71) against a rank-only 37.1 / 75.0, ECE 0.018, 2919 confident rows; the ladder is unchanged in shape (A1 / A2 minima 8.9 points, the Wiktionary family graph nothing, 49.6 to 49.4). Found by the read-only check of the model against the Borodin lists, where 43 of the 54 unlabeled Borodin words turned out to be apostrophe words PULS did label."
      },
      {
        "date": "2026-09-12",
        "summary": "Built the open fallback for the profile's unpublished word families: a derivational family graph over the English Wiktionary's Ukrainian entries (kaikki.org dump of 2026-09-09), where two words are kin when one lists the other as a derived term, one's etymology is a single-base affix over the other, or they are listed aspect partners; related-terms lists are recorded but not used and compound nodes are excluded, because either chains unrelated roots into families of hundreds. 17591 used edges put 4155 of the 12000 list lemmas into 1917 families, shipped as families.csv and edges.csv with a source note. The graph measures what the profile's own families would show: among the 621 families with two or more validated members, all members sit at one level in only 211 (34 percent), so a family is not a level, which is the eLex paper's own point about писати. Fed to the gap-fill model as its own ablation step (size, membership, fold-safe lowest validated level) it adds nothing (48.9 to 48.6 exact, inside noise); it also joins the grouped folds, which locks more kin together and makes every reported figure slightly stricter (the shipped model now reads 48.6 exact and 92.2 within one; the random-split gap widens from 1.7 to 2.7 points). The ask to the PULS authors stands for a different reason: their families are the ones the levels were verified in."
      },
      {
        "date": "2026-09-12",
        "summary": "Added the open feature resources a third dossier inventoried to the gap-fill model, each as its own ablation step under the same grouped folds: Wiktionary sense count and borrowed-term flag (kaikki.org), wordfreq subtitle and web frequency, UniMorph 4.0 derivational families (also folded into the fold grouping), and membership in the open A1 and A2 lexical minima. Held-out exact match rose from 39.6 to 49.0 percent and within one level from 80.6 to 92.3 (MAE 0.59, QWK 0.71), into the band the stage 4 design set as realistic; frequency alone stays at 37.6, and the ladder attributes the lift almost entirely to one resource: Wiktionary polysemy adds nothing, subtitle frequency 0.7 points, UniMorph families 0.6, and membership in the A1 and A2 minima 8.4, which is an independent graded word list agreeing with the profile on its lowest levels, so the gain lands on A1 and A2 and reaches few of the unlabeled lemmas the model is for. The dossier's confirmed gaps (no learner corpus, no subtitle norms, no age-of-acquisition or concreteness norms for Ukrainian) are recorded as gaps; its two data asks, the PULS per-level textbook frequency table (the FLELex-equivalent) and the 1100 word families, are now the first items of the drafted note to the PULS authors."
      },
      {
        "date": "2026-09-11",
        "summary": "Shipped stages 3 and 4 of the B1 extension as a new section of the hub. Aspect as a relation table: the 438 validated B1 verbs related to their Wiktionary-listed partners (374 paired), a hand-curated suppletive table, and 591 corpus-attested prefixed derivatives, each keeping its own PULS level, which surfaces 102 split-level pairs and 15 verbs where PULS and Wiktionary disagree on aspect (VESUM recorded as the third opinion); the motion grid over sixteen canonical prefixes and eight pairs, 211 of 256 cells attested by both the corpus and the lexicon. Usage as counts over a 2.88 million token Wikipedia prefix parsed with spaCy: government for 362 B1 verbs with a 60-verb maintainer-written reference check (top pattern agrees for 59), logDice collocations for 1073 lemmas, and two attested sentences per lemma for 1481 lemmas, every one through a fail-closed russianism gate that dropped 165 of 5513 candidates; the lemmatizer convention check finds 99.9 percent of B1 headwords normalize to themselves under the one-percent benchmark. The gap-fill model: a proportional-odds ordinal logit over the 6207 validated labels, evaluated on grouped folds (stem, aspect link and spelling never straddle train and test), 39.6 percent exact and 80.6 within one level against a rank-only baseline of 37.3 and 75.5, the random-split gap of 1.5 points reported, an ablation ladder where frequency dominates and morphology adds about two points, calibration error 0.019 with an abstention threshold, and predictions for 4321 content words shipped in a separate file the validated overlay never absorbs. The multiword table and the nlp_uk re-lemmatization stay pinned; the note offering the predictions to the PULS authors is drafted."
      },
      {
        "date": "2026-09-11",
        "summary": "Measured where the validated PULS B1 actually falls on this list's ranks, the first step of the B1 extension (plan: docs/ukrainian-frequency/b1-extension-pipeline.md). The draft plan would have selected B1 candidates from a hardcoded 2000 to 4500 rank band. Against the validated labels that band keeps 462 of the 1564 B1 lemmas (29.5 percent) and admits more B2 (595) than B1; the rest of the band is 259 A2, 184 A1, 111 C1, and 890 lemmas with no validated level at all. B1 spans all twelve thousand-rank bands (p10 rank 764, median 3789, p90 9407), and so does every other level. The two ends of B1 read the way a news-heavy corpus predicts: the shallowest B1 content words are civic and journalistic (повідомити, рішення, суд, влада, міністр), the deepest are everyday and personal (підборіддя, закохатися, кажан, пальма, спальний). Published as a per-level, per-band heatmap with the band filter as a toggle, a rank-distribution CSV beside the validated overlay download, and three new live checks; the arithmetic re-derives in CI from the committed table. The lesson for the extension: the band filter is dropped, the enrichment layer for the 1564 validated B1 lemmas comes first, and any predicted level for the 5793 unlabeled lemmas ships in a separate file, never merged into the validated column."
      },
      {
        "date": "2026-07-28",
        "summary": "Shipped thread 6, the genre split, which tests an assumption thread 2 had been resting on. Thread 2 reported that 229 word entries of the A2 lexical minimum do not rank in this site's top 12000 and read that as the ceiling on frequency-first learning. But this site's list is built on UberText 2.0's COMBINED corpus, whose largest component by far is news, so the finding was ambiguous between two opposite readings: the vocabulary is rare in Ukrainian, or journalism does not discuss it. Built one frequency list from UberText's fiction subcorpus and one from its news subcorpus, same collection, same lemmatizer, same sampling shape, both capped to 85552190 tokens, so genre is the only variable. The two genres reach almost exactly the same amount of the A2 minimum (news 70.3 percent, fiction 69.2) and disagree sharply about which part: 562 entries in both, 96 news-only, 86 fiction-only, 192 in neither. Fiction recovers 30.9 percent of what news misses and news recovers 33.3 percent of what fiction misses, so neither genre is better. Together they reach 79.5 percent, 9.2 points more than either alone. Per theme the split is stark (cooking methods 14 percent in news against 86 in fiction, family terms 57 against 100, body parts 75 against 100) and the exclusive sets read as predicted: news-only is institutional and geographic (анкета, банкомат, бланк), fiction-only is domestic and bodily (гарбуз, закуска, краватка). The practical finding is that for a pedagogical vocabulary target, corpus diversity buys what corpus size cannot. These ranks come from our own pymorphy3 pass and are never mixed with the shipped lang-uk ranks; a test enforces the separation."
      },
      {
        "date": "2026-07-28",
        "summary": "Closed the last seam the A1 card left open. Its provenance note recorded that the A2 volume of the same series existed but had not been shared machine-readable; it has since been published open access under CC-BY-4.0 (Borodin and Lazarenko, Europa-Universitat Viadrina, DOI 10.11584/opus4-1448), so the word list was extracted from the publication's own typesetting and joined the same coarse way. The register is 1000 entries, exactly the size the book's title claims. 708 join the top-12000, reaching 707 distinct lemmas, median rank 2837, deepest 11969. Two findings the page could not previously reach. First, what a CEFR step costs: only 45 of the 1000 entries are words the A1 minimum already claimed (almost all verbs collecting a perfective partner), the other 955 are new at A2, and they sit measurably deeper in the corpus (median rank 2902 against 1643 for the carried words). Second, and new to this thread, WHICH fields a frequency list misses: the book also prints its vocabulary under its own 51 topic headings, and joining those shows 21.6 percent of the 1124 thematic units off-list, concentrated in the concrete and domestic (food 69.0 percent off-list, personal hygiene 60.0, household technology 59.1, and the numerals, where the collective forms and the ordinals the authors extended to thirtieth both fall outside the list). The teachability trade widens sharply one level up: the matched A2 core covers 11.9 percent of running text where a same-size frequency core covers 55.9 percent, and 229 word entries do not rank in the top-12000 at all, against 72 at A1. Republished as an attributed CC-BY-4.0 open download (entries plus the thematic breakdown); the census gains an open-access A2 row, and the methodology chapter behind both volumes (GranaSlavic 2026) enters the sources ledger."
      },
      {
        "date": "2026-07-27",
        "summary": "Closed the seam the CEFR thread's rigor model documented: the second, independent A1 source. The '1000 i 1 slovo' A1 lexical minimum (Borodin and Turkevych, Ukrainian Catholic University; CC-BY-4.0) was listed in the field census as walled (published only as a prose PDF behind an anti-bot wall, so not machine-joinable); after a direct request, co-author Kseniia Borodin sent the machine-readable word list herself (2026-07-27). Joined its 929 unique entries onto the top-12000 list by lemma string (the source carries no POS, so the join is coarser than the POS-aware overlays and says so): 838 entries match, reaching 833 distinct lemmas, median rank 1549, deepest 11871. The consensus finding: of the 768 joined lemmas the validated PULS map also covers, 75.4 percent are validated A1 and 96.5 percent sit at A1 or A2, so two independent A1 efforts converge. The teachability trade replicates on an independent instrument: the 833 matched lemmas cover 34.7 percent of running text where a same-size frequency core covers about 58 percent, and 72 word entries (апельсин, виделка, бутерброд) do not rank in the news-heavy top-12000 at all. Republished as an attributed CC-BY-4.0 open download; the field census row flips from walled to shared by the authors."
      },
      {
        "date": "2026-07-23",
        "summary": "Upgraded thread 2 to a VALIDATED per-lemma CEFR overlay. A co-author of the Ukrainian Vocabulary Profile (Vasyl Starko / PULS, Synchak et al. 2025) granted permission to redistribute the per-lemma A1 to C1 levels, attributed. Harvested the full published list (10298 entries across 208 pages of the public browse interface, robots-permitting, polite) and joined it onto the top-12000 frequency list, per lemma and POS-aware: 6207 of the 12000 lemmas now carry a validated level (A1 812, A2 956, B1 1564, B2 2130, C1 745), 150 homographs dropped rather than mislabeled. This replaces the browse-only, cannot-join framing that thread 2 launched with. It is presented as a dated snapshot (the profile is still being extended; the published map already lists more B2/C1 lemmas than the eLex 2025 tables). Two findings: the validated level tracks native-usage frequency only weakly (Spearman 0.379, median rank rising A1 to C1), and the free open course overlay agrees with the validated map 45.6 percent exactly and 86.6 percent within one level on the 1965 lemmas both cover, a far stronger measure of the open signal than the earlier hand-curated n=114 gold sample. The open overlay stays as that cross-check."
      },
      {
        "date": "2026-07-22",
        "summary": "Deepened thread 4 from the top 2000 lemmas to the whole top-12000 list. Coverage is graded honestly and thins with rank, as expected: of the 12000, 69.5 percent now carry a paradigm, 75.0 percent an IPA, 61.7 percent open audio (a rarer lemma is less likely to have a Wiktionary entry). The finding holds and sharpens on the larger base: the 8339 inflecting lemmas expand to 125380 distinct wordforms, an average of 15.0 each (a noun about nine, a verb about thirty). The full form-level release now ships gzipped (forms.csv.gz) since the raw CSV is about 14 MB."
      },
      {
        "date": "2026-07-22",
        "summary": "Shipped thread 4, audio and paradigms, which closes out the roadmap. Joined the top 2000 lemmas to the open, machine-readable Wiktionary extraction (kaikki.org / wiktextract) and attached each lemma's inflection paradigm (declension and conjugation forms, stress marks included), its IPA, and a link to open native-speaker pronunciation audio on Wikimedia Commons. Coverage is graded honestly: 83 percent carry a paradigm, 94 percent an IPA, 89 percent open audio. The measured finding is a morphology-level companion to thread 1's coverage curve: the 1669 inflecting lemmas in the top 2000 expand to 24121 distinct wordforms, an average of 14.5 each (a noun about ten, a verb closer to thirty). Forms are Wiktionary's own, verbatim; audio is linked, never re-hosted."
      },
      {
        "date": "2026-07-22",
        "summary": "Shipped thread 3, the derussification pass. Joined the frequency list against the open Ukrainian idiomatic-style tooling (LanguageTool's Ukrainian replacement tables, brown-uk / Andriy Rysin, the open Pravopysnyk-style layer backed by the VESUM morphology) and paired each of the 87 top-12000 lemmas the tooling flags with the native alternative it recommends. Fenced honestly as an unvalidated, prescriptive signal whose core is derussification (russianisms, surzhyk, the active-participle calque) but whose scope is broader than strictly-Russian loans. The measured finding: of the 74 single-word swaps, 48 (about 65 percent) have the flagged form at least as common in real text as its native replacement, which is rarer or absent from the top-12000 entirely. That is the empirical face of older materials quietly teaching the calque."
      },
      {
        "date": "2026-07-21",
        "summary": "Shipped thread 2, CEFR alignment, honestly scoped. The only corpus-validated CEFR vocabulary profile for Ukrainian (Synchak et al., eLex 2025) is browse-only and reaches B1, so rather than invent levels this thread profiles that resource against the frequency list: the published A1 to C2 distribution (dense through B1 at 4504 lemmas, thinning to 1140 / 220 / 27 at B2 / C1 / C2 of a 10000 target), and the coverage cross-reference (a validated 2363-lemma A1 to A2 core covers 48 / 40 / 32 percent of fiction / news / academic text, while a same-size frequency-ranked core from this list covers about 72 percent of its source corpus). The finding: a frequency rank is not a proficiency level, and a validated CEFR overlay above B1 waits on open data that does not yet exist."
      },
      {
        "date": "2026-07-14",
        "summary": "Shipped thread 5, the vocabulary-size self-test: a 120-item Yes/No checklist test (60 real lemmas, 60 constructed pseudowords) stratified across the 12 frequency bands from thread 1, scored with the standard hit-rate-minus-false-alarm correction (Meara and Buffery) and mapped onto the coverage curve for an estimated reading-coverage percentage. Pseudowords are checked at build time against both the 12000-lemma list and a 333000-headword reference Ukrainian dictionary so a constructed non-word does not accidentally collide with a real one."
      },
      {
        "date": "2026-07-14",
        "summary": "Series launch. Shipped thread 1, the lemma frequency list: the top 12000 lemmas of modern Ukrainian, ranked and coverage-graded, derived from the UberText 2.0 lemma frequency dictionary (1.5 billion word tokens) and published as a hashed CSV and JSON release plus an Anki deck seed. Measured the real coverage curve (top-1000 lemmas cover 60.7 percent of running word tokens, top-5000 cover 82.0 percent), which is lower than the cross-Slavic extrapolation usually quoted. Registered the CEFR-alignment, derussification, audio-and-paradigm, and vocabulary-test threads as planned."
      }
    ]
  },
  "sources": {
    "ubertext": {
      "id": "ubertext",
      "title": "UberText 2.0 lemma frequency dictionary",
      "publisher": "lang-uk",
      "url": "https://lang.org.ua/en/ubertext/",
      "accessed": "2026-07-14",
      "kind": "corpus-frequency-dictionary",
      "citation": "Chaplynskyi, D. (2023). Introducing UberText 2.0: A Corpus of Modern Ukrainian at Scale. Proc. 2nd Ukrainian NLP Workshop (UNLP), ACL.",
      "cadence": "As the corpus publishes a new edition",
      "note": "The lemma/POS/count dictionary built over the combined UberText 2.0 subcorpora. This release re-publishes derived aggregate counts (facts), not the source corpus text."
    },
    "ud": {
      "id": "ud",
      "title": "Universal Dependencies (UD) part-of-speech scheme",
      "publisher": "Universal Dependencies",
      "url": "https://universaldependencies.org/u/pos/",
      "accessed": "2026-07-14",
      "kind": "annotation-scheme",
      "cadence": "Stable",
      "note": "The POS tag set carried on every lemma (NOUN, VERB, ADJ, PROPN, and so on)."
    },
    "synchak_2025": {
      "id": "synchak_2025",
      "title": "Corpus-Based Vocabulary Profiling for Ukrainian: From Lexical Analysis to CEFR",
      "publisher": "Synchak, Starko, Burak and Svystun, eLex 2025",
      "url": "https://elex.link/elex2025/wp-content/uploads/eLex2025-29-Synchak_etal.pdf",
      "accessed": "2026-07-14",
      "kind": "published-study",
      "cadence": "As the project publishes",
      "note": "The only corpus-based, expert-validated CEFR-aligned Ukrainian vocabulary profile (the PULS platform, puls.peremova.org). The source for thread 2 (CEFR alignment) and for the external A1 to A2 coverage comparator quoted on the page. A co-author (V. Starko) granted permission to redistribute the per-lemma A1 to C1 levels, attributed; thread 2's headline validated overlay is that list joined onto this frequency list as a dated snapshot (see puls-cefr.SOURCE.md). Licensed CC BY-NC-SA 4.0 at the authors' decision (O. Synchak, 2026-09-24; carried as CC-BY-SA to match the paper until then), cited as the site asks: Профіль української лексики (ПУЛЬС) / О. Синчак, В. Старко, М. Бурак, М. Свистун та ін. Львів: Школа української мови та культури УКУ, 2026. The published platform map already exceeds the paper's frozen per-level counts, which is why the live list is joined rather than the paper's tables."
    },
    "meara_buffery_1991": {
      "id": "meara_buffery_1991",
      "title": "The Checklist Method for Testing Vocabulary Size (X_Lex / Y_Lex)",
      "publisher": "Meara, P. and Buffery, C.",
      "url": "https://www.lognostics.co.uk/tools/",
      "accessed": "2026-07-14",
      "kind": "method",
      "cadence": "Stable",
      "note": "The Yes/No checklist vocabulary-size test design and the hit-rate-minus-false-alarm-rate scoring correction the vocabulary-size test thread implements."
    },
    "laufer_nation_1995": {
      "id": "laufer_nation_1995",
      "title": "Vocabulary Size and Use: Lexical Richness in L2 Written Production (the Lexical Frequency Profile)",
      "publisher": "Laufer, B. and Nation, P., Applied Linguistics 16(3)",
      "url": "https://doi.org/10.1093/applin/16.3.307",
      "accessed": "2026-09-13",
      "kind": "method",
      "cadence": "Stable",
      "note": "The lexical frequency profile: a text's running-word tokens sorted into frequency-list bands, with proper nouns set outside the count. The text profiler's counting design (token coverage, names outside the denominator, an off-list bucket) follows it."
    },
    "nation_2006": {
      "id": "nation_2006",
      "title": "How Large a Vocabulary Is Needed for Reading and Listening?",
      "publisher": "Nation, I. S. P., Canadian Modern Language Review 63(1)",
      "url": "https://doi.org/10.3138/cmlr.63.1.59",
      "accessed": "2026-09-13",
      "kind": "published-study",
      "cadence": "Stable",
      "note": "The 98 percent running-text coverage figure for unassisted reading, beside the earlier 95 percent threshold (Laufer 1989; Hu and Nation 2000) for reading with support. The text profiler defaults to 95 and keeps 98 in its settings, citing both."
    },
    "dict_uk": {
      "id": "dict_uk",
      "title": "dict_uk (Ukrainian hunspell dictionary, via LibreOffice dictionaries)",
      "publisher": "Andriy Rysin and contributors, brown-uk / dict_uk",
      "url": "https://github.com/brown-uk/dict_uk",
      "accessed": "2026-07-14",
      "kind": "reference-dictionary",
      "cadence": "As the project publishes",
      "note": "A 333000-headword Ukrainian wordlist, used only at build time to reject a constructed pseudoword that turns out to collide with a real word outside the top-12000-lemma list. Licensed MPL 1.1; not redistributed as part of this release. See src/data/ukrainian-frequency/uk-lexicon-dict_uk.SOURCE.md."
    },
    "languagetool_uk": {
      "id": "languagetool_uk",
      "title": "LanguageTool Ukrainian replacement tables (replace.txt, replace_soft.txt)",
      "publisher": "brown-uk (Andriy Rysin and contributors), via LanguageTool",
      "url": "https://github.com/languagetool-org/languagetool/tree/master/languagetool-language-modules/uk/src/main/resources/org/languagetool/rules/uk",
      "accessed": "2026-07-22",
      "kind": "style-replacement-tables",
      "cadence": "As the project publishes",
      "note": "The open idiomatic-style tooling (the Pravopysnyk-style layer of the brown-uk project) that flags non-idiomatic Ukrainian forms and offers a native replacement: replace.txt (standard, the hard tier here) and replace_soft.txt (soft suggestions). The source for thread 3, the derussification pass. It is a prescriptive editorial signal, not a validated russianism taxonomy. Licensed LGPL 2.1; only the factual flagged-form-to-suggestion assignment for lemmas already on this list is redistributed."
    },
    "vesum": {
      "id": "vesum",
      "title": "VESUM: a large morphological dictionary of Ukrainian",
      "publisher": "brown-uk (Andriy Rysin, Vasyl Starko and contributors)",
      "url": "https://github.com/brown-uk/dict_uk",
      "accessed": "2026-07-22",
      "kind": "morphological-dictionary",
      "cadence": "As the project publishes",
      "note": "The open Ukrainian morphology behind the same brown-uk project as the LanguageTool style tooling, and the lemma/part-of-speech backbone named in thread 3's method. Licensed under the dict_uk terms."
    },
    "wiktionary_kaikki": {
      "id": "wiktionary_kaikki",
      "title": "Wiktionary Ukrainian, machine-readable extraction (wiktextract / kaikki.org)",
      "publisher": "Wiktionary contributors; extraction by Tatu Ylonen (kaikki.org)",
      "url": "https://kaikki.org/dictionary/Ukrainian/",
      "accessed": "2026-07-22",
      "kind": "machine-readable-dictionary",
      "cadence": "As the extraction is regenerated",
      "note": "The open Wiktionary declension/conjugation tables and pronunciation data, extracted to JSONL. The source for thread 4 (audio and paradigms): each entry's forms array is the inflection paradigm, and its sounds array carries the IPA and the Wikimedia Commons audio file. Wiktionary content is CC-BY-SA 3.0 (and GFDL); only the factual lemma-to-forms/IPA assignment for the top 12000 lemmas is redistributed, and the audio is linked, never re-hosted."
    },
    "dmklinger_ukrainian": {
      "id": "dmklinger_ukrainian",
      "title": "dmklinger/ukrainian (an open Ukrainian-to-English dictionary)",
      "publisher": "Daniel Klinger",
      "url": "https://github.com/dmklinger/ukrainian",
      "accessed": "2026-10-03",
      "kind": "machine-readable-dictionary",
      "cadence": "As the author regenerates it",
      "note": "30,111 stressed headwords with English definitions, gender and animacy, scraped by its author from the English Wiktionary and DBnary with forms from the ULIF national dictionary; CC BY-SA 3.0. Snapshotted for the list's lemmas (src/data/ukrainian-frequency/dmk-dictionary.json) as the definitions tier of the word lookup and as a third reading of the stress column, scored rather than voted because it shares Wiktionary with the column's second stage. Andrij Rudnitsky pointed at it by email as the dictionary behind his own watch lookup."
    },
    "ukrainian_word_stress": {
      "id": "ukrainian_word_stress",
      "title": "ukrainian-word-stress 2.1.0 (the lang-uk Ukrainian stress dictionary)",
      "publisher": "lang-uk (Oleksiy Syvokon; maintained by Dmytro Chaplynskyi)",
      "url": "https://github.com/lang-uk/ukrainian-word-stress",
      "accessed": "2026-10-01",
      "kind": "stress-dictionary",
      "cadence": "As the library publishes a release",
      "note": "The open stress dictionary thread 07 is built on, read directly from its trie (the library's stanza-based context disambiguation is bypassed; readings are filtered by the list's own UD part of speech and lemma features instead). MIT. Two data errors found in the pass are queued upstream: йо́го for його́ and підозрюва́тися for підо́зрюватися."
    },
    "uk_wiktionary": {
      "id": "uk_wiktionary",
      "title": "Ukrainian Wiktionary (uk.wiktionary.org), pages-articles dump",
      "publisher": "Wikimedia Foundation",
      "url": "https://dumps.wikimedia.org/ukwiktionary/",
      "accessed": "2026-10-01",
      "kind": "dictionary-dump",
      "cadence": "As the dump is regenerated",
      "note": "The second Wiktionary voice in thread 07's stress vote, independent of en.wiktionary: the stress in each entry's headword line, read from the dump rather than the API (which rate-limits shared addresses). CC-BY-SA 3.0."
    },
    "uk_wikipedia": {
      "id": "uk_wikipedia",
      "title": "Ukrainian Wikipedia lead sentences",
      "publisher": "Wikimedia Foundation",
      "url": "https://uk.wikipedia.org/",
      "accessed": "2026-10-01",
      "kind": "encyclopedia",
      "cadence": "As articles change",
      "note": "Thread 07's last resort for proper nouns no dictionary covers: a stressed token in an article's lead sentence whose unstressed form equals the lemma, the article title recorded per row so a wrong bearer of a name can be audited. CC-BY-SA 4.0."
    },
    "goroh": {
      "id": "goroh",
      "title": "Горох (goroh.pp.ua), the online Ukrainian orthoepic reference",
      "publisher": "goroh.pp.ua",
      "url": "https://goroh.pp.ua/",
      "accessed": "2026-10-01",
      "kind": "reference-lookup",
      "cadence": "Consulted per word, never harvested",
      "note": "Used as a tiebreak only, one reference lookup per word for the conflicts the open sources could not settle: 19 rows cite it. Only the attested stress is recorded, no content is copied, and every such row is a ledgered manual decision in stress-overrides.json. Not an open license, which is why its reach is kept this small and counted on the page."
    },
    "wikimedia_commons": {
      "id": "wikimedia_commons",
      "title": "Wikimedia Commons Ukrainian pronunciation audio",
      "publisher": "Wikimedia Commons contributors",
      "url": "https://commons.wikimedia.org/wiki/Category:Ukrainian_pronunciation",
      "accessed": "2026-07-22",
      "kind": "pronunciation-audio",
      "cadence": "As contributors add recordings",
      "note": "The open native-speaker pronunciation recordings that thread 4 links (the audio file named in each Wiktionary entry's sounds array). Licensed CC-BY-SA; linked from the page, never re-hosted."
    },
    "learn_ukrainian": {
      "id": "learn_ukrainian",
      "title": "learn-ukrainian: a free open-source Ukrainian course (A1 to C2)",
      "publisher": "Krisztian Koos",
      "url": "https://github.com/learn-ukrainian/learn-ukrainian.github.io",
      "accessed": "2026-07-22",
      "kind": "open-course",
      "cadence": "As the course publishes",
      "note": "Open (CC-BY-SA 4.0), machine-readable per-lesson vocabulary with the CEFR level in the path; an expert selection based on the 2024 State Standard, not corpus-frequency validated. The joinable source behind the experimental overlay."
    },
    "borodin_2023": {
      "id": "borodin_2023",
      "title": "1000 and 1 Words: Lexical Minimum in Ukrainian (A1)",
      "publisher": "Borodin, K. and Turkevych, O., Slavic Language Education 3 (LANGUAGE-LAB)",
      "url": "https://doi.org/10.18452/28236",
      "accessed": "2026-07-27",
      "kind": "lexical-minimum",
      "cadence": "Static",
      "note": "A corpus-based A1 lexical minimum, licensed CC-BY-4.0. Long available only as a prose PDF behind an anti-bot wall; on 2026-07-27 co-author Kseniia Borodin (School of Ukrainian Language and Culture, Ukrainian Catholic University) shared the machine-readable word list directly for attributed open republication. Thread 2's second-A1-source consensus card is that list joined onto this one (see borodin-a1.SOURCE.md). The A2 volume of the same series was published open access in 2026 and is joined separately (see borodin_2026). Selection constraints confirmed by the co-author on 2026-09-24 (personal correspondence): thematic coverage follows the Official State Standard for Ukrainian as a Foreign Language, aligned with CEFR, under a strict cap of 1,000 words per level, and a word's grammar requirements were weighed with it, which is why some high-frequency prepositions sit at A2."
    },
    "borodin_2026": {
      "id": "borodin_2026",
      "title": "1000 and 1 Words: Lexical Minimum in Ukrainian (A2)",
      "publisher": "Borodin, K. and Lazarenko, O., Europa-Universitat Viadrina Frankfurt (Oder)",
      "url": "https://doi.org/10.11584/opus4-1448",
      "accessed": "2026-07-28",
      "kind": "lexical-minimum",
      "cadence": "Static",
      "note": "The A2 volume of the same series, published open access under CC-BY-4.0 on 2026-05-08 (URN urn:nbn:de:kobv:521-opus4-14485), 108 pages, 1000 register entries plus a thematic dictionary under 51 topic headings. Selection is corpus-based (GRAK and the Ukrainian Web 2022 corpus) plus editorial criteria; the co-author confirmed on 2026-09-24 that the editorial criteria are the Official State Standard for Ukrainian as a Foreign Language, aligned with CEFR, under a strict cap of 1,000 words per level, with each word's grammar requirements weighed alongside its frequency. Thread 2's A2 card is its register and its thematic index joined onto this list; the word list was extracted from the publication's own PDF (see borodin-a2.SOURCE.md), which is what the license permits and what the A1 volume needed a direct request to achieve."
    },
    "ubertext_genres": {
      "id": "ubertext_genres",
      "title": "UberText 2.0 subcorpora: fiction and news, read separately",
      "publisher": "lang-uk (Chaplynskyi, D.)",
      "url": "https://lang.org.ua/en/ubertext/",
      "accessed": "2026-07-28",
      "kind": "corpus",
      "cadence": "As lang-uk publishes a new edition",
      "note": "Thread 01's list is built on UberText's COMBINED corpus, whose largest component is news, so 'absent from the frequency list' was ambiguous between 'rare in Ukrainian' and 'absent from journalism'. Thread 06 resolves it by building one frequency list per subcorpus at equal size through one pipeline. Those derived ranks use our own pymorphy3 pass, not lang-uk's lemmatizer, so they are comparable to each other and never to the shipped list (see genre-split.SOURCE.md)."
    },
    "borodin_granaslavic_2026": {
      "id": "borodin_granaslavic_2026",
      "title": "Lexical Minimums for Levels A1 and A2 in Learning Ukrainian: Methodology and Practical Challenges",
      "publisher": "Borodin, K. and Lazarenko, O., in New Directions in Slavic Studies (T. Portnova, I. A. Gonzalez-Hidalgo, M. P. Pena-Molina, eds.), Editorial Universidad de Granada, ISBN 978-84-338-7814-4, pp. 41-52",
      "url": "https://editorial.ugr.es/",
      "accessed": "2026-07-28",
      "kind": "methodology",
      "cadence": "Static",
      "note": "The authors' own account of how both lexical minimums were built: the lineage from Thorndike's word book and West's General Service List through the critique that raw frequency is neither sufficient nor reliable, and the resulting mixed criteria (GRAK and Ukrainian Web 2022 corpus frequency, plus usefulness at the learning stage). This is the citation behind the `validated: false` flag the census puts on both Borodin rows: an expert selection with a documented method, not a corpus-validated CEFR profile. All rights reserved by the publisher, so it is cited and never redistributed here."
    },
    "state_standard_2024": {
      "id": "state_standard_2024",
      "title": "State Language Standard: Ukrainian as a Foreign Language, Levels A1 to C2 (SLSUFL)",
      "publisher": "Ministry of Education and Science of Ukraine",
      "url": "https://zakon.rada.gov.ua/laws/show/z0101-24",
      "accessed": "2026-07-22",
      "kind": "state-standard",
      "cadence": "As the standard is revised",
      "note": "The official CEFR-aligned UFL standard (2024). Per Synchak et al., it relies on expert judgment without a data-driven foundation or detailed vocabulary-range specification; published as documents, not machine-readable open data."
    },
    "pcuh_2020": {
      "id": "pcuh_2020",
      "title": "Teacher's Guide: Using the CEFR and Ukrainian-English Language Portfolios",
      "publisher": "Prokopchuk, N. and Huzar, O., Prairie Centre for the Study of Ukrainian Heritage (PCUH), University of Saskatchewan",
      "url": "https://pcuh.stmcollege.ca/wp-content/uploads/2020/09/UKR-ENG-CEFR-LP-Teacher-Guide_2020_v7-1.pdf",
      "accessed": "2026-07-27",
      "kind": "teacher-guide",
      "cadence": "Static",
      "note": "A CEFR-based (A1.1 to B1.2+) assessment methodology for Ukrainian-English heritage-language classrooms in Saskatchewan: can-do descriptor charts plus initial-assessment and language-portfolio guidance for teachers. No per-lemma or per-level vocabulary word list; its 'Reference Lists' section is a bibliography, not a word list. Copyright 2020, Ukrainian Language Assessment Project; no open license stated."
    },
    "kelly": {
      "id": "kelly",
      "title": "KELLY project: keywords for language learning (CEFR-graded lists)",
      "publisher": "Sprakbanken, University of Gothenburg",
      "url": "https://spraakbanken.gu.se/en/projects/kelly",
      "accessed": "2026-07-22",
      "kind": "cefr-wordlist-project",
      "cadence": "Static",
      "note": "Per-lemma, CEFR-graded, openly licensed word lists, the exact shape this page needs. Built for nine languages (Arabic, Chinese, English, Greek, Italian, Norwegian, Polish, Russian, Swedish). Ukrainian was never built."
    },
    "cefrlex": {
      "id": "cefrlex",
      "title": "CEFRLex: CEFR-graded receptive lexical resources",
      "publisher": "CENTAL, UCLouvain",
      "url": "https://cental.uclouvain.be/cefrlex/",
      "accessed": "2026-07-22",
      "kind": "cefr-wordlist-project",
      "cadence": "As the project publishes",
      "note": "Per-lemma CEFR receptive word lists for several languages (English, French, Spanish, Swedish, Estonian, and more). No Ukrainian edition."
    },
    "universalcefr": {
      "id": "universalcefr",
      "title": "UniversalCEFR: standardized CEFR-labeled datasets",
      "publisher": "UniversalCEFR",
      "url": "https://universalcefr.github.io/",
      "accessed": "2026-07-22",
      "kind": "cefr-dataset-project",
      "cadence": "As the project publishes",
      "note": "A bulk-downloadable, standardized CEFR dataset collection across 13 languages (Russian is the only Slavic member). Text-level, and no Ukrainian."
    }
  },
  "comparator": {
    "synchakA1A2Fiction": {
      "value": 48,
      "unit": "percent",
      "src": "synchak_2025"
    },
    "synchakA1A2News": {
      "value": 40,
      "unit": "percent",
      "src": "synchak_2025"
    },
    "synchakA1A2Academic": {
      "value": 32,
      "unit": "percent",
      "src": "synchak_2025"
    },
    "englishGslAverage": {
      "value": 82,
      "unit": "percent",
      "src": "synchak_2025"
    }
  },
  "threads": [
    {
      "id": "frequency-list",
      "num": "01",
      "title": "The lemma frequency list",
      "status": "released",
      "audience": [
        "learners",
        "teachers",
        "tool builders",
        "researchers"
      ],
      "summary": "The top 12000 lemmas of modern Ukrainian, ranked by corpus frequency, each with its part of speech, per-mille frequency, cumulative running-text coverage, and a thousand-rank frequency band. Published as CSV and JSON, plus an Anki-importable deck seed.",
      "useful": "Study the words that actually pay off first, in the right order, as lemmas rather than scattered wordforms. See exactly how much reading coverage a given amount of vocabulary buys.",
      "src": "ubertext",
      "cta": {
        "label": "Download the release",
        "href": "#release"
      }
    },
    {
      "id": "cefr-alignment",
      "num": "02",
      "title": "CEFR alignment",
      "status": "released",
      "audience": [
        "learners",
        "teachers",
        "researchers"
      ],
      "summary": "A validated per-lemma CEFR overlay: the only corpus-validated CEFR profile for Ukrainian (Synchak et al. 2025 / PULS) joined onto the frequency list, A1 to C1, for 6403 of the top 12000 lemmas, redistributed with the authors' permission as a dated snapshot. The published paper's distribution stays cited beside it, the open course overlay is kept as a measured cross-check, and the finding holds: the validated level tracks frequency only weakly, so a frequency rank is not a proficiency level.",
      "useful": "Study the high-frequency words in validated CEFR order, see which half of the list has a validated level and how far it reaches, and see how weakly proficiency level and raw frequency actually line up.",
      "src": "synchak_2025",
      "cta": {
        "label": "See the CEFR overlay",
        "href": "#cefr"
      }
    },
    {
      "id": "derussification",
      "num": "03",
      "title": "The derussification pass",
      "status": "released",
      "audience": [
        "learners",
        "teachers",
        "tool builders"
      ],
      "summary": "Flag non-idiomatic forms on the list and pair each with the native alternative the open Ukrainian style tooling recommends (LanguageTool's replacement tables, brown-uk, backed by the VESUM morphology). The core is derussification (russianisms, surzhyk, the active-participle calque); the honest scope is broader, and it is fenced as an unvalidated, prescriptive signal, not a settled verdict.",
      "useful": "Learn the idiomatic word, not the calqued one that older materials quietly teach, and see how often the calque is actually the more common form in real text.",
      "src": "languagetool_uk",
      "cta": {
        "label": "See the derussification pass",
        "href": "#derussification"
      }
    },
    {
      "id": "audio-paradigms",
      "num": "04",
      "title": "Audio and paradigms",
      "status": "released",
      "audience": [
        "learners",
        "tool builders"
      ],
      "summary": "Attach a pronunciation and the inflection paradigm to the top 12000 lemmas, from the open Wiktionary declension and conjugation tables (kaikki.org) and open Wikimedia pronunciation audio, so a lemma is taught as its forms rather than a bare headword. Coverage is graded honestly (it thins with rank), and the inflection multiplier is measured.",
      "useful": "Hear the word, see how it changes across the seven cases and the aspect pairs (the part inflection makes hard), and see how many wordforms the words you are learning actually expand to.",
      "src": "wiktionary_kaikki",
      "cta": {
        "label": "See the paradigms",
        "href": "#paradigms"
      }
    },
    {
      "id": "vocabulary-test",
      "num": "05",
      "title": "The vocabulary-size test",
      "status": "released",
      "audience": [
        "learners",
        "teachers"
      ],
      "summary": "A self-scoring yes or no vocabulary-size test drawn from this list: 60 real lemmas and 60 constructed pseudowords, stratified across the 12 frequency bands, scored with the standard false-alarm correction and mapped onto the coverage curve. No Ukrainian equivalent exists off the shelf.",
      "useful": "Measure your vocabulary against a real proficiency proxy instead of guessing, and see roughly how much running text that vocabulary actually unlocks.",
      "src": "meara_buffery_1991",
      "cta": {
        "label": "Take the test",
        "href": "/research/ukrainian-frequency/vocab-test"
      }
    },
    {
      "id": "word-stress",
      "num": "07",
      "title": "Word stress",
      "status": "released",
      "audience": [
        "learners",
        "teachers",
        "tool builders"
      ],
      "summary": "A stressed form for every one of the 12000 lemmas: the open lang-uk stress dictionary read by the list's own part of speech, en.wiktionary and uk.wiktionary to tell free variants, homographs and minor variants apart, a two-of-three vote where the sources disagree, and a ledger of every manual decision. Where there is one answer it is given; where there are more, the row says so instead of guessing.",
      "useful": "Say the words you are learning right from the first day, see where the stress is the difference between two words, and trust a label that says when there are two answers.",
      "src": "ukrainian_word_stress",
      "cta": {
        "label": "See the stress column",
        "href": "#stress"
      }
    },
    {
      "id": "text-profiler",
      "num": "06",
      "title": "The text profiler",
      "status": "released",
      "audience": [
        "teachers",
        "learners",
        "researchers"
      ],
      "summary": "Paste a Ukrainian text and see how much of it a learner can read: running-text coverage against a validated CEFR level or against what a class has actually covered (a pasted list, an uploaded CSV, the Borodin minimums, stacked and named), with the gloss list of what is left. Three counts are reported together, strict as the headline and the aspect-linked and family-linked readings as a range beneath it, with the specific words where the family assumption breaks flagged. A course reading list comes back as a sequence plan (cumulative new-word load, recycled words, orphans, a suggested order that respects pins). Validated against 29 level-marked course texts, and the result is published as it came out. Ships in Ukrainian and English editions; nothing pasted leaves the browser.",
      "useful": "Check a text against your own class before you assign it, get the gloss list in one click, order a semester's readings so each one costs the fewest new words, and see exactly where the profiler is and is not to be trusted.",
      "src": "laufer_nation_1995",
      "cta": {
        "label": "Open the text profiler",
        "href": "/research/ukrainian-frequency/profiler"
      }
    }
  ],
  "release": {
    "version": "v0.2.0",
    "dataset": "ukrainian-frequency-lemmas",
    "license": "CC-BY-4.0",
    "citation": "Lawrence, J. (2026). Ukrainian Frequency: a lemma-based, coverage-graded open frequency list (v0.2.0). jakelawrence.xyz/research/ukrainian-frequency. Derived from UberText 2.0 (Chaplynskyi, 2023).",
    "source": {
      "name": "UberText 2.0 lemma frequency dictionary",
      "publisher": "lang-uk",
      "url": "https://lang.org.ua/static/downloads/ubertext2.0/dicts/ubertext_freq.csv.xz",
      "citation": "Chaplynskyi, D. (2023). Introducing UberText 2.0: A Corpus of Modern Ukrainian at Scale. Proc. 2nd Ukrainian NLP Workshop (UNLP), ACL.",
      "accessed": "2026-07-14"
    },
    "wordTokenUniverse": 1495772089,
    "lemmas": 12000,
    "properNouns": 1348,
    "posHistogram": {
      "ADP": 77,
      "CCONJ": 25,
      "VERB": 2115,
      "PART": 84,
      "SCONJ": 32,
      "DET": 44,
      "NOUN": 5157,
      "PRON": 30,
      "PROPN": 1348,
      "ADV": 625,
      "ADJ": 2422,
      "NUM": 31,
      "INTJ": 10
    },
    "coverage": [
      {
        "lemmas": 100,
        "coverage": 0.3312,
        "coveragePct": 33.12
      },
      {
        "lemmas": 250,
        "coverage": 0.4243,
        "coveragePct": 42.43
      },
      {
        "lemmas": 500,
        "coverage": 0.512,
        "coveragePct": 51.2
      },
      {
        "lemmas": 1000,
        "coverage": 0.6081,
        "coveragePct": 60.81
      },
      {
        "lemmas": 1500,
        "coverage": 0.6654,
        "coveragePct": 66.54
      },
      {
        "lemmas": 2000,
        "coverage": 0.7058,
        "coveragePct": 70.58
      },
      {
        "lemmas": 3000,
        "coverage": 0.7604,
        "coveragePct": 76.04
      },
      {
        "lemmas": 4000,
        "coverage": 0.7958,
        "coveragePct": 79.58
      },
      {
        "lemmas": 5000,
        "coverage": 0.8207,
        "coveragePct": 82.07
      },
      {
        "lemmas": 6000,
        "coverage": 0.8392,
        "coveragePct": 83.92
      },
      {
        "lemmas": 8000,
        "coverage": 0.8657,
        "coveragePct": 86.57
      },
      {
        "lemmas": 10000,
        "coverage": 0.8842,
        "coveragePct": 88.42
      },
      {
        "lemmas": 12000,
        "coverage": 0.8977,
        "coveragePct": 89.77
      }
    ],
    "milestones": [
      {
        "rank": 1000,
        "lemma": "підозра",
        "pos": "NOUN",
        "coveragePct": 60.81
      },
      {
        "rank": 2000,
        "lemma": "власне",
        "pos": "PART",
        "coveragePct": 70.58
      },
      {
        "rank": 5000,
        "lemma": "афроамериканець",
        "pos": "NOUN",
        "coveragePct": 82.07
      },
      {
        "rank": 10000,
        "lemma": "Сулейман",
        "pos": "PROPN",
        "coveragePct": 88.42
      }
    ],
    "sample": [
      {
        "rank": 1,
        "lemma": "в",
        "pos": "ADP",
        "permille": 20.7489
      },
      {
        "rank": 2,
        "lemma": "на",
        "pos": "ADP",
        "permille": 20.6735
      },
      {
        "rank": 3,
        "lemma": "у",
        "pos": "ADP",
        "permille": 18.6486
      },
      {
        "rank": 4,
        "lemma": "і",
        "pos": "CCONJ",
        "permille": 16.5815
      },
      {
        "rank": 5,
        "lemma": "з",
        "pos": "ADP",
        "permille": 15.259
      },
      {
        "rank": 6,
        "lemma": "бути",
        "pos": "VERB",
        "permille": 10.6332
      },
      {
        "rank": 7,
        "lemma": "не",
        "pos": "PART",
        "permille": 10.4292
      },
      {
        "rank": 8,
        "lemma": "що",
        "pos": "SCONJ",
        "permille": 10.3296
      },
      {
        "rank": 9,
        "lemma": "до",
        "pos": "ADP",
        "permille": 9.1939
      },
      {
        "rank": 10,
        "lemma": "за",
        "pos": "ADP",
        "permille": 8.5376
      },
      {
        "rank": 11,
        "lemma": "та",
        "pos": "CCONJ",
        "permille": 8.4347
      },
      {
        "rank": 12,
        "lemma": "який",
        "pos": "DET",
        "permille": 7.9025
      },
      {
        "rank": 13,
        "lemma": "рік",
        "pos": "NOUN",
        "permille": 6.6948
      },
      {
        "rank": 14,
        "lemma": "про",
        "pos": "ADP",
        "permille": 6.2134
      },
      {
        "rank": 15,
        "lemma": "він",
        "pos": "PRON",
        "permille": 6.1849
      },
      {
        "rank": 16,
        "lemma": "Україна",
        "pos": "PROPN",
        "permille": 5.8085
      },
      {
        "rank": 17,
        "lemma": "це",
        "pos": "PRON",
        "permille": 5.7827
      },
      {
        "rank": 18,
        "lemma": "а",
        "pos": "CCONJ",
        "permille": 4.994
      },
      {
        "rank": 19,
        "lemma": "цей",
        "pos": "DET",
        "permille": 4.3466
      },
      {
        "rank": 20,
        "lemma": "як",
        "pos": "SCONJ",
        "permille": 4.203
      },
      {
        "rank": 21,
        "lemma": "для",
        "pos": "ADP",
        "permille": 4.1004
      },
      {
        "rank": 22,
        "lemma": "від",
        "pos": "ADP",
        "permille": 3.9154
      },
      {
        "rank": 23,
        "lemma": "я",
        "pos": "PRON",
        "permille": 3.642
      },
      {
        "rank": 24,
        "lemma": "вони",
        "pos": "PRON",
        "permille": 3.403
      }
    ],
    "files": [
      "lemmas.json",
      "lemmas.csv",
      "lemmas.anki.tsv",
      "coverage.json",
      "coverage.csv",
      "crosswalk.json",
      "crosswalk.csv",
      "cleanup.json"
    ],
    "sha256": {
      "lemmas.json": "886eda824ca993f4fdfebf7917ddca02144fc738ecbcabbf23b1d6b6df11e41e",
      "lemmas.csv": "185f108882d024e880f4432bcaeac1bcaab7abd0596121b8581609945cf6a0b2",
      "lemmas.anki.tsv": "9fc1e21beab72e7f8ab98aaddd19969b93d81d119afbdf5af709863d3eec45fe",
      "coverage.json": "befdde2251ea09d445db29f4ae50108d1e8b3220b2c2c7286156d85875ab91d5",
      "coverage.csv": "66d97ee8dea437d2068e9530b12beb758752585212fffc030a83dfce005e2668",
      "crosswalk.json": "ab3eb9842db39cce234016ab9c3730b6d93092769beb133a50203e1627858373",
      "crosswalk.csv": "17a3e8eb82e3d6a218b78af12c9073baeb5447d8435e7e8d7ed7114d765ae6c9",
      "cleanup.json": "07e42356f1e850141e0e1ad4a0a1e891c95c05ec2f56e48f6fdd6d8e3aa3c53a"
    },
    "downloadBase": "/downloads/ukrainian-frequency/v0.2.0",
    "migration": {
      "from": "v0.1.0",
      "to": "v0.2.0",
      "kept": 11914,
      "merged": 68,
      "dropped": 18,
      "entered": 86,
      "moved": 11182,
      "medianMove": 20
    },
    "predecessor": {
      "version": "v0.1.0",
      "downloadBase": "/downloads/ukrainian-frequency/v0.1.0",
      "citation": "Lawrence, J. (2026). Ukrainian Frequency: a lemma-based, coverage-graded open frequency list (v0.1.0). jakelawrence.xyz/research/ukrainian-frequency. Derived from UberText 2.0 (Chaplynskyi, 2023).",
      "lemmas": 12000,
      "wordTokenUniverse": 1495772089,
      "properNouns": 1335,
      "coverage": [
        {
          "lemmas": 100,
          "coverage": 0.3311,
          "coveragePct": 33.11
        },
        {
          "lemmas": 250,
          "coverage": 0.4243,
          "coveragePct": 42.43
        },
        {
          "lemmas": 500,
          "coverage": 0.5118,
          "coveragePct": 51.18
        },
        {
          "lemmas": 1000,
          "coverage": 0.6074,
          "coveragePct": 60.74
        },
        {
          "lemmas": 1500,
          "coverage": 0.6646,
          "coveragePct": 66.46
        },
        {
          "lemmas": 2000,
          "coverage": 0.705,
          "coveragePct": 70.5
        },
        {
          "lemmas": 3000,
          "coverage": 0.7596,
          "coveragePct": 75.96
        },
        {
          "lemmas": 4000,
          "coverage": 0.7951,
          "coveragePct": 79.51
        },
        {
          "lemmas": 5000,
          "coverage": 0.82,
          "coveragePct": 82
        },
        {
          "lemmas": 6000,
          "coverage": 0.8387,
          "coveragePct": 83.87
        },
        {
          "lemmas": 8000,
          "coverage": 0.8653,
          "coveragePct": 86.53
        },
        {
          "lemmas": 10000,
          "coverage": 0.8839,
          "coveragePct": 88.39
        },
        {
          "lemmas": 12000,
          "coverage": 0.8974,
          "coveragePct": 89.74
        }
      ],
      "files": [
        "lemmas.json",
        "lemmas.csv",
        "lemmas.anki.tsv",
        "coverage.json",
        "coverage.csv"
      ],
      "sha256": {
        "lemmas.json": "116c518dc1afaaa3f3b4a73b745c02c6b5c74465e9e1d2f0a9791f81870a63bc",
        "lemmas.csv": "708db1ecb2a0f662d5760cfdb743a7cf263438c56d3bea6333befa56e00eb863",
        "lemmas.anki.tsv": "f0af3c2388aec5d39bce14100005b8d25c760a1b8e1fc8ef9b3b9b1a4dd403b4",
        "coverage.json": "f5ffbfba9bd0bfd60013f0b490a6f6f30bfa77ba1c152f762573084098a3ccb7",
        "coverage.csv": "881bba691335d4fb955c32046f863e1d0721e4bf657b29e2114f13dd41132773"
      }
    }
  },
  "fullList": {
    "note": "The full 12000-lemma list ships as hashed CSV and JSON under the download base.",
    "downloadBase": "/downloads/ukrainian-frequency/v0.2.0",
    "files": [
      "lemmas.json",
      "lemmas.csv",
      "lemmas.anki.tsv",
      "coverage.json",
      "coverage.csv",
      "crosswalk.json",
      "crosswalk.csv",
      "cleanup.json"
    ]
  }
}