From 216cfc94bec505510e05d21fcb7f2aed4762649b Mon Sep 17 00:00:00 2001 From: Derek Gulbranson Date: Mon, 19 Oct 2026 23:05:13 -0700 Subject: [PATCH 1/6] Classify the rest of the titles; und.toml holds no title (#750) The 644 titles still generic in und.toml take their kinds and leave for the files of the languages whose names they occur in: occupations, military ranks, offices and modifiers mostly to en.toml, dr, prof, docent and professor to mul.toml, the noble ranks and native-script academic and religious titles to their languages' files. Four files are new (bin, ff, mi, yi). The block comments over the native-script titles become notes on one entry of each group, and duke's keep-out becomes an exclusion in en.toml with its counts. No compiled set moves: build --check is current and the snapshot matches. Part of #750. Co-Authored-By: Claude Opus 5.5 --- docs/design/decisions/salutation-titles.md | 2 +- docs/design/decisions/vocabulary-model.md | 9 + nameparser/vocab/README.md | 8 +- nameparser/vocab/ar.toml | 32 + nameparser/vocab/bg.toml | 12 + nameparser/vocab/bin.toml | 9 + nameparser/vocab/bn.toml | 52 + nameparser/vocab/da.toml | 4 + nameparser/vocab/de.toml | 99 +- nameparser/vocab/el.toml | 8 + nameparser/vocab/en.toml | 2208 +++++++++++++++- nameparser/vocab/es.toml | 4 + nameparser/vocab/et.toml | 4 + nameparser/vocab/fa.toml | 16 + nameparser/vocab/ff.toml | 5 + nameparser/vocab/fi.toml | 4 + nameparser/vocab/fr.toml | 73 +- nameparser/vocab/he.toml | 36 + nameparser/vocab/hi.toml | 64 + nameparser/vocab/hy.toml | 4 + nameparser/vocab/is.toml | 4 + nameparser/vocab/it.toml | 4 + nameparser/vocab/ka.toml | 4 + nameparser/vocab/lt.toml | 4 + nameparser/vocab/mi.toml | 5 + nameparser/vocab/mr.toml | 48 + nameparser/vocab/ms.toml | 4 + nameparser/vocab/mul.toml | 16 + nameparser/vocab/nb.toml | 8 + nameparser/vocab/ne.toml | 4 + nameparser/vocab/nl.toml | 16 + nameparser/vocab/pa.toml | 8 + nameparser/vocab/pl.toml | 4 + nameparser/vocab/pt.toml | 4 + nameparser/vocab/ru.toml | 20 + nameparser/vocab/sv.toml | 4 + nameparser/vocab/tr.toml | 8 + nameparser/vocab/uk.toml | 12 + nameparser/vocab/und.toml | 2659 +------------------- nameparser/vocab/yi.toml | 5 + nameparser/vocab/yo.toml | 8 + tests/v2/test_locales.py | 2 +- 42 files changed, 2807 insertions(+), 2697 deletions(-) create mode 100644 nameparser/vocab/bin.toml create mode 100644 nameparser/vocab/ff.toml create mode 100644 nameparser/vocab/mi.toml create mode 100644 nameparser/vocab/yi.toml diff --git a/docs/design/decisions/salutation-titles.md b/docs/design/decisions/salutation-titles.md index a233498b..b35fffdc 100644 --- a/docs/design/decisions/salutation-titles.md +++ b/docs/design/decisions/salutation-titles.md @@ -1,6 +1,6 @@ # salutation-titles — salutations, offices and ranks for the languages TITLES had none for (2026-10-04, #606) -Closes #606 (#662 later added owura and bapak, last bullet). No parser code moves: 41 words join TITLES and one, knt (Knight, beside kt), joins SUFFIX_ACRONYMS with a `Knt` case mask. The class is decided once — a word that addresses or ranks a person and is written in FRONT of the name — and each word is then argued on #vocabulary-collisions C-i, the position test, because TITLES has no ambiguous subset and the only two answers available are ship and do not ship. The per-word lists, grouped by language, are the titles carrying `issue = 606` (`uv run python tools/vocab/query.py --issue 606 --kind title`; one line per file a word is in; the #606 block of nameparser/config/titles.py until 2026-10-18, then TOML comments in nameparser/vocab/und.toml, and since 2026-10-19 (#750) the salutations' entries in their language files, the offices and counts still in und.toml). +Closes #606 (#662 later added owura and bapak, last bullet). No parser code moves: 41 words join TITLES and one, knt (Knight, beside kt), joins SUFFIX_ACRONYMS with a `Knt` case mask. The class is decided once — a word that addresses or ranks a person and is written in FRONT of the name — and each word is then argued on #vocabulary-collisions C-i, the position test, because TITLES has no ambiguous subset and the only two answers available are ship and do not ship. The per-word lists, grouped by language, are the titles carrying `issue = 606` (`uv run python tools/vocab/query.py --issue 606 --kind title`; one line per file a word is in; the #606 block of nameparser/config/titles.py until 2026-10-18, then TOML comments in nameparser/vocab/und.toml, and since 2026-10-19 (#750) the salutations' entries in their language files, and the offices' and the noble Counts' too since the second part of #750 the same day). - **The graf class, decided (Derek, 2026-10-04).** A word borne as a name, but RARELY as the first word of one, ships anyway, on the precedent of graf, which shipped though Steffi Graf exists. This is a judgment on each word's incidence in the leading position — the position C-i asks about — and not a rule, and it is an EXCEPTION to C-i rather than an application of it: C-i is an iff with no threshold, and herra, batoni, hrabia and kreivi were measured as borne in that position, so C-i says do not ship them (TITLES having no ambiguous subset to mark them in). What the exception adds is a weighing C-i does not make, a small measured incidence against the benefit of the title reading, and it is scoped to TITLES and to the words this entry names. It licenses nothing in the particle or suffix sets, and a later TITLES word that wants it is argued on its own counts. The title claim acts only in front, so most bearers are untouched in the forms they write: `Gladys Knight` and `Knight, Gladys` keep family Knight. The cost falls on a name that BEGINS with the word, the cost `Graf Steffi` already paid: `Greve Anna` reads title Greve, family Anna, and a given name is lost the same way, `Herra Wijaya` reading title Herra, family Wijaya. Declaring `FAMILY_FIRST` does not help, since the title claim is read before the order (`Hrabia Anna` reads title Hrabia under it); the family comma does. Two further limits, both pre-existing: a trailing period makes the word the title by rules/H5 (`Gladys Knight.` reads title `Knight.`, as `Mary Jane King.` does), and every word this entry adds widens that rule's reach, H5 claiming any listed title behind a period. Accepted rather than prevented, and stated at rules/H1's Accepted clause. The issue proposed the class for three words — greve (Scandinavian Count), graaf (Dutch Count), knight. The spot-check the issue asked for (forebears.io, 2026-10-04, worldwide counts rounded) found ten more of its "no known collision" words borne, and Derek extended the decision to all of them rather than excluding them: herra, batoni, ponas, counsel, ponia, the Filipino ginoo, ginang and binibini, and two whose registers often write the surname first, hrabia and kreivi. Each word's counts are on the `note` of its title reading in one of its files (herra's in fi.toml), a note beginning "borne" (`uv run python tools/vocab/query.py --issue 606 --kind title`; this bullet held them until 2026-10-19, #750). Those last two, and the given-name uses of herra and batoni, are the leading-position bearers this class accepts, and were decided on with their counts in hand. The line is NOT reproducible from this record, and that is said rather than hidden: the accepted side was counted, while the excluded side — thiru, puan, pan, rodina, ông/bà — was judged from general knowledge of each word, as #606 drafted it, with no count taken (the count source refused further lookups the same day). Each was judged a COMMON leading-position name, against counts in the hundreds on the accepted side; gróf was excluded for want of any evidence at all. Each refusal is an `excluded` entry in its language's file (`uv run python tools/vocab/query.py --excluded title --issue 606`). Whoever decides κόμης or the next salutation should count the excluded words first, and is free to find the line in a different place. Those notes are where a sweep meets the decision as it meets the word (the `# borne` comment in titles.py until 2026-10-18). - **Accents are not folded, and two words depend on it.** `_lexicon._normalize` lowercases and composes NFC and does nothing else to letters, so paní and härra cannot match Pani or Harra (the counts are on their notes). Accent-folding the lexicon would turn both into collisions; whoever proposes it re-argues this entry. frú depends on nothing: the unaccented fru (Swedish/Danish Mrs) already ships, so the Cameroonian surname Fru (its count on fru's note in sv.toml) already reads as a title in `Fru Anna` and did before this entry; that pre-existing collision is recorded here rather than argued, being no part of #606. diff --git a/docs/design/decisions/vocabulary-model.md b/docs/design/decisions/vocabulary-model.md index 1d2fd295..2a2f2079 100644 --- a/docs/design/decisions/vocabulary-model.md +++ b/docs/design/decisions/vocabulary-model.md @@ -64,3 +64,12 @@ The vocabulary was a set of base sets plus marker subsets (`particles` and `part - **Files.** Each reading went to the file of every language whose names it occurs in, a Latin transliteration to its source language's file as #749 put the Latin `bin` in ar.toml (`swami` in hi.toml and bn.toml, the sheikh cluster in ar.toml, `cheikh` in fr.toml too). Six files are new: ak, et, id, ro, sw and vi. The few abbreviations shared across European languages (`dr`, `prof`) will go to `mul.toml` with the rest of their kind; no salutation qualified, each language writing its own. - **The title keep-outs became exclusions**, in the file of the language whose reading they refuse, with their counts as name readings where counts were taken (malam, bay, shehu): `uv run python tools/vocab/query.py --excluded title`. The per-word counts in decisions/salutation-titles moved onto the `note` of each word's title reading, and the prose points at the query. The reasons the given-addressing comments gave for leaving `lord`, `lady`, `venerable`, `rabbi` and `imam` out of GIVEN_NAME_TITLES are notes on those words in und.toml until their kinds are assigned. - **Recompute** rather than quoting: `uv run python tools/vocab/query.py --kind salutation --count`, `--kind title --file und --count` (the titles still unclassified), `--excluded title`. + +- **2026-10-19 #750 — the rest of the titles classified (part 2 of #750).** No compiled set moves: `tools/vocab/build.py --check` reports the committed module current, and `tools/differential/snapshot.py` matches. The 644 titles still generic in `und.toml` on e943665e took their kinds and left for the files of the languages whose names they occur in, so `und.toml` holds no title. Part 1's hard cases are applied as decided there: `lord`, `lady`, `knight` and `chief` are `nobility`, `deputy` an `office`, and `dr` and `prof` are in mul.toml. + - **English holds most of them**: the bulk import's occupations, the US military ranks and their abbreviations, the offices, and the modifiers. `modifier` takes what is a title only inside a phrase: the qualifiers of ranks and offices (`vice`, `rear`, `petty`, `field`), the domain words of the descriptive titles (`baseball`, `software`, `tax`), the ordinals, and the court words of #9's list of judges' titles (`designated`, `docket`, `pro`, `edmi`). + - **Address, not subject, decides `academic`.** Besides the doctors and professors of every script, it takes the English words used to address a professional (`advocate`, `attorney`, `engineer`, `nurse`, and `md` as the medical degree written before a name), and the German abbreviations written before a name (`ra`, Rechtsanwalt; `wp`, Wirtschaftsprüfer; `pd` and `priv.-doz`; `dipl.-ing`). + - **mul.toml** takes `docent` and `professor` beside `dr` and `prof`: full words spelled alike in several European languages, listed once rather than in a file per language. + - **A transliteration goes to its source language**, as in part 1: the Islamic titles to ar.toml (`imam`, `mufti`, `mahdi`, `murshid`, `hajji`, `vizier`), or to fa.toml where the Latin spelling is the Persian form (`ayatollah`, `akhoond`, `mullah`, `pir`); `rabbi` to he.toml and `rebbe` to yi.toml; `maharajah`, `maharani` and `subedar` to hi.toml; `giani` and `gyani` to pa.toml; `tsar` and `tsarina` to ru.toml; `effendi` to tr.toml; `vardapet` to hy.toml. The Buddhist, Jain and Zoroastrian titles (`arhat`, `bodhisattva`, `buddha`, `siddha`, `tirthankar`, `saoshyant`) are in en.toml: no source-language name is written with these Latin spellings, which are English loanwords. Four files are new: bin (Edo, `edohen` and `ekegbian`), ff (Fula, `lamido`), mi (Māori, `rangatira`) and yi. + - **Gender** follows part 1's rule. The man's title of a noble pair is marked (`count`, `baron`, `graf`) as `king` is, and so is a `-man` word whose `-woman` pair the list holds (`businessman`); a descriptive noun beside its `-ess` form marks only the feminine (`actress`, `heiress`). `sultan` records none, Ottoman usage having given it to imperial women too (its note in tr.toml). + - **Comments became fields.** The #269, #343 and #344 block comments over the native-script titles are notes on one entry of each group (the Hebrew quote-boundary probe on `ד"ר`, the Bengali doctor split on `ড`); `duke`'s one-line keep-out is an exclusion in en.toml with its counts; the notes part 1 left on `lord`, `lady`, `venerable`, `rabbi` and `imam` moved with them. A reading `und.toml` shares with a moved title (`cpl`, `md`, `sa`, and `ms` from part 1) sits in a section of its own, as #749's did. + - **Recompute** rather than quoting: `uv run python tools/vocab/query.py --kind title --file und --count`, `--file en --kind modifier --count`, `--file mul`. diff --git a/nameparser/vocab/README.md b/nameparser/vocab/README.md index c9155add..ddd9541e 100644 --- a/nameparser/vocab/README.md +++ b/nameparser/vocab/README.md @@ -12,7 +12,7 @@ A file is named for a BCP 47 language tag in canonical case: `fr.toml`, `pt-BR.t Two tags are not languages: -- **`und`** (undetermined) holds the words not yet assigned a language. Most of the vocabulary is still here (1,287 of 1,900 entries on 2026-10-19, after the first part of #750), converted mechanically from the Python lists it used to be; assigning a word to a language means moving its entry to that language's file. The comments above an entry here are the vetting notes that stood above the word in the Python module, in their old order; classifying a category is what turns them into fields. +- **`und`** (undetermined) holds the words not yet assigned a language. A third of the entries are still here (653 of 1,941 on 2026-10-19, after #750 classified the titles), converted mechanically from the Python lists it used to be; assigning a word to a language means moving its entry to that language's file. The comments above an entry here are the vetting notes that stood above the word in the Python module, in their old order; classifying a category is what turns them into fields. - **`mul`** (multiple) holds words shared on purpose, such as the Roman numerals. The script is read from the word, not from the file: `sr.toml` holds `mlađi` and `млађи` side by side. A script subtag (`zh-Hant`) is for a difference the text cannot show. @@ -91,11 +91,11 @@ Text is compared by codepoint. The texts are already normalized, so this is the The build checks the order and never rewrites a file, because a comment above an entry belongs to it and must move with it, which a TOML reader cannot see. When the build says an entry belongs somewhere else, move it with its comment. The order is checked last, so any other refusal (an exclusion's reason, a `same_as` naming no word) is reported first. The same check refuses a `same_as` chain that loops, in every file. -`und.toml` is exempt. Its entries keep the order of the Python lists they were converted from, and its vetting comments still point at their neighbours ("the TITLES block below"); a word leaving it for a language file takes its place in that file's order. After moving entries out, re-read every comment that stays behind: a pointer to a neighbour ("above", "below", "the three above") may now name a block that left, and nothing checks it. #769's reviews found two such pointers in comments the PR had already rewritten ("the three above" over the Devanagari civil set, "the reason the Devanagari block above gives" over the Bengali one). +`und.toml` is exempt. Its entries keep the order of the Python lists they were converted from, and its vetting comments still point at their neighbours ("Same word as عبد below"); a word leaving it for a language file takes its place in that file's order. After moving entries out, re-read every comment that stays behind: a pointer to a neighbour ("above", "below", "the three above") may now name a block that left, and nothing checks it. #769's reviews found two such pointers in comments the PR had already rewritten ("the three above" over the Devanagari civil set, "the reason the Devanagari block above gives" over the Bengali one). ## Kinds -A reading's key is its **kind**. The table lists the kinds in their canonical order, which is the [word order](#word-order)'s first key and `CATEGORY`'s order in `tools/vocab/build.py`. Each kind belongs to one **category**, and the category decides which compiled set the reading feeds. For title, suffix, particle and conjunction the category's own name is also a kind (`title = {}`: a title not yet classified), so classifying a word later is a data edit that moves no compiled set. The one exception: a generic `suffix = {}` classified as `credential` moves from `SUFFIX_WORDS` to `SUFFIX_ACRONYMS`, because a credential's `acronym` is true unwritten; write `acronym = false` to keep it where it was. The suffix and particle categories are classified (two particles of unrecorded origin, `bon` and `dí`, keep the generic kind in `und.toml`); the titles are being classified (#750), the salutations and the titles that address by the given name first, the rest still generic in `und.toml`; the others carry their generic kind. +A reading's key is its **kind**. The table lists the kinds in their canonical order, which is the [word order](#word-order)'s first key and `CATEGORY`'s order in `tools/vocab/build.py`. Each kind belongs to one **category**, and the category decides which compiled set the reading feeds. For title, suffix, particle and conjunction the category's own name is also a kind (`title = {}`: a title not yet classified), so classifying a word later is a data edit that moves no compiled set. The one exception: a generic `suffix = {}` classified as `credential` moves from `SUFFIX_WORDS` to `SUFFIX_ACRONYMS`, because a credential's `acronym` is true unwritten; write `acronym = false` to keep it where it was. The suffix and particle categories are classified (two particles of unrecorded origin, `bon` and `dí`, keep the generic kind in `und.toml`); so are the titles (#750); the others carry their generic kind. | Kind | Category | Compiled into | |---|---|---| @@ -134,7 +134,7 @@ A reading's key is its **kind**. The table lists the kinds in their canonical or A suffix reading goes to `SUFFIX_ACRONYMS` when its `acronym` property is true and to `SUFFIX_WORDS` otherwise; the column shows where each kind goes with `acronym` unwritten. A word has at most one suffix kind (check 4). -The title kinds say what the title is. The examples include words still generic in `und.toml`, which the later parts of #750 classify: +The title kinds say what the title is: - `salutation`: a language's everyday form of address, its "Mr" and "Mrs" (`mr`, `mrs`, `mx`, `herr`, `señora`, `г-н`, `श्री`), and the English `master` for a boy; - `style`: an honorific style or dignity rather than an office (`hon`, `excellency`, `highness`, `sheikh`); diff --git a/nameparser/vocab/ar.toml b/nameparser/vocab/ar.toml index ea713471..c99d18b0 100644 --- a/nameparser/vocab/ar.toml +++ b/nameparser/vocab/ar.toml @@ -1,5 +1,9 @@ schema = 1 +[[word]] +text = "hajji" +style = { expands = "one who has made the Hajj" } + [[word]] text = "sheikh" style = { addresses = "given", gender = "m" } @@ -88,6 +92,22 @@ academic = { addresses = "given", gender = "f", issue = 269, expands = "doctor" text = "مهندس" academic = { addresses = "given", gender = "m", issue = 269, expands = "engineer", note = "a genuine title in Egyptian usage" } +[[word]] +text = "imam" +religious = { note = "addresses by the TITLE, not the given name, and the tradition keeps surnames, so it stays out of GIVEN_NAME_TITLES (#346)" } + +[[word]] +text = "mahdi" +religious = {} + +[[word]] +text = "mufti" +religious = {} + +[[word]] +text = "murshid" +religious = { expands = "a Sufi guide" } + [[word]] text = "الحاج" religious = { addresses = "given", gender = "m", issue = 269, expands = "the hajji, one who has made the hajj" } @@ -96,6 +116,14 @@ religious = { addresses = "given", gender = "m", issue = 269, expands = "the haj text = "الحاجة" religious = { addresses = "given", gender = "f", issue = 269, expands = "the hajja, one who has made the hajj" } +[[word]] +text = "sultan" +nobility = {} + +[[word]] +text = "sultana" +nobility = { gender = "f" } + [[word]] text = "أمير" excluded = { nobility = { reason = "Amir is a common given name", issue = 269 } } @@ -104,6 +132,10 @@ excluded = { nobility = { reason = "Amir is a common given name", issue = 269 } text = "سلطان" excluded = { nobility = { reason = "Sultan is a common given name", issue = 269 } } +[[word]] +text = "vizier" +office = {} + [[word]] text = "الأب" generation = { issue = 679, note = "the father" } diff --git a/nameparser/vocab/bg.toml b/nameparser/vocab/bg.toml index f35b9de5..462ce04e 100644 --- a/nameparser/vocab/bg.toml +++ b/nameparser/vocab/bg.toml @@ -8,6 +8,18 @@ salutation = { gender = "f", issue = 269, expands = "госпожа, Mrs." } text = "г-н" salutation = { gender = "m", issue = 269, expands = "господин, Mr." } +[[word]] +text = "акад" +academic = { issue = 269, expands = "academician" } + +[[word]] +text = "д-р" +academic = { issue = 269, expands = "doctor" } + +[[word]] +text = "проф" +academic = { issue = 269, expands = "professor" } + [[word]] text = "мл" [word.generation] diff --git a/nameparser/vocab/bin.toml b/nameparser/vocab/bin.toml new file mode 100644 index 00000000..1f56e5a7 --- /dev/null +++ b/nameparser/vocab/bin.toml @@ -0,0 +1,9 @@ +schema = 1 + +[[word]] +text = "edohen" +nobility = { expands = "a Benin palace chieftaincy title" } + +[[word]] +text = "ekegbian" +nobility = { expands = "a Benin chieftaincy title" } diff --git a/nameparser/vocab/bn.toml b/nameparser/vocab/bn.toml index acec12de..952eb819 100644 --- a/nameparser/vocab/bn.toml +++ b/nameparser/vocab/bn.toml @@ -60,6 +60,14 @@ salutation = { gender = "m", issue = 343, expands = "Shri, Mr." } text = "শ্রীমতী" salutation = { gender = "f", issue = 343, expands = "Shrimati, Mrs." } +[[word]] +text = "আলহাজ্ব" +style = { issue = 343, expands = "Alhaj" } + +[[word]] +text = "আলহাজ" +style = { issue = 343, same_as = "আলহাজ্ব", expands = "Alhaj, the spelling without the ব-phala" } + [[word]] text = "ঠাকুর" excluded = { style = { reason = "a genuine Bengali honorific (lord, master) that is also Tagore, the surname", issue = 343 } } @@ -68,6 +76,38 @@ excluded = { style = { reason = "a genuine Bengali honorific (lord, master) that text = "শেখ" excluded = { style = { reason = "a clan name and a family name ('শেখ হাসিনা'); the Latin sheikh cluster ships for the Arabic addressing form, while the Indic spellings name the family", issue = 343, decided = 2026-09-06 } } +[[word]] +text = "অধ্যাপক" +academic = { issue = 343, expands = "professor" } + +[[word]] +text = "ড" +academic = { issue = 343, expands = "Dr., the PhD's", note = "the doctor abbreviations split by profession, ড./ডঃ the PhD's and ডাঃ/ডা. the Bangladeshi physician's; a period spelling matches its bare stem through the edge-period normalization, so each stem is listed once, and the visarga ঃ (U+0983, a spacing combining mark) reaches the lexicon intact; no Latin twins, for the reason the sri/shri exclusions in hi.toml give" } + +[[word]] +text = "ডঃ" +academic = { issue = 343, same_as = "ড", expands = "Dr., the PhD's, visarga spelling" } + +[[word]] +text = "ডক্টর" +academic = { issue = 343, expands = "doctor, full form" } + +[[word]] +text = "ডা" +academic = { issue = 343, expands = "Dr., the physician's" } + +[[word]] +text = "ডাঃ" +academic = { issue = 343, same_as = "ডা", expands = "Dr., the physician's, visarga spelling" } + +[[word]] +text = "ডাক্তার" +academic = { issue = 343, expands = "doctor, full form (physician)" } + +[[word]] +text = "প্রফেসর" +academic = { issue = 343, expands = "professor, borrowed form" } + [[word]] text = "baba" religious = { addresses = "given", issue = 346 } @@ -88,6 +128,14 @@ religious = { addresses = "given", issue = 343, expands = "Guru" } text = "বাবা" religious = { addresses = "given", issue = 343, expands = "Baba" } +[[word]] +text = "মাওলানা" +religious = { issue = 343, expands = "Maulana" } + +[[word]] +text = "মুফতি" +religious = { issue = 343, expands = "Mufti", note = "the Latin mufti ships too, in ar.toml" } + [[word]] text = "শ্রীল" religious = { addresses = "given", issue = 343, expands = "Srila, the Vaishnava honorific (শ্রীল প্রভুপাদ)", note = "no Latin twin; unprefixed শ্রী is the civil salutation" } @@ -96,6 +144,10 @@ religious = { addresses = "given", issue = 343, expands = "Srila, the Vaishnava text = "স্বামী" religious = { addresses = "given", issue = 343, expands = "Swami" } +[[word]] +text = "বিচারপতি" +office = { issue = 343, expands = "Justice" } + [[word]] text = "জুনিয়র" generation = { issue = 679 } diff --git a/nameparser/vocab/da.toml b/nameparser/vocab/da.toml index 1a900d44..bfcfa81e 100644 --- a/nameparser/vocab/da.toml +++ b/nameparser/vocab/da.toml @@ -24,6 +24,10 @@ salutation = { gender = "m" } text = "hr" salutation = { gender = "m", same_as = "herr" } +[[word]] +text = "greve" +nobility = { gender = "m", expands = "count", issue = 606 } + [[word]] text = "af" preposition = { may_be_given = false, expands = "of, nobiliary" } diff --git a/nameparser/vocab/de.toml b/nameparser/vocab/de.toml index b6f53778..7b9ea75b 100644 --- a/nameparser/vocab/de.toml +++ b/nameparser/vocab/de.toml @@ -28,6 +28,96 @@ salutation = { gender = "m", same_as = "herr" } text = "herren" salutation = { gender = "m", expands = "the plural of Herr" } +[[word]] +text = "dipl.-ing" +academic = { expands = "Diplom-Ingenieur" } + +[[word]] +text = "fh-prof" +academic = { expands = "Fachhochschul-Professor" } + +[[word]] +text = "priv.-doz" +academic = { expands = "Privatdozent" } + +[[word]] +text = "pd" +academic = { same_as = "priv.-doz" } + +[[word]] +text = "ra" +academic = { expands = "Rechtsanwalt, the address of a lawyer, 'RA Müller'" } + +[[word]] +text = "univ.prof" +academic = { expands = "Universitätsprofessor" } + +[[word]] +text = "wp" +academic = { expands = "Wirtschaftsprüfer, the address of an auditor" } + +[[word]] +text = "erzbischof" +religious = { expands = "archbishop" } + +[[word]] +text = "fürsterzbischof" +religious = { expands = "prince-archbishop" } + +[[word]] +text = "baron" +nobility = { gender = "m" } + +[[word]] +text = "edler" +nobility = { gender = "m", expands = "the lowest German noble rank, 'Edler von'" } + +[[word]] +text = "freifrau" +nobility = { gender = "f", expands = "baroness" } + +[[word]] +text = "freiherr" +nobility = { gender = "m", expands = "baron" } +[word.rank] +may_be_given = true +issue = 18 +expands = "baron" +gender = "m" +note = "Since 1919 a former noble title is part of the legal surname, written before the particle (\"Karl-Theodor Freiherr von und zu Guttenberg\"), so it chains like one. Also in TITLES, load-bearing" + +[[word]] +text = "fürst" +nobility = { gender = "m", expands = "prince" } + +[[word]] +text = "graf" +nobility = { gender = "m", expands = "count" } + +[[word]] +text = "großfürst" +nobility = { gender = "m", expands = "grand prince, grand duke" } + +[[word]] +text = "gräfin" +nobility = { gender = "f", expands = "countess" } + +[[word]] +text = "herzog" +nobility = { gender = "m", expands = "duke" } + +[[word]] +text = "prinz" +nobility = { gender = "m", expands = "prince" } + +[[word]] +text = "reichsgraf" +nobility = { gender = "m", expands = "imperial count" } + +[[word]] +text = "ritter" +nobility = { gender = "m", expands = "knight" } + [[word]] text = "auf" preposition = { may_be_given = false, issue = 18, expands = "upon: \"auf der Heide\"" } @@ -63,15 +153,6 @@ article = { may_be_given = true, expands = "the: \"von den Steinen\"" } text = "der" article = { may_be_given = false, expands = "the: \"von der Leyen\"" } -[[word]] -text = "freiherr" -[word.rank] -may_be_given = true -issue = 18 -expands = "baron" -gender = "m" -note = "Since 1919 a former noble title is part of the legal surname, written before the particle (\"Karl-Theodor Freiherr von und zu Guttenberg\"), so it chains like one. Also in TITLES, load-bearing" - [[word]] text = "freiherrin" [word.rank] diff --git a/nameparser/vocab/el.toml b/nameparser/vocab/el.toml index 41ec6df2..77622b68 100644 --- a/nameparser/vocab/el.toml +++ b/nameparser/vocab/el.toml @@ -12,6 +12,14 @@ salutation = { gender = "f", issue = 269, expands = "κυρία, Mrs." } text = "κος" salutation = { gender = "m", issue = 269, expands = "κύριος, Mr." } +[[word]] +text = "δρ" +academic = { issue = 269, expands = "doctor" } + +[[word]] +text = "καθ" +academic = { issue = 269, expands = "professor" } + [[word]] text = "σίνιορ" generation = { issue = 679 } diff --git a/nameparser/vocab/en.toml b/nameparser/vocab/en.toml index 18211864..338db36b 100644 --- a/nameparser/vocab/en.toml +++ b/nameparser/vocab/en.toml @@ -48,73 +48,2205 @@ salutation = { gender = "f" } text = "mx" salutation = { gender = "n" } +[[word]] +text = "doyen" +style = {} + +[[word]] +text = "eminence" +style = {} + +[[word]] +text = "excellency" +style = {} + +[[word]] +text = "highness" +style = {} + +[[word]] +text = "holiness" +style = {} + +[[word]] +text = "honorable" +style = {} + +[[word]] +text = "hon" +style = { same_as = "honorable", note = "sorry Hon Solo, but judges seem more common." } + +[[word]] +text = "honourable" +style = { same_as = "honorable" } + +[[word]] +text = "majesty" +style = {} + +[[word]] +text = "advocate" +academic = { expands = "the address of an advocate, 'Adv. Smith' in South Africa and India" } + +[[word]] +text = "attorney" +academic = { expands = "the address of a lawyer, 'Atty. Cruz'" } + +[[word]] +text = "doctor" +academic = {} + +[[word]] +text = "engineer" +academic = { expands = "the address of an engineer, 'Engr. Cruz' in the Philippines and Nigeria" } + +[[word]] +text = "md" +academic = { note = "the medical degree written before the name (#32); a leading Md. abbreviating Muhammad lands in the same field (decisions/indic-honorifics)" } + +[[word]] +text = "nurse" +academic = { expands = "the address of a nurse, 'Nurse Smith'" } + +[[word]] +text = "abbess" +religious = { gender = "f" } + +[[word]] +text = "abbot" +religious = { gender = "m" } + +[[word]] +text = "acolyte" +religious = {} + +[[word]] +text = "adept" +religious = {} + +[[word]] +text = "archbishop" +religious = {} + +[[word]] +text = "archdeacon" +religious = {} + +[[word]] +text = "archdruid" +religious = {} + +[[word]] +text = "arhat" +religious = {} + +[[word]] +text = "bishop" +religious = {} + +[[word]] +text = "bp" +religious = { same_as = "bishop" } + +[[word]] +text = "blessed" +religious = { expands = "beatified, 'Blessed Teresa'" } + +[[word]] +text = "bodhisattva" +religious = {} + [[word]] text = "brother" religious = { addresses = "given", gender = "m", expands = "a member of a religious order, 'Brother Roger'" } [[word]] -text = "father" -religious = { addresses = "given", gender = "m", expands = "a priest, 'Father Brown'" } +text = "buddha" +religious = {} + +[[word]] +text = "canon" +religious = {} + +[[word]] +text = "cardinal" +religious = {} + +[[word]] +text = "catholicos" +religious = {} + +[[word]] +text = "chaplain" +religious = {} + +[[word]] +text = "deacon" +religious = {} + +[[word]] +text = "dcn" +religious = { same_as = "deacon" } + +[[word]] +text = "druid" +religious = {} + +[[word]] +text = "evangelist" +religious = {} + +[[word]] +text = "father" +religious = { addresses = "given", gender = "m", expands = "a priest, 'Father Brown'" } + +[[word]] +text = "fr" +religious = { expands = "Father, Friar" } + +[[word]] +text = "friar" +religious = {} + +[[word]] +text = "metropolitan" +religious = {} + +[[word]] +text = "met" +religious = { same_as = "metropolitan" } + +[[word]] +text = "mgr" +religious = { expands = "Monsignor, Monseigneur" } + +[[word]] +text = "monk" +religious = {} + +[[word]] +text = "monsignor" +religious = {} + +[[word]] +text = "mother" +religious = { addresses = "given", gender = "f", expands = "a mother superior, 'Mother Teresa'" } + +[[word]] +text = "pastor" +religious = {} + +[[word]] +text = "patriarch" +religious = {} + +[[word]] +text = "pope" +religious = { addresses = "given" } + +[[word]] +text = "prelate" +religious = {} + +[[word]] +text = "presbyter" +religious = {} + +[[word]] +text = "priest" +religious = {} + +[[word]] +text = "priestess" +religious = { gender = "f" } + +[[word]] +text = "primate" +religious = {} + +[[word]] +text = "prior" +religious = {} + +[[word]] +text = "reverend" +religious = {} + +[[word]] +text = "rev" +religious = { same_as = "reverend" } + +[[word]] +text = "saint" +religious = {} + +[[word]] +text = "saoshyant" +religious = {} + +[[word]] +text = "siddha" +religious = {} + +[[word]] +text = "sister" +religious = { addresses = "given", gender = "f", expands = "a nun or religious sister, 'Sister Mary'" } + +[[word]] +text = "st" +religious = { expands = "Saint, abbreviated" } +[word.saint] +may_be_given = true +expands = "Saint, abbreviated" +note = "Also in TITLES and consumed there before particle logic runs, so moving it between the may-be-given and never-given halves changes nothing; kept for the load-bearing TITLES intersection" + +[[word]] +text = "tirthankar" +religious = {} + +[[word]] +text = "venerable" +religious = { note = "stays out of GIVEN_NAME_TITLES: its traditions split on surname retention (Buddhist monastics drop the family name, Anglican archdeacons keep it), and addresses cannot say 'sometimes' (#346)" } + +[[word]] +text = "vicar" +religious = {} + +[[word]] +text = "archduchess" +nobility = { gender = "f" } + +[[word]] +text = "archduke" +nobility = { gender = "m" } + +[[word]] +text = "baron" +nobility = { gender = "m" } + +[[word]] +text = "baroness" +nobility = { gender = "f" } + +[[word]] +text = "chief" +nobility = { expands = "a chief of a people or clan, 'Chief Obafemi Awolowo'" } + +[[word]] +text = "chieftain" +nobility = {} + +[[word]] +text = "count" +nobility = { gender = "m" } + +[[word]] +text = "countess" +nobility = { gender = "f" } + +[[word]] +text = "dame" +nobility = { addresses = "given", gender = "f", expands = "the female knighthood, 'Dame Judi Dench'" } + +[[word]] +text = "duke" +given = { us_ssa = 11595, wikidata = 151, as_of = 2026-10-19, note = "male births only" } +family = { us_census_2010 = 35053, wikidata = 315, as_of = 2026-10-19 } +excluded = { nobility = "a common given name (Duke Ellington), and a surname besides" } + +[[word]] +text = "dutchess" +nobility = { gender = "f", note = "a misspelling of duchess, shipped as written; duchess itself is not in the vocabulary" } + +[[word]] +text = "emperor" +nobility = { gender = "m" } + +[[word]] +text = "empress" +nobility = { gender = "f" } + +[[word]] +text = "heir" +nobility = {} + +[[word]] +text = "heiress" +nobility = { gender = "f" } + +[[word]] +text = "king" +nobility = { addresses = "given", gender = "m" } + +[[word]] +text = "knight" +nobility = { gender = "m", expands = "the rank the post-nominal knt names", issue = 606, note = "borne (Gladys Knight, who keeps family Knight in the forms she writes); one of the three words #606 proposed the graf class for" } + +[[word]] +text = "lady" +nobility = { gender = "f", note = "stays out of GIVEN_NAME_TITLES, decided: the given-name form ('Lady Diana') is a courtesy style for the daughters of the senior ranks alone, while every wife takes the title or surname ('Lady Thatcher'), and the text does not carry the rank (#519)" } + +[[word]] +text = "lord" +nobility = { gender = "m", note = "stays out of GIVEN_NAME_TITLES, decided: the given-name form ('Lord Peter') is a courtesy style for the children of the senior ranks alone, while every peer takes the title or surname ('Lord Byron'), and the text does not carry the rank (#519)" } + +[[word]] +text = "marchess" +nobility = { gender = "f" } + +[[word]] +text = "marchioness" +nobility = { gender = "f" } + +[[word]] +text = "marquess" +nobility = { gender = "m" } + +[[word]] +text = "marquis" +nobility = { gender = "m" } + +[[word]] +text = "marquise" +nobility = { gender = "f" } + +[[word]] +text = "pharaoh" +nobility = {} + +[[word]] +text = "prince" +nobility = { addresses = "given", gender = "m", issue = 519, note = "addresses by the GIVEN name ('Prince Harry', 'Princess Anne'); membership decides only which field the one word behind it takes, and 'Prince Fielder' is #348's collision either way" } + +[[word]] +text = "princess" +nobility = { addresses = "given", gender = "f", issue = 519, note = "addresses by the GIVEN name ('Prince Harry', 'Princess Anne'); membership decides only which field the one word behind it takes, and 'Prince Fielder' is #348's collision either way" } + +[[word]] +text = "queen" +nobility = { addresses = "given", gender = "f" } + +[[word]] +text = "sir" +nobility = { addresses = "given", gender = "m", expands = "a knight or baronet, 'Sir John'" } + +[[word]] +text = "viscount" +nobility = { gender = "m" } + +[[word]] +text = "1lt" +military = { expands = "First Lieutenant" } + +[[word]] +text = "1stlt" +military = { same_as = "1lt" } + +[[word]] +text = "1sgt" +military = { expands = "First Sergeant" } + +[[word]] +text = "1stsgt" +military = { same_as = "1sgt" } + +[[word]] +text = "2lt" +military = { expands = "Second Lieutenant" } + +[[word]] +text = "2ndlt" +military = { same_as = "2lt" } + +[[word]] +text = "a1c" +military = { expands = "Airman First Class" } + +[[word]] +text = "ab" +military = { expands = "Airman Basic" } + +[[word]] +text = "adjutant" +military = {} + +[[word]] +text = "admiral" +military = {} + +[[word]] +text = "adm" +military = { same_as = "admiral" } + +[[word]] +text = "amn" +military = { expands = "Airman" } + +[[word]] +text = "bg" +military = { expands = "Brigadier General" } + +[[word]] +text = "bgen" +military = { same_as = "bg" } + +[[word]] +text = "briggen" +military = { same_as = "bg" } + +[[word]] +text = "brigadier" +military = {} + +[[word]] +text = "captain" +military = {} + +[[word]] +text = "capt" +military = { same_as = "captain" } + +[[word]] +text = "cpt" +military = { same_as = "captain" } + +[[word]] +text = "ccmsgt" +military = { expands = "Command Chief Master Sergeant" } + +[[word]] +text = "cmsaf" +military = { expands = "Chief Master Sergeant of the Air Force" } + +[[word]] +text = "cmsgt" +military = { expands = "Chief Master Sergeant" } + +[[word]] +text = "colonel" +military = {} + +[[word]] +text = "col" +military = { same_as = "colonel" } + +[[word]] +text = "commander" +military = {} + +[[word]] +text = "cdr" +military = { same_as = "commander" } + +[[word]] +text = "commander-in-chief" +military = {} + +[[word]] +text = "commodore" +military = {} + +[[word]] +text = "corporal" +military = {} + +[[word]] +text = "cpl" +military = { same_as = "corporal" } + +[[word]] +text = "cpo" +military = { expands = "Chief Petty Officer" } + +[[word]] +text = "csm" +military = { expands = "Command Sergeant Major" } + +[[word]] +text = "cwo2" +military = { expands = "Chief Warrant Officer 2" } + +[[word]] +text = "cwo-2" +military = { same_as = "cwo2" } + +[[word]] +text = "cwo3" +military = { expands = "Chief Warrant Officer 3" } + +[[word]] +text = "cwo-3" +military = { same_as = "cwo3" } + +[[word]] +text = "cwo4" +military = { expands = "Chief Warrant Officer 4" } + +[[word]] +text = "cwo-4" +military = { same_as = "cwo4" } + +[[word]] +text = "cwo5" +military = { expands = "Chief Warrant Officer 5" } + +[[word]] +text = "cwo-5" +military = { same_as = "cwo5" } + +[[word]] +text = "detective" +military = { expands = "the police rank, 'Detective Smith'" } + +[[word]] +text = "ens" +military = { expands = "Ensign" } + +[[word]] +text = "fadm" +military = { expands = "Fleet Admiral" } + +[[word]] +text = "gaf" +military = { expands = "General of the Air Force" } + +[[word]] +text = "general" +military = {} + +[[word]] +text = "gen" +military = { same_as = "general" } + +[[word]] +text = "generalissimo" +military = {} + +[[word]] +text = "gysgt" +military = { expands = "Gunnery Sergeant" } + +[[word]] +text = "lcdr" +military = { expands = "Lieutenant Commander" } + +[[word]] +text = "lcpl" +military = { expands = "Lance Corporal" } + +[[word]] +text = "lieutenant" +military = {} + +[[word]] +text = "lt" +military = { same_as = "lieutenant" } + +[[word]] +text = "ltc" +military = { expands = "Lieutenant Colonel" } + +[[word]] +text = "ltcol" +military = { same_as = "ltc" } + +[[word]] +text = "ltg" +military = { expands = "Lieutenant General" } + +[[word]] +text = "ltgen" +military = { same_as = "ltg" } + +[[word]] +text = "ltjg" +military = { expands = "Lieutenant (junior grade)" } + +[[word]] +text = "maj" +military = { expands = "Major" } + +[[word]] +text = "marshal" +excluded = { military = { reason = "a given name (Marshal Yanda); the accepted cost is that 'Field Marshal Bernard Montgomery' reads title Field, given Marshal", issue = 606, decided = 2026-10-04 } } + +[[word]] +text = "mcpo" +military = { expands = "Master Chief Petty Officer" } + +[[word]] +text = "mcpoc" +military = { expands = "Master Chief Petty Officer of the Coast Guard" } + +[[word]] +text = "mcpon" +military = { expands = "Master Chief Petty Officer of the Navy" } + +[[word]] +text = "mg" +military = { expands = "Major General" } + +[[word]] +text = "majgen" +military = { same_as = "mg" } + +[[word]] +text = "mgysgt" +military = { expands = "Master Gunnery Sergeant" } + +[[word]] +text = "mpco-cg" +military = { note = "as shipped; the rank is MCPO-CG, Master Chief Petty Officer of the Coast Guard, already listed as mcpoc" } + +[[word]] +text = "msg" +military = { expands = "Master Sergeant" } + +[[word]] +text = "msgt" +military = { same_as = "msg" } + +[[word]] +text = "officer" +military = { expands = "the police rank, 'Officer Smith'" } + +[[word]] +text = "pfc" +military = { expands = "Private First Class" } + +[[word]] +text = "po1" +military = { expands = "Petty Officer First Class" } + +[[word]] +text = "po2" +military = { expands = "Petty Officer Second Class" } + +[[word]] +text = "po3" +military = { expands = "Petty Officer Third Class" } + +[[word]] +text = "private" +military = {} + +[[word]] +text = "pvt" +military = { same_as = "private" } + +[[word]] +text = "pv2" +military = { expands = "Private (E-2)" } + +[[word]] +text = "radm" +military = { expands = "Rear Admiral" } + +[[word]] +text = "rdml" +military = { same_as = "radm" } + +[[word]] +text = "sa" +military = { expands = "Seaman Apprentice" } + +[[word]] +text = "scpo" +military = { expands = "Senior Chief Petty Officer" } + +[[word]] +text = "sergeant" +military = {} + +[[word]] +text = "sgt" +military = { same_as = "sergeant" } + +[[word]] +text = "sfc" +military = { expands = "Sergeant First Class" } + +[[word]] +text = "sgm" +military = { expands = "Sergeant Major" } + +[[word]] +text = "sgtmaj" +military = { same_as = "sgm" } + +[[word]] +text = "sgtmajmc" +military = { expands = "Sergeant Major of the Marine Corps" } + +[[word]] +text = "sma" +military = { expands = "Sergeant Major of the Army" } + +[[word]] +text = "smsgt" +military = { expands = "Senior Master Sergeant" } + +[[word]] +text = "sn" +military = { expands = "Seaman" } + +[[word]] +text = "spc" +military = { expands = "Specialist" } + +[[word]] +text = "ssg" +military = { expands = "Staff Sergeant" } + +[[word]] +text = "ssgt" +military = { same_as = "ssg" } + +[[word]] +text = "subaltern" +military = {} + +[[word]] +text = "tsgt" +military = { expands = "Technical Sergeant" } + +[[word]] +text = "vadm" +military = { expands = "Vice Admiral" } + +[[word]] +text = "wo1" +military = { expands = "Warrant Officer 1" } + +[[word]] +text = "wo-1" +military = { same_as = "wo1" } + +[[word]] +text = "wo2" +military = { expands = "Warrant Officer 2" } + +[[word]] +text = "wo3" +military = { expands = "Warrant Officer 3" } + +[[word]] +text = "wo4" +military = { expands = "Warrant Officer 4" } + +[[word]] +text = "wo5" +military = { expands = "Warrant Officer 5" } + +[[word]] +text = "administrator" +office = { issue = 606 } + +[[word]] +text = "alderman" +office = {} + +[[word]] +text = "almoner" +office = {} + +[[word]] +text = "ambassador" +office = {} + +[[word]] +text = "arbitrator" +office = {} + +[[word]] +text = "attaché" +office = {} + +[[word]] +text = "attache" +office = { same_as = "attaché" } + +[[word]] +text = "bailiff" +office = {} + +[[word]] +text = "burgess" +office = {} + +[[word]] +text = "ceo" +office = {} + +[[word]] +text = "cfo" +office = {} + +[[word]] +text = "chair" +office = {} + +[[word]] +text = "chairs" +office = { same_as = "chair" } + +[[word]] +text = "chancellor" +office = {} + +[[word]] +text = "chargé" +office = { expands = "chargé d'affaires, the head of a mission below an ambassador" } + +[[word]] +text = "charge" +office = { same_as = "chargé", note = "unaccented 'chargé', like attaché/'attache'" } + +[[word]] +text = "clerk" +office = {} + +[[word]] +text = "co-chair" +office = {} + +[[word]] +text = "co-chairs" +office = { same_as = "co-chair" } + +[[word]] +text = "commissioner" +office = { issue = 606 } + +[[word]] +text = "comptroller" +office = {} + +[[word]] +text = "controller" +office = {} + +[[word]] +text = "councillor" +office = {} + +[[word]] +text = "counsel" +office = { issue = 606, note = "borne: ~730 surnames (Australia, the US, England), forebears.io, worldwide, rounded, 2026-10-04; shipped under the graf class (decisions/salutation-titles)" } + +[[word]] +text = "courtier" +office = {} + +[[word]] +text = "delegate" +office = {} + +[[word]] +text = "deputy" +office = {} + +[[word]] +text = "dpty" +office = { same_as = "deputy" } + +[[word]] +text = "director" +office = {} + +[[word]] +text = "dir" +office = { same_as = "director" } + +[[word]] +text = "envoy" +office = {} + +[[word]] +text = "governor" +office = {} + +[[word]] +text = "gov" +office = { same_as = "governor" } + +[[word]] +text = "headman" +office = {} + +[[word]] +text = "intendant" +office = {} + +[[word]] +text = "judge" +office = {} + +[[word]] +text = "justice" +excluded = { office = { reason = "a given name (Justice Smith); the accepted cost is that 'Chief Justice John Roberts' reads title Chief, given Justice", issue = 606, decided = 2026-10-04 } } + +[[word]] +text = "leader" +office = {} + +[[word]] +text = "magistrate" +office = {} + +[[word]] +text = "mag" +office = { same_as = "magistrate" } + +[[word]] +text = "magistrate-judge" +office = {} + +[[word]] +text = "mag-judge" +office = { same_as = "magistrate-judge" } + +[[word]] +text = "mag/judge" +office = { same_as = "magistrate-judge" } + +[[word]] +text = "mayor" +office = {} + +[[word]] +text = "minister" +office = {} + +[[word]] +text = "prefect" +office = {} + +[[word]] +text = "premier" +office = {} + +[[word]] +text = "president" +office = {} + +[[word]] +text = "pres" +office = { same_as = "president" } + +[[word]] +text = "principal" +office = {} + +[[word]] +text = "prin" +office = { same_as = "principal" } + +[[word]] +text = "provost" +office = {} + +[[word]] +text = "pslc" +office = { expands = "Pro Se Law Clerk (#9)" } + +[[word]] +text = "pursuivant" +office = {} + +[[word]] +text = "registrar" +office = {} + +[[word]] +text = "representative" +office = {} + +[[word]] +text = "rep" +office = { same_as = "representative" } + +[[word]] +text = "secretary" +office = {} + +[[word]] +text = "senator" +office = {} + +[[word]] +text = "senior-judge" +office = {} + +[[word]] +text = "sheriff" +office = {} + +[[word]] +text = "speaker" +office = {} + +[[word]] +text = "swordbearer" +office = {} + +[[word]] +text = "treasurer" +office = {} + +[[word]] +text = "vc" +office = { expands = "Vice-Chancellor" } + +[[word]] +text = "verderer" +office = {} + +[[word]] +text = "warden" +office = {} + +[[word]] +text = "wm" +office = { note = "added for #68 with no expansion recorded; Wm. also abbreviates William" } + +[[word]] +text = "abolitionist" +occupation = {} + +[[word]] +text = "academic" +occupation = {} + +[[word]] +text = "activist" +occupation = {} + +[[word]] +text = "actor" +occupation = {} + +[[word]] +text = "actress" +occupation = { gender = "f" } + +[[word]] +text = "adviser" +occupation = {} + +[[word]] +text = "anarchist" +occupation = {} + +[[word]] +text = "animator" +occupation = {} + +[[word]] +text = "anthropologist" +occupation = {} + +[[word]] +text = "apprentice" +occupation = {} + +[[word]] +text = "archeologist" +occupation = {} + +[[word]] +text = "architect" +occupation = {} + +[[word]] +text = "arranger" +occupation = {} + +[[word]] +text = "astronomer" +occupation = {} + +[[word]] +text = "author" +occupation = {} + +[[word]] +text = "bandleader" +occupation = {} + +[[word]] +text = "banker" +occupation = {} + +[[word]] +text = "bard" +occupation = {} + +[[word]] +text = "barrister" +occupation = {} + +[[word]] +text = "bibliographer" +occupation = {} + +[[word]] +text = "biochemist" +occupation = {} + +[[word]] +text = "biographer" +occupation = {} + +[[word]] +text = "biologist" +occupation = {} + +[[word]] +text = "blogger" +occupation = {} + +[[word]] +text = "bookseller" +occupation = {} + +[[word]] +text = "botanist" +occupation = {} + +[[word]] +text = "broadcaster" +occupation = {} + +[[word]] +text = "businessman" +occupation = { gender = "m" } + +[[word]] +text = "businesswoman" +occupation = { gender = "f" } + +[[word]] +text = "cartographer" +occupation = {} + +[[word]] +text = "cartoonist" +occupation = {} + +[[word]] +text = "celebrity" +occupation = {} + +[[word]] +text = "chef" +occupation = {} + +[[word]] +text = "chemist" +occupation = {} + +[[word]] +text = "choreographer" +occupation = {} + +[[word]] +text = "clergyman" +occupation = { gender = "m" } + +[[word]] +text = "co-founder" +occupation = {} + +[[word]] +text = "coach" +occupation = {} + +[[word]] +text = "collector" +occupation = {} + +[[word]] +text = "comedian" +occupation = {} + +[[word]] +text = "comedienne" +occupation = { gender = "f" } + +[[word]] +text = "comic" +occupation = {} + +[[word]] +text = "composer" +occupation = {} + +[[word]] +text = "conductor" +occupation = {} + +[[word]] +text = "consultant" +occupation = {} + +[[word]] +text = "correspondent" +occupation = {} + +[[word]] +text = "counselor" +occupation = {} + +[[word]] +text = "criminologist" +occupation = {} + +[[word]] +text = "critic" +occupation = {} + +[[word]] +text = "curator" +occupation = {} + +[[word]] +text = "cyclist" +occupation = {} + +[[word]] +text = "dancer" +occupation = {} + +[[word]] +text = "designer" +occupation = {} + +[[word]] +text = "developer" +occupation = {} + +[[word]] +text = "diplomat" +occupation = {} + +[[word]] +text = "dissident" +occupation = {} + +[[word]] +text = "dramatist" +occupation = {} + +[[word]] +text = "drummer" +occupation = {} + +[[word]] +text = "ecologist" +occupation = {} + +[[word]] +text = "economist" +occupation = {} + +[[word]] +text = "editor" +occupation = {} + +[[word]] +text = "educator" +occupation = {} + +[[word]] +text = "entertainer" +occupation = {} + +[[word]] +text = "entrepreneur" +occupation = {} + +[[word]] +text = "essayist" +occupation = {} + +[[word]] +text = "expert" +occupation = {} + +[[word]] +text = "forester" +occupation = {} + +[[word]] +text = "founder" +occupation = {} + +[[word]] +text = "guitarist" +occupation = {} + +[[word]] +text = "historian" +occupation = {} + +[[word]] +text = "host" +occupation = {} + +[[word]] +text = "illustrator" +occupation = {} + +[[word]] +text = "industrialist" +occupation = {} + +[[word]] +text = "instructor" +occupation = {} + +[[word]] +text = "inventor" +occupation = {} + +[[word]] +text = "investigator" +occupation = {} + +[[word]] +text = "investor" +occupation = {} + +[[word]] +text = "journalist" +occupation = {} + +[[word]] +text = "journeyman" +occupation = {} + +[[word]] +text = "jurist" +occupation = {} + +[[word]] +text = "keyboardist" +occupation = {} + +[[word]] +text = "lawyer" +occupation = {} + +[[word]] +text = "lecturer" +occupation = {} + +[[word]] +text = "librarian" +occupation = {} + +[[word]] +text = "linguist" +occupation = {} + +[[word]] +text = "lyricist" +occupation = {} + +[[word]] +text = "magnate" +occupation = {} + +[[word]] +text = "maid" +occupation = { addresses = "given", gender = "f", expands = "'Maid Marian'" } + +[[word]] +text = "manager" +occupation = {} + +[[word]] +text = "mathematician" +occupation = {} + +[[word]] +text = "memoirist" +occupation = {} + +[[word]] +text = "merchant" +occupation = {} + +[[word]] +text = "missionary" +occupation = {} + +[[word]] +text = "mobster" +occupation = {} + +[[word]] +text = "model" +occupation = {} + +[[word]] +text = "mountaineer" +occupation = {} + +[[word]] +text = "musician" +occupation = {} + +[[word]] +text = "musicologist" +occupation = {} + +[[word]] +text = "nanny" +occupation = {} + +[[word]] +text = "narrator" +occupation = {} + +[[word]] +text = "naturalist" +occupation = {} + +[[word]] +text = "neuroscientist" +occupation = {} + +[[word]] +text = "novelist" +occupation = {} + +[[word]] +text = "obstetritian" +occupation = { note = "a misspelling of obstetrician, shipped as written" } + +[[word]] +text = "ornithologist" +occupation = {} + +[[word]] +text = "painter" +occupation = {} + +[[word]] +text = "paleontologist" +occupation = {} + +[[word]] +text = "pediatrician" +occupation = {} + +[[word]] +text = "personality" +occupation = {} + +[[word]] +text = "philantropist" +occupation = { note = "a misspelling of philanthropist, shipped as written" } + +[[word]] +text = "philosopher" +occupation = {} + +[[word]] +text = "photographer" +occupation = {} + +[[word]] +text = "physician" +occupation = {} + +[[word]] +text = "physicist" +occupation = {} + +[[word]] +text = "pianist" +occupation = {} + +[[word]] +text = "pilot" +occupation = {} + +[[word]] +text = "pioneer" +occupation = {} + +[[word]] +text = "player" +occupation = {} + +[[word]] +text = "playwright" +occupation = {} + +[[word]] +text = "poet" +occupation = {} + +[[word]] +text = "politician" +occupation = {} + +[[word]] +text = "printer" +occupation = {} + +[[word]] +text = "printmaker" +occupation = {} + +[[word]] +text = "producer" +occupation = {} + +[[word]] +text = "psychiatrist" +occupation = {} + +[[word]] +text = "psychologist" +occupation = {} + +[[word]] +text = "publisher" +occupation = {} + +[[word]] +text = "ranger" +occupation = {} + +[[word]] +text = "researcher" +occupation = {} + +[[word]] +text = "sailor" +occupation = {} + +[[word]] +text = "satirist" +occupation = {} + +[[word]] +text = "scholar" +occupation = {} + +[[word]] +text = "schoolmaster" +occupation = {} + +[[word]] +text = "scientist" +occupation = {} + +[[word]] +text = "screenwriter" +occupation = {} + +[[word]] +text = "servant" +occupation = {} + +[[word]] +text = "singer" +occupation = {} + +[[word]] +text = "singer-songwriter" +occupation = {} + +[[word]] +text = "sociologist" +occupation = {} + +[[word]] +text = "soldier" +occupation = {} + +[[word]] +text = "solicitor" +occupation = {} + +[[word]] +text = "soprano" +occupation = {} + +[[word]] +text = "suffragist" +occupation = {} + +[[word]] +text = "surgeon" +occupation = {} + +[[word]] +text = "teacher" +occupation = {} + +[[word]] +text = "technologist" +occupation = {} + +[[word]] +text = "tenor" +occupation = {} + +[[word]] +text = "theologian" +occupation = {} + +[[word]] +text = "theorist" +occupation = {} + +[[word]] +text = "translator" +occupation = {} + +[[word]] +text = "vocalist" +occupation = {} + +[[word]] +text = "woodman" +occupation = {} + +[[word]] +text = "writer" +occupation = {} + +[[word]] +text = "zoologist" +occupation = {} + +[[word]] +text = "aunt" +kinship = { addresses = "given", gender = "f" } + +[[word]] +text = "auntie" +kinship = { addresses = "given", gender = "f", same_as = "aunt" } + +[[word]] +text = "matriarch" +kinship = { gender = "f" } + +[[word]] +text = "uncle" +kinship = { addresses = "given", gender = "m" } + +[[word]] +text = "10th" +modifier = {} + +[[word]] +text = "1st" +modifier = {} + +[[word]] +text = "2nd" +modifier = {} + +[[word]] +text = "3rd" +modifier = {} + +[[word]] +text = "4th" +modifier = {} + +[[word]] +text = "5th" +modifier = {} + +[[word]] +text = "6th" +modifier = {} [[word]] -text = "mother" -religious = { addresses = "given", gender = "f", expands = "a mother superior, 'Mother Teresa'" } +text = "7th" +modifier = {} [[word]] -text = "pope" -religious = { addresses = "given" } +text = "8th" +modifier = {} [[word]] -text = "sister" -religious = { addresses = "given", gender = "f", expands = "a nun or religious sister, 'Sister Mary'" } +text = "9th" +modifier = {} [[word]] -text = "dame" -nobility = { addresses = "given", gender = "f", expands = "the female knighthood, 'Dame Judi Dench'" } +text = "advertising" +modifier = {} [[word]] -text = "king" -nobility = { addresses = "given", gender = "m" } +text = "air" +modifier = {} [[word]] -text = "prince" -nobility = { addresses = "given", gender = "m", issue = 519, note = "addresses by the GIVEN name ('Prince Harry', 'Princess Anne'); membership decides only which field the one word behind it takes, and 'Prince Fielder' is #348's collision either way" } +text = "analytics" +modifier = {} [[word]] -text = "princess" -nobility = { addresses = "given", gender = "f", issue = 519, note = "addresses by the GIVEN name ('Prince Harry', 'Princess Anne'); membership decides only which field the one word behind it takes, and 'Prince Fielder' is #348's collision either way" } +text = "appellate" +modifier = {} [[word]] -text = "queen" -nobility = { addresses = "given", gender = "f" } +text = "army" +modifier = {} [[word]] -text = "sir" -nobility = { addresses = "given", gender = "m", expands = "a knight or baronet, 'Sir John'" } +text = "assistant" +modifier = {} [[word]] -text = "marshal" -excluded = { military = { reason = "a given name (Marshal Yanda); the accepted cost is that 'Field Marshal Bernard Montgomery' reads title Field, given Marshal", issue = 606, decided = 2026-10-04 } } +text = "asst" +modifier = { same_as = "assistant" } [[word]] -text = "justice" -excluded = { office = { reason = "a given name (Justice Smith); the accepted cost is that 'Chief Justice John Roberts' reads title Chief, given Justice", issue = 606, decided = 2026-10-04 } } +text = "associate" +modifier = {} [[word]] -text = "maid" -occupation = { addresses = "given", gender = "f", expands = "'Maid Marian'" } +text = "assoc" +modifier = { same_as = "associate" } [[word]] -text = "aunt" -kinship = { addresses = "given", gender = "f" } +text = "award-winning" +modifier = {} [[word]] -text = "auntie" -kinship = { addresses = "given", gender = "f", same_as = "aunt" } +text = "ballet" +modifier = {} [[word]] -text = "uncle" -kinship = { addresses = "given", gender = "m" } +text = "banner" +modifier = {} + +[[word]] +text = "baseball" +modifier = {} + +[[word]] +text = "bearer" +modifier = { expands = "Standard Bearer, Sword Bearer" } + +[[word]] +text = "behavioral" +modifier = {} + +[[word]] +text = "bench" +modifier = {} + +[[word]] +text = "biblical" +modifier = {} + +[[word]] +text = "blues" +modifier = {} + +[[word]] +text = "british" +modifier = {} + +[[word]] +text = "burlesque" +modifier = {} + +[[word]] +text = "business" +modifier = {} + +[[word]] +text = "civil" +modifier = {} + +[[word]] +text = "classical" +modifier = {} + +[[word]] +text = "computer" +modifier = {} + +[[word]] +text = "corporate" +modifier = {} + +[[word]] +text = "credit" +modifier = {} + +[[word]] +text = "criminal" +modifier = {} + +[[word]] +text = "customs" +modifier = {} + +[[word]] +text = "d'affaires" +modifier = { expands = "the second word of chargé d'affaires" } + +[[word]] +text = "designated" +modifier = { expands = "Designated Judge (#9)" } + +[[word]] +text = "discovery" +modifier = { expands = "a US court word, from #9's list of federal judges' titles" } + +[[word]] +text = "district" +modifier = {} + +[[word]] +text = "division" +modifier = {} + +[[word]] +text = "docket" +modifier = { expands = "Docket Clerk (#9)" } + +[[word]] +text = "edmi" +modifier = { note = "from #9's list of federal judges' titles, its meaning unrecorded there (a court's initials, perhaps the Eastern District of Michigan)" } + +[[word]] +text = "english" +modifier = {} + +[[word]] +text = "excellent" +modifier = { expands = "'His Most Excellent Majesty'" } + +[[word]] +text = "executive" +modifier = {} + +[[word]] +text = "exec" +modifier = { same_as = "executive" } + +[[word]] +text = "family" +modifier = { expands = "Family Court (#9)" } + +[[word]] +text = "federal" +modifier = {} + +[[word]] +text = "field" +modifier = {} + +[[word]] +text = "film" +modifier = {} + +[[word]] +text = "financial" +modifier = {} + +[[word]] +text = "first" +modifier = {} + +[[word]] +text = "flag" +modifier = {} + +[[word]] +text = "flying" +modifier = {} + +[[word]] +text = "foreign" +modifier = {} + +[[word]] +text = "grand" +modifier = {} + +[[word]] +text = "group" +modifier = {} + +[[word]] +text = "her" +modifier = { gender = "f", expands = "'Her Majesty'" } + +[[word]] +text = "hereditary" +modifier = {} + +[[word]] +text = "high" +modifier = {} + +[[word]] +text = "his" +modifier = { gender = "m", expands = "'His Holiness'" } + +[[word]] +text = "information" +modifier = {} + +[[word]] +text = "intelligence" +modifier = {} + +[[word]] +text = "judicial" +modifier = {} + +[[word]] +text = "king's" +modifier = { expands = "King's Counsel" } + +[[word]] +text = "kingdom" +modifier = {} + +[[word]] +text = "knowledge" +modifier = {} + +[[word]] +text = "law" +modifier = {} + +[[word]] +text = "legal" +modifier = {} + +[[word]] +text = "literary" +modifier = {} + +[[word]] +text = "marcher" +modifier = { expands = "Marcher Lord" } + +[[word]] +text = "marketing" +modifier = {} + +[[word]] +text = "mathematics" +modifier = {} + +[[word]] +text = "member" +modifier = {} + +[[word]] +text = "military" +modifier = {} + +[[word]] +text = "most" +modifier = { expands = "'Most Reverend'" } + +[[word]] +text = "municipal" +modifier = {} + +[[word]] +text = "mystery" +modifier = {} + +[[word]] +text = "national" +modifier = {} + +[[word]] +text = "navy" +modifier = {} + +[[word]] +text = "opera" +modifier = {} + +[[word]] +text = "operating" +modifier = {} + +[[word]] +text = "petty" +modifier = {} + +[[word]] +text = "police" +modifier = {} + +[[word]] +text = "political" +modifier = {} + +[[word]] +text = "presiding" +modifier = {} + +[[word]] +text = "prime" +modifier = {} + +[[word]] +text = "pro" +modifier = { expands = "Pro Se Law Clerk (#9)" } + +[[word]] +text = "queen's" +modifier = { expands = "Queen's Counsel" } + +[[word]] +text = "radio" +modifier = {} + +[[word]] +text = "rear" +modifier = {} + +[[word]] +text = "resident" +modifier = {} + +[[word]] +text = "revenue" +modifier = {} + +[[word]] +text = "right" +modifier = { expands = "'Right Honourable', 'Right Reverend'" } + +[[word]] +text = "rt" +modifier = { same_as = "right" } + +[[word]] +text = "risk" +modifier = {} + +[[word]] +text = "rock" +modifier = {} + +[[word]] +text = "royal" +modifier = {} + +[[word]] +text = "security" +modifier = {} + +[[word]] +text = "senior" +modifier = {} +[word.excluded] +generation = { reason = "Senior is a surname (3,864 US Census bearers)", issue = 679 } + +[[word]] +text = "soccer" +modifier = {} + +[[word]] +text = "social" +modifier = {} + +[[word]] +text = "software" +modifier = {} + +[[word]] +text = "special" +modifier = {} + +[[word]] +text = "staff" +modifier = {} + +[[word]] +text = "state" +modifier = {} + +[[word]] +text = "states" +modifier = {} + +[[word]] +text = "strategy" +modifier = {} + +[[word]] +text = "superior" +modifier = { expands = "'Mother Superior'" } + +[[word]] +text = "supreme" +modifier = {} + +[[word]] +text = "tax" +modifier = {} + +[[word]] +text = "technical" +modifier = {} + +[[word]] +text = "television" +modifier = {} + +[[word]] +text = "theater" +modifier = {} + +[[word]] +text = "theatre" +modifier = { same_as = "theater" } + +[[word]] +text = "travel" +modifier = {} + +[[word]] +text = "uk" +modifier = {} + +[[word]] +text = "united" +modifier = {} + +[[word]] +text = "us" +modifier = {} + +[[word]] +text = "vice" +modifier = {} + +[[word]] +text = "voice" +modifier = {} + +[[word]] +text = "warrant" +modifier = {} + +[[word]] +text = "wing" +modifier = {} [[word]] text = "jr" @@ -128,11 +2260,6 @@ generation = { same_as = "jr" } text = "junior" generation = { same_as = "jr" } -[[word]] -text = "senior" -[word.excluded] -generation = { reason = "Senior is a surname (3,864 US Census bearers)", issue = 679 } - [[word]] text = "sr" generation = {} @@ -174,10 +2301,3 @@ issue = 360 expands = "son of, Mac contracted" same_as = "mac" note = "Unlike 'mac' (Mac Miller) it is not a standalone given name. Measured misparse: \"Mc Donald\" gave given='Mc'. Also in SUFFIX_ACRONYMS as Master of Ceremonies, but that is trailing position and unaffected -- \"John Smith MC\" still reads suffix (#360)." - -[[word]] -text = "st" -[word.saint] -may_be_given = true -expands = "Saint, abbreviated" -note = "Also in TITLES and consumed there before particle logic runs, so moving it between the may-be-given and never-given halves changes nothing; kept for the load-bearing TITLES intersection" diff --git a/nameparser/vocab/es.toml b/nameparser/vocab/es.toml index 39b8c3cf..b4d12d2d 100644 --- a/nameparser/vocab/es.toml +++ b/nameparser/vocab/es.toml @@ -40,6 +40,10 @@ salutation = { gender = "f" } text = "srtas" salutation = { gender = "f", same_as = "señoritas" } +[[word]] +text = "dra" +academic = { gender = "f", expands = "Doctora, Doutora" } + [[word]] text = "de" preposition = { may_be_given = false, expands = "of" } diff --git a/nameparser/vocab/et.toml b/nameparser/vocab/et.toml index 9383be0c..f85d7901 100644 --- a/nameparser/vocab/et.toml +++ b/nameparser/vocab/et.toml @@ -11,3 +11,7 @@ salutation = { issue = 606, gender = "f" } [[word]] text = "proua" salutation = { issue = 606, gender = "f" } + +[[word]] +text = "krahv" +nobility = { gender = "m", expands = "count", issue = 606 } diff --git a/nameparser/vocab/fa.toml b/nameparser/vocab/fa.toml index 62868f52..89067529 100644 --- a/nameparser/vocab/fa.toml +++ b/nameparser/vocab/fa.toml @@ -1,5 +1,21 @@ schema = 1 +[[word]] +text = "akhoond" +religious = { expands = "akhund, a Shia cleric" } + +[[word]] +text = "ayatollah" +religious = {} + +[[word]] +text = "mullah" +religious = {} + +[[word]] +text = "pir" +religious = { expands = "a Sufi master" } + [[word]] text = "جونیور" generation = { issue = 679 } diff --git a/nameparser/vocab/ff.toml b/nameparser/vocab/ff.toml new file mode 100644 index 00000000..c0b7c37b --- /dev/null +++ b/nameparser/vocab/ff.toml @@ -0,0 +1,5 @@ +schema = 1 + +[[word]] +text = "lamido" +nobility = { expands = "a Fulani emir" } diff --git a/nameparser/vocab/fi.toml b/nameparser/vocab/fi.toml index 817ce8a5..fbad874b 100644 --- a/nameparser/vocab/fi.toml +++ b/nameparser/vocab/fi.toml @@ -12,6 +12,10 @@ salutation = { issue = 606, gender = "f" } text = "rouva" salutation = { issue = 606, gender = "f" } +[[word]] +text = "kreivi" +nobility = { gender = "m", expands = "count", issue = 606, note = "borne: ~270 surnames (Finland, where registers often write the surname first), forebears.io, worldwide, rounded, 2026-10-04; shipped under the graf class (decisions/salutation-titles)" } + [[word]] text = "nuorempi" generation = { issue = 661 } diff --git a/nameparser/vocab/fr.toml b/nameparser/vocab/fr.toml index 9a1a5a9e..c3f3bcba 100644 --- a/nameparser/vocab/fr.toml +++ b/nameparser/vocab/fr.toml @@ -24,6 +24,75 @@ salutation = { gender = "m" } text = "cheikh" style = { addresses = "given", gender = "m", same_as = "sheikh", expands = "the French transliteration, 'Cheikh Anta Diop'" } +[[word]] +text = "me" +academic = { expands = "Maître, the address of a lawyer or notary" } + +[[word]] +text = "mgr" +religious = { expands = "Monsignor, Monseigneur" } + +[[word]] +text = "monseigneur" +religious = {} + +[[word]] +text = "saint" +religious = {} + +[[word]] +text = "sainte" +religious = { gender = "f" } + +[[word]] +text = "st" +religious = { expands = "Saint, abbreviated" } +saint = { may_be_given = true, expands = "Saint, abbreviated" } + +[[word]] +text = "baron" +nobility = { gender = "m" } + +[[word]] +text = "comtesse" +nobility = { gender = "f" } + +[[word]] +text = "duchesse" +nobility = { gender = "f" } + +[[word]] +text = "marquis" +nobility = { gender = "m" } + +[[word]] +text = "marquise" +nobility = { gender = "f" } + +[[word]] +text = "seigneur" +nobility = {} + +[[word]] +text = "attaché" +office = {} + +[[word]] +text = "chargé" +office = { expands = "chargé d'affaires, the head of a mission below an ambassador" } + +[[word]] +text = "compositeur" +occupation = {} + +[[word]] +text = "historien" +occupation = {} + +[[word]] +text = "d'affaires" +modifier = { expands = "the second word of chargé d'affaires" } + [[word]] text = "fils" family = { us_census_2010 = 767, wikidata = 5, as_of = 2026-10-16 } @@ -89,10 +158,6 @@ may_be_given = true expands = "the, masc. sg." note = "Lê is among the most common Vietnamese surnames and leads under a family-first reading" -[[word]] -text = "st" -saint = { may_be_given = true, expands = "Saint, abbreviated" } - [[word]] text = "ste" [word.saint] diff --git a/nameparser/vocab/he.toml b/nameparser/vocab/he.toml index e1bb37fe..b3e424ef 100644 --- a/nameparser/vocab/he.toml +++ b/nameparser/vocab/he.toml @@ -16,6 +16,42 @@ salutation = { gender = "f", issue = 269, expands = "Mrs., Ms., the full form" } text = "מר" salutation = { gender = "m", issue = 269, expands = "Mr." } +[[word]] +text = "ד\"ר" +academic = { issue = 269, expands = "doctor, ASCII quote", note = "the quote sits mid-word, with no whitespace before it and a letter after it, so it fails both extract_delimited's open and close boundary tests (_open_ok/_close_ok, probed 2026-07-17) and stays literal text; the gershayim spelling is no delimiter at all" } + +[[word]] +text = "ד״ר" +academic = { issue = 269, same_as = "ד\"ר", expands = "doctor, U+05F4 gershayim" } + +[[word]] +text = "עו\"ד" +academic = { issue = 269, expands = "advocate, ASCII quote" } + +[[word]] +text = "עו״ד" +academic = { issue = 269, same_as = "עו\"ד", expands = "advocate, U+05F4 gershayim" } + +[[word]] +text = "פרופסור" +academic = { issue = 269, expands = "professor, full form" } + +[[word]] +text = "פרופ'" +academic = { issue = 269, same_as = "פרופסור", expands = "professor abbreviation, ASCII apostrophe" } + +[[word]] +text = "פרופ׳" +academic = { issue = 269, same_as = "פרופסור", expands = "professor abbreviation, U+05F3 geresh" } + +[[word]] +text = "rabbi" +religious = { note = "addresses by the TITLE, not the given name ('Rabbi Cohen'), and the tradition keeps surnames, so it stays out of GIVEN_NAME_TITLES (#346)" } + +[[word]] +text = "הרב" +religious = { issue = 269, expands = "the rabbi", note = "the article form; bare רב is deferred under the collision rule, being also the ordinary word 'many'" } + [[word]] text = "ג'וניור" generation = { issue = 679, note = "ASCII apostrophe" } diff --git a/nameparser/vocab/hi.toml b/nameparser/vocab/hi.toml index 4c0b0fcf..98d71ca9 100644 --- a/nameparser/vocab/hi.toml +++ b/nameparser/vocab/hi.toml @@ -48,14 +48,54 @@ salutation = { gender = "f", issue = 344, expands = "Sushri, Ms." } text = "ठाकुर" excluded = { style = { reason = "Tagore, the surname, as with the Bengali ঠাকুর", issue = 344, decided = 2026-09-06 } } +[[word]] +text = "पंडित" +style = { issue = 344, expands = "Pandit" } + +[[word]] +text = "पं" +style = { issue = 344, same_as = "पंडित", expands = "Pandit, abbreviated" } + +[[word]] +text = "महात्मा" +style = { issue = 344, expands = "Mahatma", note = "civil, not renunciate: it addresses by surname ('महात्मा गांधी'), so TITLES only" } + [[word]] text = "शेख" excluded = { style = { reason = "a clan name and a family name; the Latin sheikh cluster ships for the Arabic addressing form, while the Indic spellings name the family", issue = 344, decided = 2026-09-06 } } +[[word]] +text = "सरदार" +style = { issue = 344, expands = "Sardar" } + [[word]] text = "pandit" excluded = { academic = { reason = "a common surname (Vijaya Lakshmi Pandit); the native पंडित ships", issue = 344, decided = 2026-09-06 } } +[[word]] +text = "डा" +academic = { issue = 344, expands = "Dr., the डा. abbreviation (Nepali and older Hindi)" } + +[[word]] +text = "डॉ" +academic = { issue = 269, expands = "Dr., abbreviated", note = "डॉ. matches through the edge-period normalization, as Latin Dr. does; no Latin twins, for the reason the sri/shri exclusions in hi.toml give" } + +[[word]] +text = "डॉक्टर" +academic = { issue = 344, expands = "doctor, full form" } + +[[word]] +text = "प्राध्यापक" +academic = { issue = 344, expands = "professor, the Sanskritic form" } + +[[word]] +text = "प्रो" +academic = { issue = 344, expands = "Prof., abbreviated" } + +[[word]] +text = "प्रोफेसर" +academic = { issue = 344, expands = "professor, full form" } + [[word]] text = "baba" religious = { addresses = "given", issue = 346, note = "#346's renunciate class (baba, guru, lama, swami): it addresses by the GIVEN name, and the tradition renounces the surname, which is what makes the empty family right for 'Swami Vivekananda' (rules/H Background)" } @@ -84,6 +124,10 @@ religious = { addresses = "given", issue = 344, expands = "Guru" } text = "बाबा" religious = { addresses = "given", issue = 344, expands = "Baba" } +[[word]] +text = "मौलाना" +religious = { issue = 344, expands = "Maulana" } + [[word]] text = "संत" religious = { addresses = "given", issue = 344, expands = "Sant", note = "no Latin twin: Latin sant is a Punjabi given name (its exclusion in this file)" } @@ -92,6 +136,18 @@ religious = { addresses = "given", issue = 344, expands = "Sant", note = "no Lat text = "स्वामी" religious = { addresses = "given", issue = 344, expands = "Swami" } +[[word]] +text = "maharajah" +nobility = { gender = "m" } + +[[word]] +text = "maharani" +nobility = { gender = "f" } + +[[word]] +text = "महाराजा" +nobility = { issue = 344, gender = "m", expands = "Maharaja", note = "LEADING; the trailing महाराज is a suffix word" } + [[word]] text = "राजा" excluded = { nobility = { reason = "Raja is a common given name", issue = 344, decided = 2026-09-06 } } @@ -100,6 +156,14 @@ excluded = { nobility = { reason = "Raja is a common given name", issue = 344, d text = "रानी" excluded = { nobility = { reason = "Rani is a common given name", issue = 344, decided = 2026-09-06 } } +[[word]] +text = "subedar" +military = {} + +[[word]] +text = "न्यायमूर्ति" +office = { issue = 344, expands = "Justice" } + [[word]] text = "जुनियर" generation = { issue = 661, note = "junior, one of its two u spellings" } diff --git a/nameparser/vocab/hy.toml b/nameparser/vocab/hy.toml index 831fdb35..8482a384 100644 --- a/nameparser/vocab/hy.toml +++ b/nameparser/vocab/hy.toml @@ -8,6 +8,10 @@ excluded = { salutation = { reason = "Armenian Mr. in Latin script: unverified, text = "tikin" excluded = { salutation = { reason = "Armenian Mrs. in Latin script: unverified, so not shipped", issue = 606, decided = 2026-10-04 } } +[[word]] +text = "vardapet" +religious = { expands = "an Armenian celibate priest and doctor of the church" } + [[word]] text = "ավագ" [word.excluded.generation] diff --git a/nameparser/vocab/is.toml b/nameparser/vocab/is.toml index 56082488..4cb45798 100644 --- a/nameparser/vocab/is.toml +++ b/nameparser/vocab/is.toml @@ -12,6 +12,10 @@ salutation = { issue = 606, gender = "m" } text = "ungfrú" salutation = { issue = 606, gender = "f" } +[[word]] +text = "greifi" +nobility = { gender = "m", expands = "count", issue = 606 } + [[word]] text = "eldri" generation = { issue = 679 } diff --git a/nameparser/vocab/it.toml b/nameparser/vocab/it.toml index 27e7b3b7..c776831a 100644 --- a/nameparser/vocab/it.toml +++ b/nameparser/vocab/it.toml @@ -16,6 +16,10 @@ salutation = { gender = "m", same_as = "signore" } text = "signorina" salutation = { gender = "f" } +[[word]] +text = "gentiluomo" +nobility = { gender = "m", expands = "gentleman" } + [[word]] text = "d'" preposition = { may_be_given = false, issue = 700, expands = "of, elided di" } diff --git a/nameparser/vocab/ka.toml b/nameparser/vocab/ka.toml index a95bc5b4..9faf5bb2 100644 --- a/nameparser/vocab/ka.toml +++ b/nameparser/vocab/ka.toml @@ -8,6 +8,10 @@ salutation = { issue = 606, gender = "m", note = "borne: ~1,100 surnames (the pa text = "kalbatoni" salutation = { issue = 606, gender = "f" } +[[word]] +text = "grafi" +nobility = { gender = "m", expands = "count, in Latin script", issue = 606 } + [[word]] text = "უმცროსი" generation = { issue = 679 } diff --git a/nameparser/vocab/lt.toml b/nameparser/vocab/lt.toml index 1beefe3a..07009fa5 100644 --- a/nameparser/vocab/lt.toml +++ b/nameparser/vocab/lt.toml @@ -8,6 +8,10 @@ salutation = { issue = 606, gender = "m", note = "borne: ~4,000 surnames (Iran), text = "ponia" salutation = { issue = 606, gender = "f", note = "borne: ~560 surnames, forebears.io, worldwide, rounded, 2026-10-04; shipped under the graf class (decisions/salutation-titles)" } +[[word]] +text = "grafas" +nobility = { gender = "m", expands = "count", issue = 606 } + [[word]] text = "jaun" [word.excluded.generation] diff --git a/nameparser/vocab/mi.toml b/nameparser/vocab/mi.toml new file mode 100644 index 00000000..c748bdaa --- /dev/null +++ b/nameparser/vocab/mi.toml @@ -0,0 +1,5 @@ +schema = 1 + +[[word]] +text = "rangatira" +nobility = { expands = "a Māori chief" } diff --git a/nameparser/vocab/mr.toml b/nameparser/vocab/mr.toml index 3e1bd8e1..0377b75f 100644 --- a/nameparser/vocab/mr.toml +++ b/nameparser/vocab/mr.toml @@ -12,6 +12,54 @@ salutation = { gender = "f", issue = 269, expands = "Shrimati, Mrs." } text = "सौ" salutation = { gender = "f", issue = 344, expands = "Sau., Mrs." } +[[word]] +text = "पंडित" +style = { issue = 344, expands = "Pandit" } + +[[word]] +text = "पं" +style = { issue = 344, same_as = "पंडित", expands = "Pandit, abbreviated" } + +[[word]] +text = "महात्मा" +style = { issue = 344, expands = "Mahatma" } + +[[word]] +text = "सरदार" +style = { issue = 344, expands = "Sardar" } + +[[word]] +text = "डॉ" +academic = { issue = 269, expands = "Dr., abbreviated" } + +[[word]] +text = "डॉक्टर" +academic = { issue = 344, expands = "doctor, full form" } + +[[word]] +text = "प्रा" +academic = { issue = 344, expands = "Prof., the Marathi abbreviation" } + +[[word]] +text = "प्राध्यापक" +academic = { issue = 344, expands = "professor, the Sanskritic form" } + +[[word]] +text = "प्रो" +academic = { issue = 344, expands = "Prof., abbreviated" } + +[[word]] +text = "प्रोफेसर" +academic = { issue = 344, expands = "professor, full form" } + +[[word]] +text = "महाराजा" +nobility = { issue = 344, gender = "m", expands = "Maharaja" } + +[[word]] +text = "न्यायमूर्ति" +office = { issue = 344, expands = "Justice" } + [[word]] text = "क" [word.excluded.generation] diff --git a/nameparser/vocab/ms.toml b/nameparser/vocab/ms.toml index 2daee5ef..80706209 100644 --- a/nameparser/vocab/ms.toml +++ b/nameparser/vocab/ms.toml @@ -12,6 +12,10 @@ salutation = { issue = 606, gender = "m" } text = "puan" excluded = { salutation = { reason = "Malay Mrs., and an Indonesian given name (Puan Maharani)", issue = 606, decided = 2026-10-04 } } +[[word]] +text = "sultan" +nobility = {} + [[word]] text = "bin" patronymic = { may_be_given = true, expands = "son of: \"Ahmad bin Ismail\"", gender = "m" } diff --git a/nameparser/vocab/mul.toml b/nameparser/vocab/mul.toml index 267729be..8b08c209 100644 --- a/nameparser/vocab/mul.toml +++ b/nameparser/vocab/mul.toml @@ -2,6 +2,22 @@ schema = 1 +[[word]] +text = "docent" +academic = { expands = "the academic rank, spelled alike in Dutch, Swedish, Danish, Norwegian, Polish and Czech" } + +[[word]] +text = "dr" +academic = { expands = "Doctor, abbreviated alike across the European languages" } + +[[word]] +text = "prof" +academic = { expands = "Professor, abbreviated alike across the European languages" } + +[[word]] +text = "professor" +academic = { expands = "spelled alike in English, German, Dutch, the Scandinavian languages and Portuguese" } + [[word]] text = "2" generation = {} diff --git a/nameparser/vocab/nb.toml b/nameparser/vocab/nb.toml index 328218e6..2053a442 100644 --- a/nameparser/vocab/nb.toml +++ b/nameparser/vocab/nb.toml @@ -24,6 +24,14 @@ salutation = { gender = "m" } text = "hr" salutation = { gender = "m", same_as = "herr" } +[[word]] +text = "greve" +nobility = { gender = "m", expands = "count", issue = 606 } + +[[word]] +text = "sysselmann" +office = { expands = "the governor of Svalbard" } + [[word]] text = "af" preposition = { may_be_given = false, expands = "of, nobiliary" } diff --git a/nameparser/vocab/ne.toml b/nameparser/vocab/ne.toml index 2d64d8a9..b19ca7fc 100644 --- a/nameparser/vocab/ne.toml +++ b/nameparser/vocab/ne.toml @@ -1,5 +1,9 @@ schema = 1 +[[word]] +text = "डा" +academic = { issue = 344, expands = "Dr., the डा. abbreviation (Nepali and older Hindi)" } + [[word]] text = "जेआर" [word.excluded.generation] diff --git a/nameparser/vocab/nl.toml b/nameparser/vocab/nl.toml index 621b1568..66cbbba4 100644 --- a/nameparser/vocab/nl.toml +++ b/nameparser/vocab/nl.toml @@ -28,6 +28,22 @@ salutation = { gender = "f", same_as = "mevrouw" } text = "mevrouwe" salutation = { gender = "f", same_as = "mevrouw", expands = "the archaic spelling of mevrouw" } +[[word]] +text = "baron" +nobility = { gender = "m" } + +[[word]] +text = "graaf" +nobility = { gender = "m", expands = "count", issue = 606, note = "borne; one of the three words #606 proposed the graf class for" } + +[[word]] +text = "vrouwe" +nobility = { gender = "f", expands = "lady, the style of a noblewoman" } + +[[word]] +text = "historicus" +occupation = {} + [[word]] text = "aan" preposition = { may_be_given = true, issue = 18, expands = "on, at: \"aan den Toorn\"" } diff --git a/nameparser/vocab/pa.toml b/nameparser/vocab/pa.toml index 17bf703f..1943db8f 100644 --- a/nameparser/vocab/pa.toml +++ b/nameparser/vocab/pa.toml @@ -1,5 +1,13 @@ schema = 1 +[[word]] +text = "giani" +religious = { expands = "a learned Sikh, ਗਿਆਨੀ" } + +[[word]] +text = "gyani" +religious = { same_as = "giani" } + [[word]] text = "guru" religious = { addresses = "given", issue = 346 } diff --git a/nameparser/vocab/pl.toml b/nameparser/vocab/pl.toml index 983cca79..cf7955fd 100644 --- a/nameparser/vocab/pl.toml +++ b/nameparser/vocab/pl.toml @@ -4,6 +4,10 @@ schema = 1 text = "pan" excluded = { salutation = { reason = "Polish and Czech Mr., and the Chinese surname Pan, which leads", issue = 606, decided = 2026-10-04 } } +[[word]] +text = "hrabia" +nobility = { gender = "m", expands = "count", issue = 606, note = "borne: ~750 surnames (Poland, where registers often write the surname first), forebears.io, worldwide, rounded, 2026-10-04; shipped under the graf class (decisions/salutation-titles)" } + [[word]] text = "vel" alias = { may_be_given = true, expands = "or, between two surnames: \"Kowalski vel Nowak\"" } diff --git a/nameparser/vocab/pt.toml b/nameparser/vocab/pt.toml index cb5a77b7..8924f725 100644 --- a/nameparser/vocab/pt.toml +++ b/nameparser/vocab/pt.toml @@ -20,6 +20,10 @@ salutation = { gender = "f", same_as = "senhora" } text = "senhorita" salutation = { gender = "f" } +[[word]] +text = "dra" +academic = { gender = "f", expands = "Doctora, Doutora" } + [[word]] text = "da" preposition = { may_be_given = true, expands = "of the, fem. sg." } diff --git a/nameparser/vocab/ru.toml b/nameparser/vocab/ru.toml index 74c4b9aa..547308f6 100644 --- a/nameparser/vocab/ru.toml +++ b/nameparser/vocab/ru.toml @@ -8,6 +8,26 @@ salutation = { gender = "f", issue = 269, expands = "госпожа, Mrs." } text = "г-н" salutation = { gender = "m", issue = 269, expands = "господин, Mr." } +[[word]] +text = "акад" +academic = { issue = 269, expands = "academician" } + +[[word]] +text = "д-р" +academic = { issue = 269, expands = "doctor", note = "a plain title, family-first like 'dr' (not GIVEN_NAME_TITLES: 'д-р Петров' families the surname just as 'Dr. Smith' does)" } + +[[word]] +text = "проф" +academic = { issue = 269, expands = "professor" } + +[[word]] +text = "tsar" +nobility = { gender = "m", expands = "царь" } + +[[word]] +text = "tsarina" +nobility = { gender = "f" } + [[word]] text = "мл" [word.generation] diff --git a/nameparser/vocab/sv.toml b/nameparser/vocab/sv.toml index 18ee7547..e7641a56 100644 --- a/nameparser/vocab/sv.toml +++ b/nameparser/vocab/sv.toml @@ -20,6 +20,10 @@ salutation = { gender = "m" } text = "hr" salutation = { gender = "m", same_as = "herr" } +[[word]] +text = "greve" +nobility = { gender = "m", expands = "count", issue = 606, note = "borne, so 'Greve Anna' reads title Greve; one of the three words #606 proposed the graf class for" } + [[word]] text = "af" preposition = { may_be_given = false, expands = "of, nobiliary" } diff --git a/nameparser/vocab/tr.toml b/nameparser/vocab/tr.toml index 5c40bd43..c41cb853 100644 --- a/nameparser/vocab/tr.toml +++ b/nameparser/vocab/tr.toml @@ -5,6 +5,14 @@ text = "bay" family = { us_census_2010 = 6350, wikidata = 120, as_of = 2026-10-17, note = "11 of the Wikidata bearers Hungarian" } excluded = { salutation = { reason = "Turkish Mr., and a surname borne in Hungary, which writes the surname first, where the title claim acts, so it fails C-i", issue = 662, decided = 2026-10-17 } } +[[word]] +text = "effendi" +style = { expands = "the Ottoman efendi, in its conventional Latin spelling" } + +[[word]] +text = "sultan" +nobility = { note = "no gender: Ottoman usage gave it to imperial women too, written after the name (Hürrem Sultan)" } + [[word]] text = "baba" [word.excluded.generation] diff --git a/nameparser/vocab/uk.toml b/nameparser/vocab/uk.toml index b79d2bb2..78ded9df 100644 --- a/nameparser/vocab/uk.toml +++ b/nameparser/vocab/uk.toml @@ -8,6 +8,18 @@ salutation = { gender = "m", issue = 269, expands = "Mr." } text = "пані" salutation = { gender = "f", issue = 269, expands = "Mrs." } +[[word]] +text = "акад" +academic = { issue = 269, expands = "academician" } + +[[word]] +text = "д-р" +academic = { issue = 269, expands = "doctor" } + +[[word]] +text = "проф" +academic = { issue = 269, expands = "professor" } + [[word]] text = "молодша" generation = { issue = 661 } diff --git a/nameparser/vocab/und.toml b/nameparser/vocab/und.toml index 28ee3e34..2c140e9f 100644 --- a/nameparser/vocab/und.toml +++ b/nameparser/vocab/und.toml @@ -10,2664 +10,55 @@ schema = 1 -# ---- titles ---- - -[[word]] -text = "attaché" -title = {} - -[[word]] -text = "chargé" -title = {} - -[[word]] -text = "d'affaires" -title = {} - -[[word]] -text = "king's" -title = {} - -[[word]] -text = "marchioness" -title = {} - -[[word]] -text = "marquess" -title = {} - -[[word]] -text = "marquis" -title = {} - -[[word]] -text = "marquise" -title = {} - -[[word]] -text = "queen's" -title = {} - -[[word]] -text = "10th" -title = {} - -[[word]] -text = "1lt" -title = {} - -[[word]] -text = "1sgt" -title = {} - -[[word]] -text = "1st" -title = {} - -[[word]] -text = "1stlt" -title = {} - -[[word]] -text = "1stsgt" -title = {} - -[[word]] -text = "2lt" -title = {} - -[[word]] -text = "2nd" -title = {} - -[[word]] -text = "2ndlt" -title = {} - -[[word]] -text = "3rd" -title = {} - -[[word]] -text = "4th" -title = {} - -[[word]] -text = "5th" -title = {} - -[[word]] -text = "6th" -title = {} - -[[word]] -text = "7th" -title = {} - -[[word]] -text = "8th" -title = {} - -[[word]] -text = "9th" -title = {} - -[[word]] -text = "a1c" -title = {} - -[[word]] -text = "ab" -title = {} - -[[word]] -text = "abbess" -title = {} - -[[word]] -text = "abbot" -title = {} - -[[word]] -text = "abolitionist" -title = {} - -[[word]] -text = "academic" -title = {} - -[[word]] -text = "acolyte" -title = {} - -[[word]] -text = "activist" -title = {} - -[[word]] -text = "actor" -title = {} - -[[word]] -text = "actress" -title = {} - -[[word]] -text = "adept" -title = {} - -[[word]] -text = "adjutant" -title = {} - -[[word]] -text = "adm" -title = {} - -[[word]] -text = "admiral" -title = {} - -[[word]] -text = "advertising" -title = {} - -[[word]] -text = "adviser" -title = {} - -[[word]] -text = "advocate" -title = {} - -[[word]] -text = "air" -title = {} - -[[word]] -text = "akhoond" -title = {} - -[[word]] -text = "alderman" -title = {} - -[[word]] -text = "almoner" -title = {} - -[[word]] -text = "ambassador" -title = {} - -[[word]] -text = "amn" -title = {} - -[[word]] -text = "analytics" -title = {} - -[[word]] -text = "anarchist" -title = {} - -[[word]] -text = "animator" -title = {} - -[[word]] -text = "anthropologist" -title = {} - -[[word]] -text = "appellate" -title = {} - -[[word]] -text = "apprentice" -title = {} - -[[word]] -text = "arbitrator" -title = {} - -[[word]] -text = "archbishop" -title = {} - -[[word]] -text = "archdeacon" -title = {} - -[[word]] -text = "archdruid" -title = {} - -[[word]] -text = "archduchess" -title = {} - -[[word]] -text = "archduke" -title = {} - -[[word]] -text = "archeologist" -title = {} - -[[word]] -text = "architect" -title = {} - -[[word]] -text = "arhat" -title = {} - -[[word]] -text = "army" -title = {} - -[[word]] -text = "arranger" -title = {} - -[[word]] -text = "assistant" -title = {} - -[[word]] -text = "assoc" -title = {} - -[[word]] -text = "associate" -title = {} - -[[word]] -text = "asst" -title = {} - -[[word]] -text = "astronomer" -title = {} - -[[word]] -text = "attache" -title = {} - -[[word]] -text = "attorney" -title = {} - -[[word]] -text = "author" -title = {} - -[[word]] -text = "award-winning" -title = {} - -[[word]] -text = "ayatollah" -title = {} - -[[word]] -text = "bailiff" -title = {} - -[[word]] -text = "ballet" -title = {} - -[[word]] -text = "bandleader" -title = {} - -[[word]] -text = "banker" -title = {} - -[[word]] -text = "banner" -title = {} - -[[word]] -text = "bard" -title = {} - -[[word]] -text = "baron" -title = {} - -[[word]] -text = "baroness" -title = {} - -[[word]] -text = "barrister" -title = {} - -[[word]] -text = "baseball" -title = {} - -[[word]] -text = "bearer" -title = {} - -[[word]] -text = "behavioral" -title = {} - -[[word]] -text = "bench" -title = {} - -[[word]] -text = "bg" -title = {} - -[[word]] -text = "bgen" -title = {} - -[[word]] -text = "biblical" -title = {} - -[[word]] -text = "bibliographer" -title = {} - -[[word]] -text = "biochemist" -title = {} - -[[word]] -text = "biographer" -title = {} - -[[word]] -text = "biologist" -title = {} - -[[word]] -text = "bishop" -title = {} - -[[word]] -text = "blessed" -title = {} - -[[word]] -text = "blogger" -title = {} - -[[word]] -text = "blues" -title = {} - -[[word]] -text = "bodhisattva" -title = {} - -[[word]] -text = "bookseller" -title = {} - -[[word]] -text = "botanist" -title = {} - -[[word]] -text = "bp" -title = {} - -[[word]] -text = "brigadier" -title = {} - -[[word]] -text = "briggen" -title = {} - -[[word]] -text = "british" -title = {} - -[[word]] -text = "broadcaster" -title = {} - -[[word]] -text = "buddha" -title = {} - -[[word]] -text = "burgess" -title = {} - -[[word]] -text = "burlesque" -title = {} - -[[word]] -text = "business" -title = {} - -[[word]] -text = "businessman" -title = {} - -[[word]] -text = "businesswoman" -title = {} - -[[word]] -text = "canon" -title = {} - -[[word]] -text = "capt" -title = {} - -[[word]] -text = "captain" -title = {} - -[[word]] -text = "cardinal" -title = {} - -[[word]] -text = "cartographer" -title = {} - -[[word]] -text = "cartoonist" -title = {} - -[[word]] -text = "catholicos" -title = {} - -[[word]] -text = "ccmsgt" -title = {} - -[[word]] -text = "cdr" -title = {} - -[[word]] -text = "celebrity" -title = {} - -[[word]] -text = "ceo" -title = {} - -[[word]] -text = "cfo" -title = {} - -[[word]] -text = "chair" -title = {} - -[[word]] -text = "chairs" -title = {} - -[[word]] -text = "chancellor" -title = {} - -[[word]] -text = "chaplain" -title = {} - -[[word]] -text = "charge" -title = { note = "unaccented 'chargé', like attaché/'attache'" } - -[[word]] -text = "chef" -title = {} - -[[word]] -text = "chemist" -title = {} - -[[word]] -text = "chief" -title = {} - -[[word]] -text = "chieftain" -title = {} - -[[word]] -text = "choreographer" -title = {} - -[[word]] -text = "civil" -title = {} - -[[word]] -text = "classical" -title = {} - -[[word]] -text = "clergyman" -title = {} - -[[word]] -text = "clerk" -title = {} - -[[word]] -text = "cmsaf" -title = {} - -[[word]] -text = "cmsgt" -title = {} - -[[word]] -text = "co-chair" -title = {} - -[[word]] -text = "co-chairs" -title = {} - -[[word]] -text = "co-founder" -title = {} - -[[word]] -text = "coach" -title = {} - -[[word]] -text = "col" -title = {} - -[[word]] -text = "collector" -title = {} - -[[word]] -text = "colonel" -title = {} - -[[word]] -text = "comedian" -title = {} - -[[word]] -text = "comedienne" -title = {} - -[[word]] -text = "comic" -title = {} - -[[word]] -text = "commander" -title = {} - -[[word]] -text = "commander-in-chief" -title = {} - -[[word]] -text = "commodore" -title = {} - -[[word]] -text = "composer" -title = {} - -[[word]] -text = "compositeur" -title = {} - -[[word]] -text = "comptroller" -title = {} - -[[word]] -text = "computer" -title = {} - -[[word]] -text = "comtesse" -title = {} - -[[word]] -text = "conductor" -title = {} - -[[word]] -text = "consultant" -title = {} - -[[word]] -text = "controller" -title = {} - -[[word]] -text = "corporal" -title = {} - -[[word]] -text = "corporate" -title = {} - -[[word]] -text = "correspondent" -title = {} - -[[word]] -text = "councillor" -title = {} - -[[word]] -text = "counselor" -title = {} - -[[word]] -text = "count" -title = {} - -[[word]] -text = "countess" -title = {} - -[[word]] -text = "courtier" -title = {} - -[[word]] -text = "cpl" -title = {} -credential = {} - -[[word]] -text = "cpo" -title = {} -credential = {} - -[[word]] -text = "cpt" -title = {} -credential = {} - -[[word]] -text = "credit" -title = {} - -[[word]] -text = "criminal" -title = {} - -[[word]] -text = "criminologist" -title = {} - -[[word]] -text = "critic" -title = {} - -[[word]] -text = "csm" -title = {} -credential = {} - -[[word]] -text = "curator" -title = {} - -[[word]] -text = "customs" -title = {} - -[[word]] -text = "cwo-2" -title = {} - -[[word]] -text = "cwo-3" -title = {} - -[[word]] -text = "cwo-4" -title = {} - -[[word]] -text = "cwo-5" -title = {} - -[[word]] -text = "cwo2" -title = {} - -[[word]] -text = "cwo3" -title = {} - -[[word]] -text = "cwo4" -title = {} - -[[word]] -text = "cwo5" -title = {} - -[[word]] -text = "cyclist" -title = {} - -[[word]] -text = "dancer" -title = {} - -[[word]] -text = "dcn" -title = {} - -[[word]] -text = "deacon" -title = {} - -[[word]] -text = "delegate" -title = {} - -[[word]] -text = "deputy" -title = {} - -[[word]] -text = "designated" -title = {} - -[[word]] -text = "designer" -title = {} - -[[word]] -text = "detective" -title = {} - -[[word]] -text = "developer" -title = {} - -[[word]] -text = "dipl.-ing" -title = {} - -[[word]] -text = "diplomat" -title = {} - -[[word]] -text = "dir" -title = {} - -[[word]] -text = "director" -title = {} - -[[word]] -text = "discovery" -title = {} - -[[word]] -text = "dissident" -title = {} - -[[word]] -text = "district" -title = {} - -[[word]] -text = "division" -title = {} - -[[word]] -text = "docent" -title = {} - -[[word]] -text = "docket" -title = {} - -[[word]] -text = "doctor" -title = {} - -[[word]] -text = "doyen" -title = {} - -[[word]] -text = "dpty" -title = {} - -[[word]] -text = "dr" -title = {} - -[[word]] -text = "dra" -title = {} - -[[word]] -text = "dramatist" -title = {} - -[[word]] -text = "druid" -title = {} - -[[word]] -text = "drummer" -title = {} - -[[word]] -text = "duchesse" -title = {} - -# 'duke', # a common first name -[[word]] -text = "dutchess" -title = {} - -[[word]] -text = "ecologist" -title = {} - -[[word]] -text = "economist" -title = {} - -[[word]] -text = "editor" -title = {} - -[[word]] -text = "edler" -title = {} - -[[word]] -text = "edmi" -title = {} - -[[word]] -text = "edohen" -title = {} - -[[word]] -text = "educator" -title = {} - -[[word]] -text = "effendi" -title = {} - -[[word]] -text = "ekegbian" -title = {} - -[[word]] -text = "elerunwon" -title = {} - -[[word]] -text = "eminence" -title = {} - -[[word]] -text = "emperor" -title = {} - -[[word]] -text = "empress" -title = {} - -[[word]] -text = "engineer" -title = {} - -[[word]] -text = "english" -title = {} - -[[word]] -text = "ens" -title = {} - -[[word]] -text = "entertainer" -title = {} - -[[word]] -text = "entrepreneur" -title = {} - -[[word]] -text = "envoy" -title = {} - -[[word]] -text = "erzbischof" -title = {} - -[[word]] -text = "essayist" -title = {} - -[[word]] -text = "evangelist" -title = {} - -[[word]] -text = "excellency" -title = {} - -[[word]] -text = "excellent" -title = {} - -[[word]] -text = "exec" -title = {} - -[[word]] -text = "executive" -title = {} - -[[word]] -text = "expert" -title = {} - -[[word]] -text = "fadm" -title = {} - -[[word]] -text = "family" -title = {} - -[[word]] -text = "federal" -title = {} - -[[word]] -text = "fh-prof" -title = {} - -[[word]] -text = "field" -title = {} - -[[word]] -text = "film" -title = {} - -[[word]] -text = "financial" -title = {} - -[[word]] -text = "first" -title = {} - -[[word]] -text = "flag" -title = {} - -[[word]] -text = "flying" -title = {} - -[[word]] -text = "foreign" -title = {} - -[[word]] -text = "forester" -title = {} - -[[word]] -text = "founder" -title = {} - -[[word]] -text = "fr" -title = {} - -[[word]] -text = "freifrau" -title = {} - -[[word]] -text = "freiherr" -title = {} - -[[word]] -text = "friar" -title = {} - -[[word]] -text = "fürst" -title = {} - -[[word]] -text = "fürsterzbischof" -title = {} - -[[word]] -text = "gaf" -title = {} - -[[word]] -text = "gen" -title = {} - -[[word]] -text = "general" -title = {} - -[[word]] -text = "generalissimo" -title = {} - -[[word]] -text = "gentiluomo" -title = {} - -[[word]] -text = "giani" -title = {} - -[[word]] -text = "gov" -title = {} - -[[word]] -text = "governor" -title = {} - -[[word]] -text = "graf" -title = {} - -[[word]] -text = "gräfin" -title = {} - -[[word]] -text = "grand" -title = {} - -[[word]] -text = "großfürst" -title = {} - -[[word]] -text = "group" -title = {} - -[[word]] -text = "guitarist" -title = {} - -[[word]] -text = "gyani" -title = {} - -[[word]] -text = "gysgt" -title = {} - -[[word]] -text = "hajji" -title = {} - -[[word]] -text = "headman" -title = {} - -[[word]] -text = "heir" -title = {} - -[[word]] -text = "heiress" -title = {} - -[[word]] -text = "her" -title = {} - -[[word]] -text = "hereditary" -title = {} - -[[word]] -text = "herzog" -title = {} - -[[word]] -text = "high" -title = {} - -[[word]] -text = "highness" -title = {} - -[[word]] -text = "his" -title = {} - -[[word]] -text = "historian" -title = {} - -[[word]] -text = "historicus" -title = {} - -[[word]] -text = "historien" -title = {} - -[[word]] -text = "holiness" -title = {} - -[[word]] -text = "hon" -title = { note = "sorry Hon Solo, but judges seem more common." } - -[[word]] -text = "honorable" -title = {} - -[[word]] -text = "honourable" -title = {} - -[[word]] -text = "host" -title = {} - -[[word]] -text = "illustrator" -title = {} - -[[word]] -text = "imam" -title = { note = "addresses by the TITLE, not the given name, and the tradition keeps surnames, so it stays out of GIVEN_NAME_TITLES (#346)" } - -[[word]] -text = "industrialist" -title = {} - -[[word]] -text = "information" -title = {} - -[[word]] -text = "instructor" -title = {} - -[[word]] -text = "intelligence" -title = {} - -[[word]] -text = "intendant" -title = {} - -[[word]] -text = "inventor" -title = {} - -[[word]] -text = "investigator" -title = {} - -[[word]] -text = "investor" -title = {} - -[[word]] -text = "journalist" -title = {} - -[[word]] -text = "journeyman" -title = {} - -[[word]] -text = "judge" -title = {} - -[[word]] -text = "judicial" -title = {} - -[[word]] -text = "jurist" -title = {} - -[[word]] -text = "keyboardist" -title = {} - -[[word]] -text = "kingdom" -title = {} - -[[word]] -text = "knowledge" -title = {} - -[[word]] -text = "lady" -title = { note = "stays out of GIVEN_NAME_TITLES, decided: the given-name form ('Lady Diana') is a courtesy style for the daughters of the senior ranks alone, while every wife takes the title or surname ('Lady Thatcher'), and the text does not carry the rank (#519)" } - -[[word]] -text = "lamido" -title = {} - -[[word]] -text = "law" -title = {} - -[[word]] -text = "lawyer" -title = {} - -[[word]] -text = "lcdr" -title = {} - -[[word]] -text = "lcpl" -title = {} - -[[word]] -text = "leader" -title = {} - -[[word]] -text = "lecturer" -title = {} - -[[word]] -text = "legal" -title = {} - -[[word]] -text = "librarian" -title = {} - -[[word]] -text = "lieutenant" -title = {} - -[[word]] -text = "linguist" -title = {} - -[[word]] -text = "literary" -title = {} - -[[word]] -text = "lord" -title = { note = "stays out of GIVEN_NAME_TITLES, decided: the given-name form ('Lord Peter') is a courtesy style for the children of the senior ranks alone, while every peer takes the title or surname ('Lord Byron'), and the text does not carry the rank (#519)" } - -[[word]] -text = "lt" -title = {} -credential = {} - -[[word]] -text = "ltc" -title = {} - -[[word]] -text = "ltcol" -title = {} - -[[word]] -text = "ltg" -title = {} - -[[word]] -text = "ltgen" -title = {} - -[[word]] -text = "ltjg" -title = {} - -[[word]] -text = "lyricist" -title = {} - -[[word]] -text = "mag" -title = {} - -[[word]] -text = "mag-judge" -title = {} - -[[word]] -text = "mag/judge" -title = {} - -[[word]] -text = "magistrate" -title = {} - -[[word]] -text = "magistrate-judge" -title = {} - -[[word]] -text = "magnate" -title = {} - -[[word]] -text = "maharajah" -title = {} - -[[word]] -text = "maharani" -title = {} - -[[word]] -text = "mahdi" -title = {} - -[[word]] -text = "maj" -title = {} - -[[word]] -text = "majesty" -title = {} - -[[word]] -text = "majgen" -title = {} - -[[word]] -text = "manager" -title = {} - -[[word]] -text = "marcher" -title = {} - -[[word]] -text = "marchess" -title = {} - -[[word]] -text = "marketing" -title = {} - -[[word]] -text = "mathematician" -title = {} - -[[word]] -text = "mathematics" -title = {} - -[[word]] -text = "matriarch" -title = {} - -[[word]] -text = "mayor" -title = {} - -[[word]] -text = "mcpo" -title = {} - -[[word]] -text = "mcpoc" -title = {} - -[[word]] -text = "mcpon" -title = {} - -[[word]] -text = "md" -title = {} -credential = {} - -[[word]] -text = "me" -title = {} - -[[word]] -text = "member" -title = {} - -[[word]] -text = "memoirist" -title = {} - -[[word]] -text = "merchant" -title = {} - -[[word]] -text = "met" -title = {} - -[[word]] -text = "metropolitan" -title = {} - -[[word]] -text = "mg" -title = {} - -[[word]] -text = "mgr" -title = {} - -[[word]] -text = "mgysgt" -title = {} - -[[word]] -text = "military" -title = {} - -[[word]] -text = "minister" -title = {} - -[[word]] -text = "missionary" -title = {} - -[[word]] -text = "mobster" -title = {} - -[[word]] -text = "model" -title = {} - -[[word]] -text = "monk" -title = {} - -[[word]] -text = "monseigneur" -title = {} - -[[word]] -text = "monsignor" -title = {} - -[[word]] -text = "most" -title = {} - -[[word]] -text = "mountaineer" -title = {} - -[[word]] -text = "mpco-cg" -title = {} - -[[word]] -text = "ms" -[word.credential] -note = "NOT may_be_name, though #296's audit table put it there for the leading-title collision: the gate is position-blind and the collision is not (gated, 'John Smith, MS' read title 'MS'); a title/credential dual that position decides (decisions/C8)" - -[[word]] -text = "msg" -title = {} - -[[word]] -text = "msgt" -title = {} - -[[word]] -text = "mufti" -title = {} - -[[word]] -text = "mullah" -title = {} - -[[word]] -text = "municipal" -title = {} - -[[word]] -text = "murshid" -title = {} - -[[word]] -text = "musician" -title = {} - -[[word]] -text = "musicologist" -title = {} - -[[word]] -text = "mystery" -title = {} - -[[word]] -text = "nanny" -title = {} - -[[word]] -text = "narrator" -title = {} - -[[word]] -text = "national" -title = {} - -[[word]] -text = "naturalist" -title = {} - -[[word]] -text = "navy" -title = {} - -[[word]] -text = "neuroscientist" -title = {} - -[[word]] -text = "novelist" -title = {} - -[[word]] -text = "nurse" -title = {} - -[[word]] -text = "obstetritian" -title = {} - -[[word]] -text = "officer" -title = {} - -[[word]] -text = "opera" -title = {} - -[[word]] -text = "operating" -title = {} - -[[word]] -text = "ornithologist" -title = {} - -[[word]] -text = "painter" -title = {} - -[[word]] -text = "paleontologist" -title = {} - -[[word]] -text = "pastor" -title = {} - -[[word]] -text = "patriarch" -title = {} - -[[word]] -text = "pd" -title = {} - -[[word]] -text = "pediatrician" -title = {} - -[[word]] -text = "personality" -title = {} - -[[word]] -text = "petty" -title = {} - -[[word]] -text = "pfc" -title = {} - -[[word]] -text = "pharaoh" -title = {} - -[[word]] -text = "philantropist" -title = {} - -[[word]] -text = "philosopher" -title = {} - -[[word]] -text = "photographer" -title = {} - -[[word]] -text = "physician" -title = {} - -[[word]] -text = "physicist" -title = {} - -[[word]] -text = "pianist" -title = {} - -[[word]] -text = "pilot" -title = {} - -[[word]] -text = "pioneer" -title = {} - -[[word]] -text = "pir" -title = {} - -[[word]] -text = "player" -title = {} - -[[word]] -text = "playwright" -title = {} - -[[word]] -text = "po1" -title = {} - -[[word]] -text = "po2" -title = {} - -[[word]] -text = "po3" -title = {} - -[[word]] -text = "poet" -title = {} - -[[word]] -text = "police" -title = {} - -[[word]] -text = "political" -title = {} - -[[word]] -text = "politician" -title = {} - -[[word]] -text = "prefect" -title = {} - -[[word]] -text = "prelate" -title = {} - -[[word]] -text = "premier" -title = {} - -[[word]] -text = "pres" -title = {} - -[[word]] -text = "presbyter" -title = {} - -[[word]] -text = "president" -title = {} - -[[word]] -text = "presiding" -title = {} - -[[word]] -text = "priest" -title = {} - -[[word]] -text = "priestess" -title = {} - -[[word]] -text = "primate" -title = {} - -[[word]] -text = "prime" -title = {} - -[[word]] -text = "prin" -title = {} - -[[word]] -text = "principal" -title = {} - -[[word]] -text = "printer" -title = {} - -[[word]] -text = "printmaker" -title = {} - -[[word]] -text = "prinz" -title = {} - -[[word]] -text = "priv.-doz" -title = {} - -[[word]] -text = "prior" -title = {} - -[[word]] -text = "private" -title = {} - -[[word]] -text = "pro" -title = {} - -[[word]] -text = "producer" -title = {} - -[[word]] -text = "prof" -title = {} - -[[word]] -text = "professor" -title = {} - -[[word]] -text = "provost" -title = {} - -[[word]] -text = "pslc" -title = {} - -[[word]] -text = "psychiatrist" -title = {} - -[[word]] -text = "psychologist" -title = {} - -[[word]] -text = "publisher" -title = {} - -[[word]] -text = "pursuivant" -title = {} - -[[word]] -text = "pv2" -title = {} - -[[word]] -text = "pvt" -title = {} - -[[word]] -text = "ra" -title = {} -credential = {} - -[[word]] -text = "rabbi" -title = { note = "addresses by the TITLE, not the given name ('Rabbi Cohen'), and the tradition keeps surnames, so it stays out of GIVEN_NAME_TITLES (#346)" } - -[[word]] -text = "radio" -title = {} - -[[word]] -text = "radm" -title = {} - -[[word]] -text = "rangatira" -title = {} - -[[word]] -text = "ranger" -title = {} - -[[word]] -text = "rdml" -title = {} - -[[word]] -text = "rear" -title = {} - -[[word]] -text = "rebbe" -title = {} - -[[word]] -text = "reichsgraf" -title = {} - -[[word]] -text = "registrar" -title = {} - -[[word]] -text = "rep" -title = {} - -[[word]] -text = "representative" -title = {} - -[[word]] -text = "researcher" -title = {} - -[[word]] -text = "resident" -title = {} - -[[word]] -text = "rev" -title = {} - -[[word]] -text = "revenue" -title = {} - -[[word]] -text = "reverend" -title = {} - -[[word]] -text = "right" -title = {} - -[[word]] -text = "risk" -title = {} - -[[word]] -text = "ritter" -title = {} - -[[word]] -text = "rock" -title = {} - -[[word]] -text = "royal" -title = {} - -[[word]] -text = "rt" -title = {} - -[[word]] -text = "sa" -title = {} -credential = { note = "NOT may_be_name, for the reason recorded on ms (decisions/C8)" } - -[[word]] -text = "sailor" -title = {} - -[[word]] -text = "saint" -title = {} - -[[word]] -text = "sainte" -title = {} - -[[word]] -text = "saoshyant" -title = {} - -[[word]] -text = "satirist" -title = {} - -[[word]] -text = "scholar" -title = {} - -[[word]] -text = "schoolmaster" -title = {} - -[[word]] -text = "scientist" -title = {} - -[[word]] -text = "scpo" -title = {} - -[[word]] -text = "screenwriter" -title = {} - -[[word]] -text = "secretary" -title = {} - -[[word]] -text = "security" -title = {} - -[[word]] -text = "seigneur" -title = {} - -[[word]] -text = "senator" -title = {} - -[[word]] -text = "senior" -title = {} - -[[word]] -text = "senior-judge" -title = {} - -[[word]] -text = "sergeant" -title = {} - -[[word]] -text = "servant" -title = {} - -[[word]] -text = "sfc" -title = {} - -[[word]] -text = "sgm" -title = {} -credential = {} - -[[word]] -text = "sgt" -title = {} - -[[word]] -text = "sgtmaj" -title = {} - -[[word]] -text = "sgtmajmc" -title = {} - -[[word]] -text = "sheriff" -title = {} - -[[word]] -text = "siddha" -title = {} - -[[word]] -text = "singer" -title = {} - -[[word]] -text = "singer-songwriter" -title = {} - -[[word]] -text = "sma" -title = {} - -[[word]] -text = "smsgt" -title = {} - -[[word]] -text = "sn" -title = {} - -[[word]] -text = "soccer" -title = {} - -[[word]] -text = "social" -title = {} - -[[word]] -text = "sociologist" -title = {} - -[[word]] -text = "software" -title = {} - -[[word]] -text = "soldier" -title = {} - -[[word]] -text = "solicitor" -title = {} - -[[word]] -text = "soprano" -title = {} - -[[word]] -text = "spc" -title = {} - -[[word]] -text = "speaker" -title = {} - -[[word]] -text = "special" -title = {} - -[[word]] -text = "ssg" -title = {} - -[[word]] -text = "ssgt" -title = {} - -[[word]] -text = "st" -title = {} - -[[word]] -text = "staff" -title = {} - -[[word]] -text = "state" -title = {} - -[[word]] -text = "states" -title = {} - -[[word]] -text = "strategy" -title = {} - -[[word]] -text = "subaltern" -title = {} - -[[word]] -text = "subedar" -title = {} - -[[word]] -text = "suffragist" -title = {} - -[[word]] -text = "sultan" -title = {} - -[[word]] -text = "sultana" -title = {} - -[[word]] -text = "superior" -title = {} - -[[word]] -text = "supreme" -title = {} - -[[word]] -text = "surgeon" -title = {} - -[[word]] -text = "swordbearer" -title = {} - -[[word]] -text = "sysselmann" -title = {} - -[[word]] -text = "tax" -title = {} - -[[word]] -text = "teacher" -title = {} - -[[word]] -text = "technical" -title = {} - -[[word]] -text = "technologist" -title = {} - -[[word]] -text = "television" -title = {} - -[[word]] -text = "tenor" -title = {} - -[[word]] -text = "theater" -title = {} - -[[word]] -text = "theatre" -title = {} - -[[word]] -text = "theologian" -title = {} - -[[word]] -text = "theorist" -title = {} - -[[word]] -text = "timi" -title = {} - -[[word]] -text = "tirthankar" -title = {} - -[[word]] -text = "translator" -title = {} - -[[word]] -text = "travel" -title = {} - +# ---- the other readings of words whose title reading has a language ---- +# (#750 moved each title reading to the files of the languages whose +# names it occurs in; `uv run python tools/vocab/query.py --word ` +# shows both halves) [[word]] -text = "treasurer" -title = {} +text = "ms" +[word.credential] +note = "NOT may_be_name, though #296's audit table put it there for the leading-title collision: the gate is position-blind and the collision is not (gated, 'John Smith, MS' read title 'MS'); a title/credential dual that position decides (decisions/C8)" [[word]] -text = "tsar" -title = {} +text = "cpl" +credential = {} [[word]] -text = "tsarina" -title = {} +text = "cpo" +credential = {} [[word]] -text = "tsgt" -title = {} +text = "cpt" +credential = {} [[word]] -text = "uk" -title = {} +text = "csm" +credential = {} [[word]] -text = "united" -title = {} +text = "lt" +credential = {} [[word]] -text = "univ.prof" -title = {} +text = "md" +credential = {} [[word]] -text = "us" -title = {} +text = "ra" +credential = {} [[word]] -text = "vadm" -title = {} +text = "sa" +credential = { note = "NOT may_be_name, for the reason recorded on ms (decisions/C8)" } [[word]] -text = "vardapet" -title = {} +text = "sgm" +credential = {} [[word]] text = "vc" -title = {} credential = {} -[[word]] -text = "venerable" -title = { note = "stays out of GIVEN_NAME_TITLES: its traditions split on surname retention (Buddhist monastics drop the family name, Anglican archdeacons keep it), and addresses cannot say 'sometimes' (#346)" } - -[[word]] -text = "verderer" -title = {} - -[[word]] -text = "vicar" -title = {} - -[[word]] -text = "vice" -title = {} - -[[word]] -text = "viscount" -title = {} - -[[word]] -text = "vizier" -title = {} - -[[word]] -text = "vocalist" -title = {} - -[[word]] -text = "voice" -title = {} - -[[word]] -text = "vrouwe" -title = {} - -[[word]] -text = "warden" -title = {} - -[[word]] -text = "warrant" -title = {} - -[[word]] -text = "wing" -title = {} - -[[word]] -text = "wm" -title = {} - -[[word]] -text = "wp" -title = {} - -[[word]] -text = "wo-1" -title = {} - -[[word]] -text = "wo1" -title = {} - -[[word]] -text = "wo2" -title = {} - -[[word]] -text = "wo3" -title = {} - -[[word]] -text = "wo4" -title = {} - -[[word]] -text = "wo5" -title = {} - -[[word]] -text = "woodman" -title = {} - -[[word]] -text = "writer" -title = {} - -[[word]] -text = "zoologist" -title = {} - -# #606: offices and noble ranks (Count, Knight) for the languages the block above had -# none for; its salutations are in their language files. A word -# whose note begins "borne" is a name somewhere, but rarely the -# FIRST word of one, and ships on the 'graf' precedent above -# (decisions/salutation-titles). The words that failed are -# exclusions in their language files -# (`uv run python tools/vocab/query.py --excluded title --issue 606`). -# English offices, completing runs like "Police Commissioner". -[[word]] -text = "administrator" -title = { issue = 606 } - -[[word]] -text = "commissioner" -title = { issue = 606 } - -[[word]] -text = "counsel" -title = { issue = 606, note = "borne: ~730 surnames (Australia, the US, England), forebears.io, worldwide, rounded, 2026-10-04; shipped under the graf class (decisions/salutation-titles)" } - -# Finnish Count. -[[word]] -text = "kreivi" -title = { issue = 606, note = "borne: ~270 surnames (Finland, where registers often write the surname first), forebears.io, worldwide, rounded, 2026-10-04; shipped under the graf class (decisions/salutation-titles)" } - -# Estonian Count. -[[word]] -text = "krahv" -title = { issue = 606 } - -# Icelandic Count. -[[word]] -text = "greifi" -title = { issue = 606 } - -# Dutch Count. -[[word]] -text = "graaf" -title = { issue = 606, note = "borne; one of the three words #606 proposed the graf class for" } - -# Scandinavian Count. -[[word]] -text = "greve" -title = { issue = 606, note = "borne, so 'Greve Anna' reads title Greve; one of the three words #606 proposed the graf class for" } - -# Polish Count. -[[word]] -text = "hrabia" -title = { issue = 606, note = "borne: ~750 surnames (Poland, where registers often write the surname first), forebears.io, worldwide, rounded, 2026-10-04; shipped under the graf class (decisions/salutation-titles)" } - -# Lithuanian Count. -[[word]] -text = "grafas" -title = { issue = 606 } - -# Georgian Count, Latin script. -[[word]] -text = "grafi" -title = { issue = 606 } - -# English Knight, the rank the post-nominal 'knt' names. -[[word]] -text = "knight" -title = { issue = 606, note = "borne (Gladys Knight, who keeps family Knight in the forms she writes); one of the three words #606 proposed the graf class for" } - -# #269: Cyrillic (ru/uk) -- dr/prof/academician honorifics (the -# salutations are in ru.toml, bg.toml and uk.toml), same -# title-then-family convention as 'dr'/'prof' above (not -# GIVEN_NAME_TITLES: "д-р Петров" families the surname just like -# "Dr. Smith" does). -[[word]] -text = "д-р" -title = {} - -[[word]] -text = "проф" -title = {} - -[[word]] -text = "акад" -title = {} - -# #269: Greek -- doctor/professor abbreviations (the salutations, -# and the refused bare κ, are in el.toml); same plain-title -# convention as above. -[[word]] -text = "δρ" -title = {} - -[[word]] -text = "καθ" -title = {} - -# #269: Hebrew (the salutations are in he.toml). Both spellings of -# "doctor" ship, the ASCII-quote 'ד"ר' and the typographic 'ד״ר' -# (U+05F4 gershayim): probed live against extract_delimited's -# _open_ok/_close_ok boundary rules (2026-07-17), the quote sits -# mid-word, with no whitespace before it and a letter after it, so it -# fails both the open and the close boundary test and is left -# untouched as literal text. Extraction is provably inert on the ASCII -# spelling (U+05F4 is no delimiter); no delimiter-interaction risk. -[[word]] -text = "ד\"ר" -title = {} - -[[word]] -text = "ד״ר" -title = {} - -# #269 follow-up: the rest of the common Israeli honorifics, same -# plain-title bucket (family follows) and the same dual geresh/ -# gershayim spelling rule as above. Deferred under the collision -# rule: bare 'רב' (also the ordinary word "many"). The 'בר' -# particle is refused by an exclusion in he.toml. -[[word]] -text = "פרופ'" -title = { note = "professor abbreviation, ASCII apostrophe" } - -[[word]] -text = "פרופ׳" -title = { note = "professor abbreviation, U+05F3 geresh" } - -[[word]] -text = "פרופסור" -title = { note = "professor, full form" } - -[[word]] -text = "עו\"ד" -title = { note = "advocate/lawyer, ASCII quote" } - -[[word]] -text = "עו״ד" -title = { note = "advocate/lawyer, U+05F4 gershayim" } - -[[word]] -text = "הרב" -title = { note = "\"the rabbi\" (article form; bare רב deferred)" } - -# #269 follow-up: Devanagari (hi/mr; the salutations are in hi.toml -# and mr.toml). NO Latin twins on purpose, the sri/shri exclusions in -# hi.toml. "डॉ." matches via the edge-period normalization, like -# Latin "Dr.". -[[word]] -text = "डॉ" -title = { note = "Dr. abbreviation" } - -# #344: the civil set, same no-NEW-Latin-transliterations rule as -# the Devanagari block above. The words refused under the collision -# rule are exclusions in hi.toml. -[[word]] -text = "डॉक्टर" -title = { note = "Doctor, full form" } - -[[word]] -text = "डा" -[word.title] -note = "Dr. -- the डा. abbreviation (Nepali and older Hindi), edge-period normalized" - -[[word]] -text = "प्रो" -title = { note = "Prof. abbreviation" } - -[[word]] -text = "प्रोफेसर" -title = { note = "Professor, full form" } - -[[word]] -text = "प्राध्यापक" -title = { note = "Professor (the Sanskritic form)" } - -[[word]] -text = "प्रा" -title = { note = "Prof. abbreviation, Marathi" } - -[[word]] -text = "पंडित" -title = { note = "Pandit" } - -[[word]] -text = "पं" -title = { note = "Pandit abbreviation" } - -[[word]] -text = "सरदार" -title = { note = "Sardar" } - -[[word]] -text = "महात्मा" -[word.title] -note = "Mahatma -- civil, not renunciate: it addresses by surname (\"महात्मा गांधी\"), so TITLES only" - -[[word]] -text = "न्यायमूर्ति" -title = { note = "Justice" } - -[[word]] -text = "मौलाना" -title = { note = "Maulana" } - -[[word]] -text = "महाराजा" -title = { note = "Maharaja, LEADING (trailing महाराज is a suffix word)" } - -# #343: Bengali (bn). NO Latin twins, for the reason the sri/shri -# exclusions in hi.toml give -- transliterated Sri/Md/Mst collide -# with real given names where the native script cannot. -# No NEW Latin transliterations here (sri, mst); Latin md already -# ships, and for the medical degree -# (decisions/indic-honorifics). Doctor abbreviations -# split by profession: ড./ডঃ is the PhD's, ডাঃ/ডা. the Bangladeshi -# physician's. Abbreviation marks are spelled as written -- the -# visarga ঃ (U+0983) is a spacing combining mark, and the lookup -# fold strips only edge periods and whitespace, so it reaches the -# lexicon intact -- while period spellings (ডা., and মো. in bn.toml) match the -# bare stem through the edge-period normalization, which is why -# each stem is listed once and the dotted form is not listed at -# all. -# The salutations are in bn.toml, and so are the words refused -# under the collision rule, as exclusions. -[[word]] -text = "ড" -title = { note = "Dr. abbreviation (PhD)" } - -[[word]] -text = "ডঃ" -title = { note = "Dr. abbreviation, visarga spelling" } - -[[word]] -text = "ডক্টর" -title = { note = "Doctor, full form" } - -[[word]] -text = "ডাঃ" -title = { note = "Dr. abbreviation (physician), visarga spelling" } - -[[word]] -text = "ডা" -title = { note = "Dr. abbreviation (physician)" } - -[[word]] -text = "ডাক্তার" -title = { note = "Doctor, full form (physician)" } - -[[word]] -text = "অধ্যাপক" -title = { note = "Professor" } - -[[word]] -text = "প্রফেসর" -title = { note = "Professor, borrowed form" } - -[[word]] -text = "বিচারপতি" -title = { note = "Justice" } - -[[word]] -text = "মাওলানা" -title = { note = "Maulana" } - -[[word]] -text = "মুফতি" -title = { note = "Mufti (Latin mufti ships too)" } - -[[word]] -text = "আলহাজ্ব" -title = { note = "Alhaj" } - -[[word]] -text = "আলহাজ" -title = { note = "Alhaj, the spelling without the ব-phala" } - - # ---- the other readings of words whose particle reading has a language ---- # (#749 moved each particle reading to the files of the languages whose # names it occurs in; `uv run python tools/vocab/query.py --word ` diff --git a/nameparser/vocab/yi.toml b/nameparser/vocab/yi.toml new file mode 100644 index 00000000..889ecf98 --- /dev/null +++ b/nameparser/vocab/yi.toml @@ -0,0 +1,5 @@ +schema = 1 + +[[word]] +text = "rebbe" +religious = {} diff --git a/nameparser/vocab/yo.toml b/nameparser/vocab/yo.toml index d0461bd7..e85e6a84 100644 --- a/nameparser/vocab/yo.toml +++ b/nameparser/vocab/yo.toml @@ -1,5 +1,13 @@ schema = 1 +[[word]] +text = "elerunwon" +nobility = { expands = "the ruler of Erunwon" } + +[[word]] +text = "timi" +nobility = { expands = "the ruler of Ede" } + [[word]] text = "ajala" [word.excluded.generation] diff --git a/tests/v2/test_locales.py b/tests/v2/test_locales.py index 26da445e..da4a00d7 100644 --- a/tests/v2/test_locales.py +++ b/tests/v2/test_locales.py @@ -1236,7 +1236,7 @@ def test_non_interference_all_packs_combined() -> None: # mid-word (no preceding whitespace before '"', and for the # trailing "'" no following word boundary), so it never satisfies # the boundary-valid open/close test and is left as literal text. - # Both spellings are shipped; see their notes in nameparser/vocab/und.toml. + # Both spellings are shipped; see their notes in nameparser/vocab/he.toml. ('ד"ר דוד לוי', "title", 'ד"ר'), ("גב' דוד לוי", "title", "גב'"), ("ד״ר דוד לוי", "title", "ד״ר"), From 6803d54249587cac46b57fd1ec17bdde9ef15216 Mon Sep 17 00:00:00 2001 From: Derek Gulbranson Date: Mon, 19 Oct 2026 23:18:44 -0700 Subject: [PATCH 2/6] Address the docs review of #750 part 2 clergyman records no gender, the list holding no clergywoman, so the data matches the -man rule the entry states; build.py's und.toml exemption quotes a pointer that still exists; the shared-readings bullet lists all eleven credentials. Co-Authored-By: Claude Opus 5.5 --- docs/design/decisions/vocabulary-model.md | 2 +- nameparser/vocab/en.toml | 2 +- tools/vocab/build.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/design/decisions/vocabulary-model.md b/docs/design/decisions/vocabulary-model.md index 2a2f2079..ce768c19 100644 --- a/docs/design/decisions/vocabulary-model.md +++ b/docs/design/decisions/vocabulary-model.md @@ -71,5 +71,5 @@ The vocabulary was a set of base sets plus marker subsets (`particles` and `part - **mul.toml** takes `docent` and `professor` beside `dr` and `prof`: full words spelled alike in several European languages, listed once rather than in a file per language. - **A transliteration goes to its source language**, as in part 1: the Islamic titles to ar.toml (`imam`, `mufti`, `mahdi`, `murshid`, `hajji`, `vizier`), or to fa.toml where the Latin spelling is the Persian form (`ayatollah`, `akhoond`, `mullah`, `pir`); `rabbi` to he.toml and `rebbe` to yi.toml; `maharajah`, `maharani` and `subedar` to hi.toml; `giani` and `gyani` to pa.toml; `tsar` and `tsarina` to ru.toml; `effendi` to tr.toml; `vardapet` to hy.toml. The Buddhist, Jain and Zoroastrian titles (`arhat`, `bodhisattva`, `buddha`, `siddha`, `tirthankar`, `saoshyant`) are in en.toml: no source-language name is written with these Latin spellings, which are English loanwords. Four files are new: bin (Edo, `edohen` and `ekegbian`), ff (Fula, `lamido`), mi (Māori, `rangatira`) and yi. - **Gender** follows part 1's rule. The man's title of a noble pair is marked (`count`, `baron`, `graf`) as `king` is, and so is a `-man` word whose `-woman` pair the list holds (`businessman`); a descriptive noun beside its `-ess` form marks only the feminine (`actress`, `heiress`). `sultan` records none, Ottoman usage having given it to imperial women too (its note in tr.toml). - - **Comments became fields.** The #269, #343 and #344 block comments over the native-script titles are notes on one entry of each group (the Hebrew quote-boundary probe on `ד"ר`, the Bengali doctor split on `ড`); `duke`'s one-line keep-out is an exclusion in en.toml with its counts; the notes part 1 left on `lord`, `lady`, `venerable`, `rabbi` and `imam` moved with them. A reading `und.toml` shares with a moved title (`cpl`, `md`, `sa`, and `ms` from part 1) sits in a section of its own, as #749's did. + - **Comments became fields.** The #269, #343 and #344 block comments over the native-script titles are notes on one entry of each group (the Hebrew quote-boundary probe on `ד"ר`, the Bengali doctor split on `ড`); `duke`'s one-line keep-out is an exclusion in en.toml with its counts; the notes part 1 left on `lord`, `lady`, `venerable`, `rabbi` and `imam` moved with them. The readings `und.toml` shares with a moved title, all credentials (`cpl`, `cpo`, `cpt`, `csm`, `lt`, `md`, `ra`, `sa`, `sgm`, `vc`, and `ms` from part 1), sit in a section of their own, as #749's did. - **Recompute** rather than quoting: `uv run python tools/vocab/query.py --kind title --file und --count`, `--file en --kind modifier --count`, `--file mul`. diff --git a/nameparser/vocab/en.toml b/nameparser/vocab/en.toml index 338db36b..5e0d82d3 100644 --- a/nameparser/vocab/en.toml +++ b/nameparser/vocab/en.toml @@ -1252,7 +1252,7 @@ occupation = {} [[word]] text = "clergyman" -occupation = { gender = "m" } +occupation = {} [[word]] text = "co-founder" diff --git a/tools/vocab/build.py b/tools/vocab/build.py index e9ca708b..3eeff5f6 100644 --- a/tools/vocab/build.py +++ b/tools/vocab/build.py @@ -200,7 +200,7 @@ def _alnum(text: str) -> str: assert len(_RUNS) == len(set(_RUNS)), "a category's kinds are listed apart in CATEGORY" #: The file exempt from check 10: its entries keep the order of the #: Python lists they were converted from, which the vetting comments -#: above them still refer to ("the TITLES block below"). +#: above them still refer to ("Same word as عبد below"). UNORDERED = "und.toml" #: Behavioral properties per category: each compiles into a field, and From 5beb8fe033b66d521258dcad797712fcd25ef25f Mon Sep 17 00:00:00 2001 From: Derek Gulbranson Date: Mon, 19 Oct 2026 23:41:58 -0700 Subject: [PATCH 3/6] Address the PR review of #750 part 2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit wm keeps the generic title kind with a note saying it is William's abbreviation, made a title for #68; doctor joins dr, prof, docent and professor in mul.toml; पंडित and पं are academic, as part 1's refusal of the Latin pandit is keyed. The #9 court words carry issue = 9, expands keeping only their meaning; tsar and giani put their native spelling in native. Restored: #606's reason for administrator and commissioner, #344's native-only rule (on न्यायमूर्ति), डा's edge-period remark. Fixed: duke's example bearer, the д-р note's use of family-first, the README's refusal-only example (senior gained a reading), hon's and mpco-cg's notes, edmi's guess. Part 1's entry marks what part 2 completed. Co-Authored-By: Claude Opus 5.5 --- docs/design/decisions/salutation-titles.md | 2 +- docs/design/decisions/vocabulary-model.md | 13 ++++---- nameparser/vocab/README.md | 2 +- nameparser/vocab/en.toml | 36 ++++++++++------------ nameparser/vocab/hi.toml | 20 ++++++------ nameparser/vocab/mr.toml | 16 +++++----- nameparser/vocab/mul.toml | 4 +++ nameparser/vocab/ne.toml | 2 +- nameparser/vocab/pa.toml | 2 +- nameparser/vocab/ru.toml | 6 ++-- nameparser/vocab/und.toml | 2 +- 11 files changed, 53 insertions(+), 52 deletions(-) diff --git a/docs/design/decisions/salutation-titles.md b/docs/design/decisions/salutation-titles.md index b35fffdc..fa6ea758 100644 --- a/docs/design/decisions/salutation-titles.md +++ b/docs/design/decisions/salutation-titles.md @@ -1,6 +1,6 @@ # salutation-titles — salutations, offices and ranks for the languages TITLES had none for (2026-10-04, #606) -Closes #606 (#662 later added owura and bapak, last bullet). No parser code moves: 41 words join TITLES and one, knt (Knight, beside kt), joins SUFFIX_ACRONYMS with a `Knt` case mask. The class is decided once — a word that addresses or ranks a person and is written in FRONT of the name — and each word is then argued on #vocabulary-collisions C-i, the position test, because TITLES has no ambiguous subset and the only two answers available are ship and do not ship. The per-word lists, grouped by language, are the titles carrying `issue = 606` (`uv run python tools/vocab/query.py --issue 606 --kind title`; one line per file a word is in; the #606 block of nameparser/config/titles.py until 2026-10-18, then TOML comments in nameparser/vocab/und.toml, and since 2026-10-19 (#750) the salutations' entries in their language files, and the offices' and the noble Counts' too since the second part of #750 the same day). +Closes #606 (#662 later added owura and bapak, last bullet). No parser code moves: 41 words join TITLES and one, knt (Knight, beside kt), joins SUFFIX_ACRONYMS with a `Knt` case mask. The class is decided once — a word that addresses or ranks a person and is written in FRONT of the name — and each word is then argued on #vocabulary-collisions C-i, the position test, because TITLES has no ambiguous subset and the only two answers available are ship and do not ship. The per-word lists, grouped by language, are the titles carrying `issue = 606` (`uv run python tools/vocab/query.py --issue 606 --kind title`; one line per file a word is in; the #606 block of nameparser/config/titles.py until 2026-10-18, then TOML comments in nameparser/vocab/und.toml, and since 2026-10-19 (#750) the salutations' entries in their language files, and the offices', the noble Counts' and knight's too since the second part of #750 the same day). - **The graf class, decided (Derek, 2026-10-04).** A word borne as a name, but RARELY as the first word of one, ships anyway, on the precedent of graf, which shipped though Steffi Graf exists. This is a judgment on each word's incidence in the leading position — the position C-i asks about — and not a rule, and it is an EXCEPTION to C-i rather than an application of it: C-i is an iff with no threshold, and herra, batoni, hrabia and kreivi were measured as borne in that position, so C-i says do not ship them (TITLES having no ambiguous subset to mark them in). What the exception adds is a weighing C-i does not make, a small measured incidence against the benefit of the title reading, and it is scoped to TITLES and to the words this entry names. It licenses nothing in the particle or suffix sets, and a later TITLES word that wants it is argued on its own counts. The title claim acts only in front, so most bearers are untouched in the forms they write: `Gladys Knight` and `Knight, Gladys` keep family Knight. The cost falls on a name that BEGINS with the word, the cost `Graf Steffi` already paid: `Greve Anna` reads title Greve, family Anna, and a given name is lost the same way, `Herra Wijaya` reading title Herra, family Wijaya. Declaring `FAMILY_FIRST` does not help, since the title claim is read before the order (`Hrabia Anna` reads title Hrabia under it); the family comma does. Two further limits, both pre-existing: a trailing period makes the word the title by rules/H5 (`Gladys Knight.` reads title `Knight.`, as `Mary Jane King.` does), and every word this entry adds widens that rule's reach, H5 claiming any listed title behind a period. Accepted rather than prevented, and stated at rules/H1's Accepted clause. The issue proposed the class for three words — greve (Scandinavian Count), graaf (Dutch Count), knight. The spot-check the issue asked for (forebears.io, 2026-10-04, worldwide counts rounded) found ten more of its "no known collision" words borne, and Derek extended the decision to all of them rather than excluding them: herra, batoni, ponas, counsel, ponia, the Filipino ginoo, ginang and binibini, and two whose registers often write the surname first, hrabia and kreivi. Each word's counts are on the `note` of its title reading in one of its files (herra's in fi.toml), a note beginning "borne" (`uv run python tools/vocab/query.py --issue 606 --kind title`; this bullet held them until 2026-10-19, #750). Those last two, and the given-name uses of herra and batoni, are the leading-position bearers this class accepts, and were decided on with their counts in hand. The line is NOT reproducible from this record, and that is said rather than hidden: the accepted side was counted, while the excluded side — thiru, puan, pan, rodina, ông/bà — was judged from general knowledge of each word, as #606 drafted it, with no count taken (the count source refused further lookups the same day). Each was judged a COMMON leading-position name, against counts in the hundreds on the accepted side; gróf was excluded for want of any evidence at all. Each refusal is an `excluded` entry in its language's file (`uv run python tools/vocab/query.py --excluded title --issue 606`). Whoever decides κόμης or the next salutation should count the excluded words first, and is free to find the line in a different place. Those notes are where a sweep meets the decision as it meets the word (the `# borne` comment in titles.py until 2026-10-18). - **Accents are not folded, and two words depend on it.** `_lexicon._normalize` lowercases and composes NFC and does nothing else to letters, so paní and härra cannot match Pani or Harra (the counts are on their notes). Accent-folding the lexicon would turn both into collisions; whoever proposes it re-argues this entry. frú depends on nothing: the unaccented fru (Swedish/Danish Mrs) already ships, so the Cameroonian surname Fru (its count on fru's note in sv.toml) already reads as a title in `Fru Anna` and did before this entry; that pre-existing collision is recorded here rather than argued, being no part of #606. diff --git a/docs/design/decisions/vocabulary-model.md b/docs/design/decisions/vocabulary-model.md index ce768c19..24b52583 100644 --- a/docs/design/decisions/vocabulary-model.md +++ b/docs/design/decisions/vocabulary-model.md @@ -59,16 +59,17 @@ The vocabulary was a set of base sets plus marker subsets (`particles` and `part - **`und.toml` is exempt.** Its entries keep the Python lists' order, which its vetting comments still point along (a neighbour "above" or "below"); each category's classification moves its words out, into files that are checked. - **2026-10-19 #750 — title kinds, and the salutations and given-addressing titles classified (part 1 of #750; kinds approved by Derek in chat, 2026-10-19).** No compiled set moves: `tools/vocab/build.py --check` reports the committed module current, and `tools/differential/snapshot.py` matches. Ten title kinds join the generic one, defined in nameparser/vocab/README.md: `salutation`, `style`, `academic`, `religious`, `nobility`, `military`, `office`, `occupation`, `kinship` and `modifier`. Two lines are drawn on purpose. `academic` and `occupation` divide by FUNCTION, not subject: a form of address (`Dr`, the Egyptian `مهندس`) against a job described before a name (`chemist`, `novelist`), so the descriptive words, the collision-prone half of the old bulk import, sit in one kind any later gate can name. `modifier` is decision 10's parked class (`vice`, `grand`, `his`, `1st`), recorded as data now and behaving as every title does until that rule is designed. A household kind was proposed and folded into `occupation` (it would have held about five words). - - **The hard cases, decided with the kinds.** `prince`, `princess`, `sir` and `dame` are `nobility`, the last two as chivalric ranks, and `lord`, `lady` and `knight` will be when their kinds are assigned; `master` is a `salutation`, the style for a boy that is why it addresses by the given name; `father`, `mother`, `brother` and `sister` are `religious`, the use a title makes of them, while `aunt` and `uncle` are `kinship`; the sheikh cluster is a `style`, used for rulers, elders and scholars alike; `chief` will be `nobility` and `deputy` an `office`, not modifiers, since each stands alone as a title ("Chief Obafemi Awolowo"); the Bengali মোঃ and মোসাঃ are salutations, keeping the note that মোঃ abbreviates a name. + - **The hard cases, decided with the kinds.** `prince`, `princess`, `sir` and `dame` are `nobility`, the last two as chivalric ranks, and `lord`, `lady` and `knight` will be when their kinds are assigned (done in part 2, the same day); `master` is a `salutation`, the style for a boy that is why it addresses by the given name; `father`, `mother`, `brother` and `sister` are `religious`, the use a title makes of them, while `aunt` and `uncle` are `kinship`; the sheikh cluster is a `style`, used for rulers, elders and scholars alike; `chief` will be `nobility` and `deputy` an `office`, not modifiers, since each stands alone as a title ("Chief Obafemi Awolowo"); the Bengali মোঃ and মোসাঃ are salutations, keeping the note that মোঃ abbreviates a name. - **Gender only on a marked word** (decision 9): a feminine form or one half of a fixed pair (`mr` and `mrs`, `king` and `queen`), and `mx` as `"n"`; an unmarked noun (`actor`, `pope`, `doctor`) records none. - - **Files.** Each reading went to the file of every language whose names it occurs in, a Latin transliteration to its source language's file as #749 put the Latin `bin` in ar.toml (`swami` in hi.toml and bn.toml, the sheikh cluster in ar.toml, `cheikh` in fr.toml too). Six files are new: ak, et, id, ro, sw and vi. The few abbreviations shared across European languages (`dr`, `prof`) will go to `mul.toml` with the rest of their kind; no salutation qualified, each language writing its own. - - **The title keep-outs became exclusions**, in the file of the language whose reading they refuse, with their counts as name readings where counts were taken (malam, bay, shehu): `uv run python tools/vocab/query.py --excluded title`. The per-word counts in decisions/salutation-titles moved onto the `note` of each word's title reading, and the prose points at the query. The reasons the given-addressing comments gave for leaving `lord`, `lady`, `venerable`, `rabbi` and `imam` out of GIVEN_NAME_TITLES are notes on those words in und.toml until their kinds are assigned. - - **Recompute** rather than quoting: `uv run python tools/vocab/query.py --kind salutation --count`, `--kind title --file und --count` (the titles still unclassified), `--excluded title`. + - **Files.** Each reading went to the file of every language whose names it occurs in, a Latin transliteration to its source language's file as #749 put the Latin `bin` in ar.toml (`swami` in hi.toml and bn.toml, the sheikh cluster in ar.toml, `cheikh` in fr.toml too). Six files are new: ak, et, id, ro, sw and vi. The few abbreviations shared across European languages (`dr`, `prof`) will go to `mul.toml` (done in part 2, the same day) with the rest of their kind; no salutation qualified, each language writing its own. + - **The title keep-outs became exclusions**, in the file of the language whose reading they refuse, with their counts as name readings where counts were taken (malam, bay, shehu): `uv run python tools/vocab/query.py --excluded title`. The per-word counts in decisions/salutation-titles moved onto the `note` of each word's title reading, and the prose points at the query. The reasons the given-addressing comments gave for leaving `lord`, `lady`, `venerable`, `rabbi` and `imam` out of GIVEN_NAME_TITLES are notes on those words in und.toml until their kinds are assigned (they moved with them in part 2, the same day). + - **Recompute** rather than quoting: `uv run python tools/vocab/query.py --kind salutation --count`, `--kind title --file und --count` (the titles still unclassified; 0 since part 2, the same day), `--excluded title`. - **2026-10-19 #750 — the rest of the titles classified (part 2 of #750).** No compiled set moves: `tools/vocab/build.py --check` reports the committed module current, and `tools/differential/snapshot.py` matches. The 644 titles still generic in `und.toml` on e943665e took their kinds and left for the files of the languages whose names they occur in, so `und.toml` holds no title. Part 1's hard cases are applied as decided there: `lord`, `lady`, `knight` and `chief` are `nobility`, `deputy` an `office`, and `dr` and `prof` are in mul.toml. - **English holds most of them**: the bulk import's occupations, the US military ranks and their abbreviations, the offices, and the modifiers. `modifier` takes what is a title only inside a phrase: the qualifiers of ranks and offices (`vice`, `rear`, `petty`, `field`), the domain words of the descriptive titles (`baseball`, `software`, `tax`), the ordinals, and the court words of #9's list of judges' titles (`designated`, `docket`, `pro`, `edmi`). - - **Address, not subject, decides `academic`.** Besides the doctors and professors of every script, it takes the English words used to address a professional (`advocate`, `attorney`, `engineer`, `nurse`, and `md` as the medical degree written before a name), and the German abbreviations written before a name (`ra`, Rechtsanwalt; `wp`, Wirtschaftsprüfer; `pd` and `priv.-doz`; `dipl.-ing`). - - **mul.toml** takes `docent` and `professor` beside `dr` and `prof`: full words spelled alike in several European languages, listed once rather than in a file per language. + - **Address, not subject, decides `academic`.** Besides the doctors and professors of every script, it takes the English words used to address a professional (`advocate`, `attorney`, `engineer`, `nurse`, and `md` as the medical degree written before a name), the German abbreviations written before a name (`ra`, Rechtsanwalt; `wp`, Wirtschaftsprüfer; `pd` and `priv.-doz`; `dipl.-ing`), and the Devanagari `पंडित` and `पं`, a scholar's title, as part 1's refusal of the Latin `pandit` already keyed it. + - **`wm` keeps the generic kind**, in en.toml: it is William's abbreviation, made a title for #68 so that `Wm. Scott Magargee III` would not read given `Wm.`, and no title kind describes it. Removing it moves a parse (`Wm. Smith` reads title `Wm.` and no given name), so it is left to its own change. + - **mul.toml** takes `docent`, `doctor` and `professor` beside `dr` and `prof`: full words spelled alike in several European languages, listed once rather than in a file per language. - **A transliteration goes to its source language**, as in part 1: the Islamic titles to ar.toml (`imam`, `mufti`, `mahdi`, `murshid`, `hajji`, `vizier`), or to fa.toml where the Latin spelling is the Persian form (`ayatollah`, `akhoond`, `mullah`, `pir`); `rabbi` to he.toml and `rebbe` to yi.toml; `maharajah`, `maharani` and `subedar` to hi.toml; `giani` and `gyani` to pa.toml; `tsar` and `tsarina` to ru.toml; `effendi` to tr.toml; `vardapet` to hy.toml. The Buddhist, Jain and Zoroastrian titles (`arhat`, `bodhisattva`, `buddha`, `siddha`, `tirthankar`, `saoshyant`) are in en.toml: no source-language name is written with these Latin spellings, which are English loanwords. Four files are new: bin (Edo, `edohen` and `ekegbian`), ff (Fula, `lamido`), mi (Māori, `rangatira`) and yi. - **Gender** follows part 1's rule. The man's title of a noble pair is marked (`count`, `baron`, `graf`) as `king` is, and so is a `-man` word whose `-woman` pair the list holds (`businessman`); a descriptive noun beside its `-ess` form marks only the feminine (`actress`, `heiress`). `sultan` records none, Ottoman usage having given it to imperial women too (its note in tr.toml). - **Comments became fields.** The #269, #343 and #344 block comments over the native-script titles are notes on one entry of each group (the Hebrew quote-boundary probe on `ד"ר`, the Bengali doctor split on `ড`); `duke`'s one-line keep-out is an exclusion in en.toml with its counts; the notes part 1 left on `lord`, `lady`, `venerable`, `rabbi` and `imam` moved with them. The readings `und.toml` shares with a moved title, all credentials (`cpl`, `cpo`, `cpt`, `csm`, `lt`, `md`, `ra`, `sa`, `sgm`, `vc`, and `ms` from part 1), sit in a section of their own, as #749's did. diff --git a/nameparser/vocab/README.md b/nameparser/vocab/README.md index ddd9541e..d2b77614 100644 --- a/nameparser/vocab/README.md +++ b/nameparser/vocab/README.md @@ -83,7 +83,7 @@ Two rules about the `text`: Every file but `und.toml` lists its words in one order, and the build refuses a file that does not (check 10), naming the entry to move and where it belongs: -1. **By kind**, in the order of the table under [Kinds](#kinds), which lists the categories in turn and each category's kinds together. A word with several readings sorts under its first kind in that order. A word whose only vocabulary reading is a refusal (`fils`, `senior`) sorts under the kind it refuses, a refused category counting as its first kind, and a name reading places a word only when it has nothing else. +1. **By kind**, in the order of the table under [Kinds](#kinds), which lists the categories in turn and each category's kinds together. A word with several readings sorts under its first kind in that order. A word whose only vocabulary reading is a refusal (`fils`, `duke`) sorts under the kind it refuses, a refused category counting as its first kind, and a name reading places a word only when it has nothing else. 2. **Then by the word it is a spelling of**: a reading's `same_as`, or the word's own text when it has none. A head comes first and its spellings follow it, so `jr` is followed by `jnr` and `junior`, and `sr` by `snr`. A spelling that has spellings of its own heads a group inside its head's: in `ar.toml`, `el-` follows the `a…-` spellings of `al-` with its own assimilated forms after it, and `ul-` comes last. Only the file's own entries are followed, so a word that is a head in one file and a spelling in another is placed in each file by that file alone. 3. **Then by the word's text.** diff --git a/nameparser/vocab/en.toml b/nameparser/vocab/en.toml index 5e0d82d3..b6ae74c0 100644 --- a/nameparser/vocab/en.toml +++ b/nameparser/vocab/en.toml @@ -1,5 +1,9 @@ schema = 1 +[[word]] +text = "wm" +title = { issue = 68, note = "William, abbreviated, and no title of any kind: added for #68, where 'Wm. Scott Magargee III' read first name 'Wm.', so 'Wm. Smith' reads title Wm. and no given name" } + [[word]] text = "goodman" salutation = { gender = "m", expands = "the archaic Mr., 'Goodman Brown'" } @@ -74,7 +78,7 @@ style = {} [[word]] text = "hon" -style = { same_as = "honorable", note = "sorry Hon Solo, but judges seem more common." } +style = { same_as = "honorable", note = "kept though Hon is a given name: the judges' Hon. was judged the commoner reading" } [[word]] text = "honourable" @@ -92,10 +96,6 @@ academic = { expands = "the address of an advocate, 'Adv. Smith' in South Africa text = "attorney" academic = { expands = "the address of a lawyer, 'Atty. Cruz'" } -[[word]] -text = "doctor" -academic = {} - [[word]] text = "engineer" academic = { expands = "the address of an engineer, 'Engr. Cruz' in the Philippines and Nigeria" } @@ -352,7 +352,7 @@ nobility = { addresses = "given", gender = "f", expands = "the female knighthood text = "duke" given = { us_ssa = 11595, wikidata = 151, as_of = 2026-10-19, note = "male births only" } family = { us_census_2010 = 35053, wikidata = 315, as_of = 2026-10-19 } -excluded = { nobility = "a common given name (Duke Ellington), and a surname besides" } +excluded = { nobility = "a common given name (Duke Kahanamoku), and a surname besides" } [[word]] text = "dutchess" @@ -696,7 +696,7 @@ military = { expands = "Master Gunnery Sergeant" } [[word]] text = "mpco-cg" -military = { note = "as shipped; the rank is MCPO-CG, Master Chief Petty Officer of the Coast Guard, already listed as mcpoc" } +military = { note = "as shipped; the rank is MCPOCG, Master Chief Petty Officer of the Coast Guard, already listed as mcpoc" } [[word]] text = "msg" @@ -840,7 +840,7 @@ military = { expands = "Warrant Officer 5" } [[word]] text = "administrator" -office = { issue = 606 } +office = { issue = 606, note = "one of #606's English offices, completing runs like 'Police Commissioner'" } [[word]] text = "alderman" @@ -916,7 +916,7 @@ office = { same_as = "co-chair" } [[word]] text = "commissioner" -office = { issue = 606 } +office = { issue = 606, note = "one of #606's English offices, completing runs like 'Police Commissioner'" } [[word]] text = "comptroller" @@ -1048,7 +1048,7 @@ office = {} [[word]] text = "pslc" -office = { expands = "Pro Se Law Clerk (#9)" } +office = { issue = 9, expands = "Pro Se Law Clerk" } [[word]] text = "pursuivant" @@ -1106,10 +1106,6 @@ office = {} text = "warden" office = {} -[[word]] -text = "wm" -office = { note = "added for #68 with no expansion recorded; Wm. also abbreviates William" } - [[word]] text = "abolitionist" occupation = {} @@ -1900,11 +1896,11 @@ modifier = { expands = "the second word of chargé d'affaires" } [[word]] text = "designated" -modifier = { expands = "Designated Judge (#9)" } +modifier = { issue = 9, expands = "Designated Judge" } [[word]] text = "discovery" -modifier = { expands = "a US court word, from #9's list of federal judges' titles" } +modifier = { issue = 9 } [[word]] text = "district" @@ -1916,11 +1912,11 @@ modifier = {} [[word]] text = "docket" -modifier = { expands = "Docket Clerk (#9)" } +modifier = { issue = 9, expands = "Docket Clerk" } [[word]] text = "edmi" -modifier = { note = "from #9's list of federal judges' titles, its meaning unrecorded there (a court's initials, perhaps the Eastern District of Michigan)" } +modifier = { issue = 9, note = "from #9's list of federal judges' titles; its meaning is not recorded there" } [[word]] text = "english" @@ -1940,7 +1936,7 @@ modifier = { same_as = "executive" } [[word]] text = "family" -modifier = { expands = "Family Court (#9)" } +modifier = { issue = 9, note = "added with #9's judicial titles (0c2596c7); the phrase it was for is not recorded" } [[word]] text = "federal" @@ -2104,7 +2100,7 @@ modifier = {} [[word]] text = "pro" -modifier = { expands = "Pro Se Law Clerk (#9)" } +modifier = { issue = 9, expands = "Pro Se Law Clerk" } [[word]] text = "queen's" diff --git a/nameparser/vocab/hi.toml b/nameparser/vocab/hi.toml index 98d71ca9..005d9c73 100644 --- a/nameparser/vocab/hi.toml +++ b/nameparser/vocab/hi.toml @@ -48,14 +48,6 @@ salutation = { gender = "f", issue = 344, expands = "Sushri, Ms." } text = "ठाकुर" excluded = { style = { reason = "Tagore, the surname, as with the Bengali ঠাকুর", issue = 344, decided = 2026-09-06 } } -[[word]] -text = "पंडित" -style = { issue = 344, expands = "Pandit" } - -[[word]] -text = "पं" -style = { issue = 344, same_as = "पंडित", expands = "Pandit, abbreviated" } - [[word]] text = "महात्मा" style = { issue = 344, expands = "Mahatma", note = "civil, not renunciate: it addresses by surname ('महात्मा गांधी'), so TITLES only" } @@ -74,7 +66,7 @@ excluded = { academic = { reason = "a common surname (Vijaya Lakshmi Pandit); th [[word]] text = "डा" -academic = { issue = 344, expands = "Dr., the डा. abbreviation (Nepali and older Hindi)" } +academic = { issue = 344, expands = "Dr., the डा. abbreviation (Nepali and older Hindi), matched through the edge-period normalization" } [[word]] text = "डॉ" @@ -84,6 +76,14 @@ academic = { issue = 269, expands = "Dr., abbreviated", note = "डॉ. matches text = "डॉक्टर" academic = { issue = 344, expands = "doctor, full form" } +[[word]] +text = "पंडित" +academic = { issue = 344, expands = "Pandit, a scholar's title" } + +[[word]] +text = "पं" +academic = { issue = 344, same_as = "पंडित", expands = "Pandit, abbreviated" } + [[word]] text = "प्राध्यापक" academic = { issue = 344, expands = "professor, the Sanskritic form" } @@ -162,7 +162,7 @@ military = {} [[word]] text = "न्यायमूर्ति" -office = { issue = 344, expands = "Justice" } +office = { issue = 344, expands = "Justice", note = "#344's civil set ships in native script only, with no new Latin transliteration; the words it refused under the collision rule are exclusions in this file" } [[word]] text = "जुनियर" diff --git a/nameparser/vocab/mr.toml b/nameparser/vocab/mr.toml index 0377b75f..57de2cb9 100644 --- a/nameparser/vocab/mr.toml +++ b/nameparser/vocab/mr.toml @@ -12,14 +12,6 @@ salutation = { gender = "f", issue = 269, expands = "Shrimati, Mrs." } text = "सौ" salutation = { gender = "f", issue = 344, expands = "Sau., Mrs." } -[[word]] -text = "पंडित" -style = { issue = 344, expands = "Pandit" } - -[[word]] -text = "पं" -style = { issue = 344, same_as = "पंडित", expands = "Pandit, abbreviated" } - [[word]] text = "महात्मा" style = { issue = 344, expands = "Mahatma" } @@ -36,6 +28,14 @@ academic = { issue = 269, expands = "Dr., abbreviated" } text = "डॉक्टर" academic = { issue = 344, expands = "doctor, full form" } +[[word]] +text = "पंडित" +academic = { issue = 344, expands = "Pandit, a scholar's title" } + +[[word]] +text = "पं" +academic = { issue = 344, same_as = "पंडित", expands = "Pandit, abbreviated" } + [[word]] text = "प्रा" academic = { issue = 344, expands = "Prof., the Marathi abbreviation" } diff --git a/nameparser/vocab/mul.toml b/nameparser/vocab/mul.toml index 8b08c209..ec2339f6 100644 --- a/nameparser/vocab/mul.toml +++ b/nameparser/vocab/mul.toml @@ -6,6 +6,10 @@ schema = 1 text = "docent" academic = { expands = "the academic rank, spelled alike in Dutch, Swedish, Danish, Norwegian, Polish and Czech" } +[[word]] +text = "doctor" +academic = { expands = "spelled alike in English, Spanish, Catalan and Romanian" } + [[word]] text = "dr" academic = { expands = "Doctor, abbreviated alike across the European languages" } diff --git a/nameparser/vocab/ne.toml b/nameparser/vocab/ne.toml index b19ca7fc..43f0702c 100644 --- a/nameparser/vocab/ne.toml +++ b/nameparser/vocab/ne.toml @@ -2,7 +2,7 @@ schema = 1 [[word]] text = "डा" -academic = { issue = 344, expands = "Dr., the डा. abbreviation (Nepali and older Hindi)" } +academic = { issue = 344, expands = "Dr., the डा. abbreviation (Nepali and older Hindi), matched through the edge-period normalization" } [[word]] text = "जेआर" diff --git a/nameparser/vocab/pa.toml b/nameparser/vocab/pa.toml index 1943db8f..398ce135 100644 --- a/nameparser/vocab/pa.toml +++ b/nameparser/vocab/pa.toml @@ -2,7 +2,7 @@ schema = 1 [[word]] text = "giani" -religious = { expands = "a learned Sikh, ਗਿਆਨੀ" } +religious = { expands = "a learned Sikh", native = "ਗਿਆਨੀ" } [[word]] text = "gyani" diff --git a/nameparser/vocab/ru.toml b/nameparser/vocab/ru.toml index 547308f6..bd2f3b55 100644 --- a/nameparser/vocab/ru.toml +++ b/nameparser/vocab/ru.toml @@ -14,7 +14,7 @@ academic = { issue = 269, expands = "academician" } [[word]] text = "д-р" -academic = { issue = 269, expands = "doctor", note = "a plain title, family-first like 'dr' (not GIVEN_NAME_TITLES: 'д-р Петров' families the surname just as 'Dr. Smith' does)" } +academic = { issue = 269, expands = "doctor", note = "a plain title, the family name following it as after 'dr' (not GIVEN_NAME_TITLES: 'д-р Петров' families the surname just as 'Dr. Smith' does)" } [[word]] text = "проф" @@ -22,11 +22,11 @@ academic = { issue = 269, expands = "professor" } [[word]] text = "tsar" -nobility = { gender = "m", expands = "царь" } +nobility = { gender = "m", expands = "the Russian emperor", native = "царь" } [[word]] text = "tsarina" -nobility = { gender = "f" } +nobility = { gender = "f", native = "царица" } [[word]] text = "мл" diff --git a/nameparser/vocab/und.toml b/nameparser/vocab/und.toml index 2c140e9f..d8b0b0d3 100644 --- a/nameparser/vocab/und.toml +++ b/nameparser/vocab/und.toml @@ -12,7 +12,7 @@ schema = 1 # ---- the other readings of words whose title reading has a language ---- # (#750 moved each title reading to the files of the languages whose -# names it occurs in; `uv run python tools/vocab/query.py --word ` +# names it occurs in, or to mul.toml; `uv run python tools/vocab/query.py --word ` # shows both halves) [[word]] text = "ms" From 1f36ae42c1c43b32487f8c63a195e6f2121c7ea8 Mon Sep 17 00:00:00 2001 From: Derek Gulbranson Date: Mon, 19 Oct 2026 23:44:21 -0700 Subject: [PATCH 4/6] Address the review of the #750 part 2 fix commit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit wm's note and entry cite the parse removal moves, measured with the word removed: only the bare 'Wm Smith' depends on it, the dotted 'Wm.' being taken by the period-abbreviation shape rule either way. The README and the decisions entries say wm is the one generic title left. डा's edge-period remark is a note in hi.toml, not an expands in two files. Co-Authored-By: Claude Opus 5.5 --- docs/design/decisions/vocabulary-model.md | 6 +++--- nameparser/vocab/README.md | 2 +- nameparser/vocab/en.toml | 2 +- nameparser/vocab/hi.toml | 2 +- nameparser/vocab/ne.toml | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/design/decisions/vocabulary-model.md b/docs/design/decisions/vocabulary-model.md index 24b52583..74454c9d 100644 --- a/docs/design/decisions/vocabulary-model.md +++ b/docs/design/decisions/vocabulary-model.md @@ -63,12 +63,12 @@ The vocabulary was a set of base sets plus marker subsets (`particles` and `part - **Gender only on a marked word** (decision 9): a feminine form or one half of a fixed pair (`mr` and `mrs`, `king` and `queen`), and `mx` as `"n"`; an unmarked noun (`actor`, `pope`, `doctor`) records none. - **Files.** Each reading went to the file of every language whose names it occurs in, a Latin transliteration to its source language's file as #749 put the Latin `bin` in ar.toml (`swami` in hi.toml and bn.toml, the sheikh cluster in ar.toml, `cheikh` in fr.toml too). Six files are new: ak, et, id, ro, sw and vi. The few abbreviations shared across European languages (`dr`, `prof`) will go to `mul.toml` (done in part 2, the same day) with the rest of their kind; no salutation qualified, each language writing its own. - **The title keep-outs became exclusions**, in the file of the language whose reading they refuse, with their counts as name readings where counts were taken (malam, bay, shehu): `uv run python tools/vocab/query.py --excluded title`. The per-word counts in decisions/salutation-titles moved onto the `note` of each word's title reading, and the prose points at the query. The reasons the given-addressing comments gave for leaving `lord`, `lady`, `venerable`, `rabbi` and `imam` out of GIVEN_NAME_TITLES are notes on those words in und.toml until their kinds are assigned (they moved with them in part 2, the same day). - - **Recompute** rather than quoting: `uv run python tools/vocab/query.py --kind salutation --count`, `--kind title --file und --count` (the titles still unclassified; 0 since part 2, the same day), `--excluded title`. + - **Recompute** rather than quoting: `uv run python tools/vocab/query.py --kind salutation --count`, `--kind title --file und --count` (the titles still unclassified; 0 since part 2, the same day, which left one generic title in en.toml, `wm`), `--excluded title`. -- **2026-10-19 #750 — the rest of the titles classified (part 2 of #750).** No compiled set moves: `tools/vocab/build.py --check` reports the committed module current, and `tools/differential/snapshot.py` matches. The 644 titles still generic in `und.toml` on e943665e took their kinds and left for the files of the languages whose names they occur in, so `und.toml` holds no title. Part 1's hard cases are applied as decided there: `lord`, `lady`, `knight` and `chief` are `nobility`, `deputy` an `office`, and `dr` and `prof` are in mul.toml. +- **2026-10-19 #750 — the rest of the titles classified (part 2 of #750).** No compiled set moves: `tools/vocab/build.py --check` reports the committed module current, and `tools/differential/snapshot.py` matches. The 644 titles still generic in `und.toml` on e943665e took their kinds, all but `wm` (below), and left for the files of the languages whose names they occur in, so `und.toml` holds no title. Part 1's hard cases are applied as decided there: `lord`, `lady`, `knight` and `chief` are `nobility`, `deputy` an `office`, and `dr` and `prof` are in mul.toml. - **English holds most of them**: the bulk import's occupations, the US military ranks and their abbreviations, the offices, and the modifiers. `modifier` takes what is a title only inside a phrase: the qualifiers of ranks and offices (`vice`, `rear`, `petty`, `field`), the domain words of the descriptive titles (`baseball`, `software`, `tax`), the ordinals, and the court words of #9's list of judges' titles (`designated`, `docket`, `pro`, `edmi`). - **Address, not subject, decides `academic`.** Besides the doctors and professors of every script, it takes the English words used to address a professional (`advocate`, `attorney`, `engineer`, `nurse`, and `md` as the medical degree written before a name), the German abbreviations written before a name (`ra`, Rechtsanwalt; `wp`, Wirtschaftsprüfer; `pd` and `priv.-doz`; `dipl.-ing`), and the Devanagari `पंडित` and `पं`, a scholar's title, as part 1's refusal of the Latin `pandit` already keyed it. - - **`wm` keeps the generic kind**, in en.toml: it is William's abbreviation, made a title for #68 so that `Wm. Scott Magargee III` would not read given `Wm.`, and no title kind describes it. Removing it moves a parse (`Wm. Smith` reads title `Wm.` and no given name), so it is left to its own change. + - **`wm` keeps the generic kind**, in en.toml: it is William's abbreviation, made a title for #68 so that `Wm. Scott Magargee III` would not read given `Wm.`, and no title kind describes it. Removing it moves a parse, though only of the bare spelling: `Wm Smith` reads title `Wm` with the word listed and given `Wm` without it, while the period-abbreviation shape rule takes `Wm.` either way (measured 2026-10-19 with `Lexicon.default().remove(titles={'wm'})`). So it is left to its own change. - **mul.toml** takes `docent`, `doctor` and `professor` beside `dr` and `prof`: full words spelled alike in several European languages, listed once rather than in a file per language. - **A transliteration goes to its source language**, as in part 1: the Islamic titles to ar.toml (`imam`, `mufti`, `mahdi`, `murshid`, `hajji`, `vizier`), or to fa.toml where the Latin spelling is the Persian form (`ayatollah`, `akhoond`, `mullah`, `pir`); `rabbi` to he.toml and `rebbe` to yi.toml; `maharajah`, `maharani` and `subedar` to hi.toml; `giani` and `gyani` to pa.toml; `tsar` and `tsarina` to ru.toml; `effendi` to tr.toml; `vardapet` to hy.toml. The Buddhist, Jain and Zoroastrian titles (`arhat`, `bodhisattva`, `buddha`, `siddha`, `tirthankar`, `saoshyant`) are in en.toml: no source-language name is written with these Latin spellings, which are English loanwords. Four files are new: bin (Edo, `edohen` and `ekegbian`), ff (Fula, `lamido`), mi (Māori, `rangatira`) and yi. - **Gender** follows part 1's rule. The man's title of a noble pair is marked (`count`, `baron`, `graf`) as `king` is, and so is a `-man` word whose `-woman` pair the list holds (`businessman`); a descriptive noun beside its `-ess` form marks only the feminine (`actress`, `heiress`). `sultan` records none, Ottoman usage having given it to imperial women too (its note in tr.toml). diff --git a/nameparser/vocab/README.md b/nameparser/vocab/README.md index d2b77614..4ae825c0 100644 --- a/nameparser/vocab/README.md +++ b/nameparser/vocab/README.md @@ -95,7 +95,7 @@ The build checks the order and never rewrites a file, because a comment above an ## Kinds -A reading's key is its **kind**. The table lists the kinds in their canonical order, which is the [word order](#word-order)'s first key and `CATEGORY`'s order in `tools/vocab/build.py`. Each kind belongs to one **category**, and the category decides which compiled set the reading feeds. For title, suffix, particle and conjunction the category's own name is also a kind (`title = {}`: a title not yet classified), so classifying a word later is a data edit that moves no compiled set. The one exception: a generic `suffix = {}` classified as `credential` moves from `SUFFIX_WORDS` to `SUFFIX_ACRONYMS`, because a credential's `acronym` is true unwritten; write `acronym = false` to keep it where it was. The suffix and particle categories are classified (two particles of unrecorded origin, `bon` and `dí`, keep the generic kind in `und.toml`); so are the titles (#750); the others carry their generic kind. +A reading's key is its **kind**. The table lists the kinds in their canonical order, which is the [word order](#word-order)'s first key and `CATEGORY`'s order in `tools/vocab/build.py`. Each kind belongs to one **category**, and the category decides which compiled set the reading feeds. For title, suffix, particle and conjunction the category's own name is also a kind (`title = {}`: a title not yet classified), so classifying a word later is a data edit that moves no compiled set. The one exception: a generic `suffix = {}` classified as `credential` moves from `SUFFIX_WORDS` to `SUFFIX_ACRONYMS`, because a credential's `acronym` is true unwritten; write `acronym = false` to keep it where it was. The suffix and particle categories are classified (two particles of unrecorded origin, `bon` and `dí`, keep the generic kind in `und.toml`); so are the titles (#750), but for `wm`, William's abbreviation, which keeps the generic kind in `en.toml`; the others carry their generic kind. | Kind | Category | Compiled into | |---|---|---| diff --git a/nameparser/vocab/en.toml b/nameparser/vocab/en.toml index b6ae74c0..8a28f82e 100644 --- a/nameparser/vocab/en.toml +++ b/nameparser/vocab/en.toml @@ -2,7 +2,7 @@ schema = 1 [[word]] text = "wm" -title = { issue = 68, note = "William, abbreviated, and no title of any kind: added for #68, where 'Wm. Scott Magargee III' read first name 'Wm.', so 'Wm. Smith' reads title Wm. and no given name" } +title = { issue = 68, note = "William, abbreviated, and no title of any kind: added for #68, where 'Wm. Scott Magargee III' read first name 'Wm.'; a bare 'Wm Smith' reads title Wm and no given name, while the dotted 'Wm.' is taken by the leading period-abbreviation shape rule whether listed or not" } [[word]] text = "goodman" diff --git a/nameparser/vocab/hi.toml b/nameparser/vocab/hi.toml index 005d9c73..c8d2cfb8 100644 --- a/nameparser/vocab/hi.toml +++ b/nameparser/vocab/hi.toml @@ -66,7 +66,7 @@ excluded = { academic = { reason = "a common surname (Vijaya Lakshmi Pandit); th [[word]] text = "डा" -academic = { issue = 344, expands = "Dr., the डा. abbreviation (Nepali and older Hindi), matched through the edge-period normalization" } +academic = { issue = 344, expands = "Dr., the डा. abbreviation (Nepali and older Hindi)", note = "डा. matches through the edge-period normalization" } [[word]] text = "डॉ" diff --git a/nameparser/vocab/ne.toml b/nameparser/vocab/ne.toml index 43f0702c..b19ca7fc 100644 --- a/nameparser/vocab/ne.toml +++ b/nameparser/vocab/ne.toml @@ -2,7 +2,7 @@ schema = 1 [[word]] text = "डा" -academic = { issue = 344, expands = "Dr., the डा. abbreviation (Nepali and older Hindi), matched through the edge-period normalization" } +academic = { issue = 344, expands = "Dr., the डा. abbreviation (Nepali and older Hindi)" } [[word]] text = "जेआर" From 7760390f66a42529e9235db3d95873a3eb0f68e4 Mon Sep 17 00:00:00 2001 From: Derek Gulbranson Date: Mon, 19 Oct 2026 23:45:28 -0700 Subject: [PATCH 5/6] Say what part 1's recompute query counts now (#750) --kind title names the whole title category, so the und.toml query counts the titles left there, not the generic ones; no query isolates the generic kind, and wm is the one left, in en.toml. Co-Authored-By: Claude Opus 5.5 --- docs/design/decisions/vocabulary-model.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/design/decisions/vocabulary-model.md b/docs/design/decisions/vocabulary-model.md index 74454c9d..ba37c381 100644 --- a/docs/design/decisions/vocabulary-model.md +++ b/docs/design/decisions/vocabulary-model.md @@ -63,7 +63,7 @@ The vocabulary was a set of base sets plus marker subsets (`particles` and `part - **Gender only on a marked word** (decision 9): a feminine form or one half of a fixed pair (`mr` and `mrs`, `king` and `queen`), and `mx` as `"n"`; an unmarked noun (`actor`, `pope`, `doctor`) records none. - **Files.** Each reading went to the file of every language whose names it occurs in, a Latin transliteration to its source language's file as #749 put the Latin `bin` in ar.toml (`swami` in hi.toml and bn.toml, the sheikh cluster in ar.toml, `cheikh` in fr.toml too). Six files are new: ak, et, id, ro, sw and vi. The few abbreviations shared across European languages (`dr`, `prof`) will go to `mul.toml` (done in part 2, the same day) with the rest of their kind; no salutation qualified, each language writing its own. - **The title keep-outs became exclusions**, in the file of the language whose reading they refuse, with their counts as name readings where counts were taken (malam, bay, shehu): `uv run python tools/vocab/query.py --excluded title`. The per-word counts in decisions/salutation-titles moved onto the `note` of each word's title reading, and the prose points at the query. The reasons the given-addressing comments gave for leaving `lord`, `lady`, `venerable`, `rabbi` and `imam` out of GIVEN_NAME_TITLES are notes on those words in und.toml until their kinds are assigned (they moved with them in part 2, the same day). - - **Recompute** rather than quoting: `uv run python tools/vocab/query.py --kind salutation --count`, `--kind title --file und --count` (the titles still unclassified; 0 since part 2, the same day, which left one generic title in en.toml, `wm`), `--excluded title`. + - **Recompute** rather than quoting: `uv run python tools/vocab/query.py --kind salutation --count`, `--kind title --file und --count` (the titles still in `und.toml`, all of them generic until part 2 emptied it the same day, leaving one generic title, `wm`, in en.toml; `--kind title` names the whole category, so no query counts the generic kind alone), `--excluded title`. - **2026-10-19 #750 — the rest of the titles classified (part 2 of #750).** No compiled set moves: `tools/vocab/build.py --check` reports the committed module current, and `tools/differential/snapshot.py` matches. The 644 titles still generic in `und.toml` on e943665e took their kinds, all but `wm` (below), and left for the files of the languages whose names they occur in, so `und.toml` holds no title. Part 1's hard cases are applied as decided there: `lord`, `lady`, `knight` and `chief` are `nobility`, `deputy` an `office`, and `dr` and `prof` are in mul.toml. - **English holds most of them**: the bulk import's occupations, the US military ranks and their abbreviations, the offices, and the modifiers. `modifier` takes what is a title only inside a phrase: the qualifiers of ranks and offices (`vice`, `rear`, `petty`, `field`), the domain words of the descriptive titles (`baseball`, `software`, `tax`), the ordinals, and the court words of #9's list of judges' titles (`designated`, `docket`, `pro`, `edmi`). From 8051e3c877063e905e67fd2d82551f5599764404 Mon Sep 17 00:00:00 2001 From: Derek Gulbranson Date: Mon, 19 Oct 2026 23:48:37 -0700 Subject: [PATCH 6/6] Record the off-switch measurement lesson from #773's review A claim about what a vocabulary entry does is measured on the parse without it; wm's first note read it off the parse with the word listed, and rules/H2's shape rule shadows the dotted spelling. Co-Authored-By: Claude Opus 5.5 --- docs/design/mechanisms.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/design/mechanisms.md b/docs/design/mechanisms.md index c9426213..2531c420 100644 --- a/docs/design/mechanisms.md +++ b/docs/design/mechanisms.md @@ -408,6 +408,7 @@ print(len(MAIDEN_MARKERS), 'members ->', len(cls), 'structural classes')" - Release notes describe intent; TAGS are ground truth. Before trusting a changelog cross-reference about what shipped where, run `git diff -- ` — the "1.2.1 pickle shim" claim recurred twice from a changelog line describing a thing that never shipped. - Never pipe a check's output when its exit code matters. Under zsh, `snapshot.py | tail` makes `$?` tail's status. Redirect to a file and read the file. - Mutation-test a new guard before believing it, and mutate the thing the guard watches — a survivor usually means the fixture satisfies the invariant for free. A guard over a HAND COPY of a pipeline set has two such holes, and #744's review found both in one test of tools/vocab/build.py's check 2, which copies the tokenizer's sets because the tool cannot import the package it writes. Pinning a copy to its source sees only the classes someone copied: the first test pinned `DIVIDERS` alone, and emoji, which the tokenizer strips under `Policy.strip_emoji`, had no copy and no check, so `dr★` compiled and the test passed. Its replacement swept every codepoint `_tokenize._ignorable` drops but accepted any refusal short of a TOML error, so the space in `dr x` passed because the phrase-title check refused it, and a class check 2 never learned would pass too wherever a later check happened to refuse its test text. Drive the sweep from the pipeline's own predicate, match the refusal by the checked rule's own messages, and record the control (hiding the emoji check behind its pinned constant fails the sweep: `test_every_character_the_tokenizer_ignores_is_refused` in tests/v2/test_vocab.py, which now leaves the space out, a phrase's word separator). The predicate reaches only what it decides, though: the interpunct between East Asian characters (rules/T3) is divided by context in `_tokenize_region`, never by `_ignorable`, so hiding that check passes the sweep (measured in #746's review, 2026-10-19). What holds it is its `MUTATIONS` row (`text-with-an-east-asian-interpunct`, input `先·生`); the `EAST_ASIAN_RANGES` and `INTERPUNCT` pins hold only the copies, and stay green with the check gone. Name such a class where the guard stands, and the test that holds it, rather than let the sweep imply it. +- A claim about what a vocabulary entry DOES is a claim about the parse WITHOUT it, so take that parse (`Parser(lexicon=Lexicon.default().remove(titles={...}))`) and compare: the parse with the entry present shows only that the output is consistent with it. #773's first note on `wm` said that removing it would move `Wm. Smith`, read off the parse with the word listed; with the word removed, `Wm. Smith` reads exactly as before, rules/H2's leading-abbreviation title claiming `Wm.` either way, and only the bare `Wm Smith` moves (title `Wm` listed, given `Wm` removed). A shape rule can shadow an entry in one spelling and leave it load-bearing in another, so take the off-switch parse for each spelling, bare and period-marked. - Verify the restore, not just the mutation: diff against the pre-mutation copy; do not trust the harness's own restore report. - Run all the gates, not the ones you remember: ruff runs before mypy and pytest in CI, and each has caught what the others passed. - Purge __pycache__ between same-length source mutations; stale bytecode makes a changed file measure as unchanged.