@finbheara/names 0.17.0 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{index-ye6j60jn.js → index-17zzg7f3.js} +5 -5
- package/dist/chunks/{index-ye6j60jn.js.map → index-17zzg7f3.js.map} +2 -2
- package/dist/chunks/index-18z8akw8.js +42 -0
- package/dist/chunks/{index-tqdbxd92.js.map → index-18z8akw8.js.map} +3 -3
- package/dist/chunks/{index-ky754nsf.js → index-7j32khen.js} +9 -7
- package/dist/chunks/{index-ky754nsf.js.map → index-7j32khen.js.map} +4 -4
- package/dist/chunks/{index-tk01chxw.js → index-gxw36cg3.js} +27 -16
- package/dist/chunks/{index-tk01chxw.js.map → index-gxw36cg3.js.map} +2 -2
- package/dist/chunks/{index-n6fpj92s.js → index-xtwbdzy1.js} +10 -10
- package/dist/chunks/{index-n6fpj92s.js.map → index-xtwbdzy1.js.map} +2 -2
- package/dist/chunks/{phrase-2hj26asc.js → phrase-hze7av6y.js} +3 -3
- package/dist/classifier/index.js +2 -2
- package/dist/cli/census.js +3 -3
- package/dist/index.js +18 -6
- package/dist/index.js.map +1 -1
- package/dist/measure/index.js +2 -2
- package/dist/normalize/index.js +16 -4
- package/dist/normalize/index.js.map +1 -1
- package/dist/types/classifier/features.d.ts +2 -2
- package/dist/types/lexicon/place.d.ts +16 -0
- package/dist/types/normalize/index.d.ts +2 -2
- package/package.json +1 -1
- package/dist/chunks/index-tqdbxd92.js +0 -27
- /package/dist/chunks/{phrase-2hj26asc.js.map → phrase-hze7av6y.js.map} +0 -0
|
@@ -9,16 +9,16 @@
|
|
|
9
9
|
"/**\n * Shared constants for name classification\n *\n * These are used by both the classifier (for features) and can be\n * imported by consumers for consistency.\n */\n\nimport { UNMISTAKABLE_PARTICLES } from \"../particles/particle-vocabulary.ts\";\n\n/**\n * Name connectors (particles) that appear in multi-word names.\n * e.g., \"Maria de la Cruz\", \"Starard van Beethoven\"\n *\n * THE SET IS NOT HERE. `CONNECTORS` was one of eleven hand-written particle\n * lists, and the owner ruled one vocabulary with one owner for all of them.\n * `./particle-vocabulary.ts` is that owner.\n *\n * THIS FEATURE DERIVES `UNMISTAKABLE_PARTICLES`, and states why: `isConnector`\n * scores a bare whitespace token, so `d` and `l` are excluded — those are middle\n * initials in every row that prints them, and `isInitial` is already a feature\n * of its own. It cannot use the `standalone` subset instead, because that flag\n * is measured over one results corpus and this classifier scores strings from outside\n * the corpus.\n *\n * WHAT THIS COST, MEASURED. The hand-written list held eleven tokens and missed\n * every Irish patronymic, so `mac`, `mc`, `o`, `ni`, `nic` and `ui` scored as\n * ordinary words. `al` is the one token the hand-written list carried that the\n * vocabulary does not: it is an Arabic particle, and the document's partition\n * enumerates no Arabic tradition, so it is kept here by name rather than\n * legislated into the vocabulary.\n */\nexport const CONNECTORS: ReadonlySet<string> = new Set([...UNMISTAKABLE_PARTICLES, \"al\"]);\n\n/**\n * High-frequency school indicator words for CLASSIFICATION (person vs school).\n * These are STRONG positive indicators - if present, almost certainly a school.\n *\n * NOTE: For school RESOLUTION (which school), these are low-signal \"fluff\".\n *\n * Frequency in schools.txt (647 schools):\n * academy: 133 (20.6%) school: 44 (6.8%) dance: 42 (6.5%)\n * irish: 38 (5.9%) rince: 15 (2.3%) dancers: 10 (1.5%)\n * celtic: 8 (1.2%) studio: 6 (0.9%) scoil: 5 (0.8%)\n */\nexport const SCHOOL_KEYWORDS = new Set([\n\t\"academy\",\n\t\"school\",\n\t\"institute\",\n\t\"center\",\n\t\"centre\",\n\t\"studio\",\n\t\"company\",\n\t\"university\",\n\t\"college\",\n\t\"dance\",\n\t\"dancing\",\n\t\"dancers\",\n\t\"irish\",\n\t\"traditional\",\n\t\"scoil\",\n\t\"rince\",\n\t\"celtic\",\n\t\"clann\",\n\t\"s.r.\",\n\t\"sr\",\n\t\"scoil-rince\", // Abbreviations for Scoil Rince\n\t\"acadamy\",\n\t\"acadmey\",\n\t\"accademy\", // Common typos\n]);\n",
|
|
10
10
|
"/**\n * Tokenization for segmentation model\n *\n * Splits on whitespace while preserving hyphen/apostrophe as internal characters.\n * Normalizes for lookup while preserving original for surface features.\n */\n\nimport { splitWords } from \"../../lexicon/place.ts\";\nimport { CONNECTORS } from \"../constants.ts\";\n\nexport { splitWords };\n\n/**\n * Stopwords that appear in multi-part names — every name particle, plus the\n * joining words a SCHOOL name uses.\n *\n * THE PARTICLE HALF IS NOT HERE. This set was one of eleven hand-written\n * particle lists, and the owner ruled one vocabulary with one owner for all of\n * them.\n * It reaches that owner through `CONNECTORS`, which derives `UNMISTAKABLE_PARTICLES`\n * and states why there; writing the filter twice is how the two would drift\n * apart again.\n *\n * THE SECOND HALF IS NOT PARTICLES AND STAYS. `and`, `&`, `the`, `of` join the\n * words of a school name (\"Scoil Rince of the West\"), not of a personal name,\n * so the vocabulary is the wrong owner for them. `bin` and `ibn` assert descent\n * in a tradition `docs/NAME-NORMALIZATION.md` § *The vocabularies* does not\n * enumerate; adding a tradition is a change to that document, not to this file.\n *\n * THE TWO SETS ARE ONE SEGMENTATION FEATURE and the model does not distinguish\n * them — `isStopword` is one bit either way. Keeping them separate here is what\n * makes the particle half derivable at all.\n */\nconst SCHOOL_JOINERS = [\"and\", \"&\", \"the\", \"of\"];\nconst UNENUMERATED_PATRONYMICS = [\"bin\", \"ibn\"];\nconst STOPWORDS = new Set([...CONNECTORS, ...SCHOOL_JOINERS, ...UNENUMERATED_PATRONYMICS]);\n\n/** School concept words */\nexport const CONCEPT_WORDS = new Set([\n\t\"academy\",\n\t\"school\",\n\t\"studio\",\n\t\"dance\",\n\t\"dancing\",\n\t\"celtic\",\n\t\"irish\",\n\t\"ireland\",\n\t\"university\",\n\t\"college\",\n\t\"institute\",\n\t\"clann\",\n\t\"clan\",\n\t\"scoil\",\n\t\"rince\",\n\t\"feis\",\n\t\"ceili\",\n\t\"ceilí\",\n\t\"arts\",\n\t\"center\",\n\t\"centre\",\n\t\"performing\",\n\t\"foundation\",\n]);\n\n/**\n * Normalize a token for lookup\n * - Lowercase\n * - Remove diacritics\n * - Remove apostrophes (O'Brien -> obrien)\n */\nexport function normalize(s: string): string {\n\treturn s\n\t\t.toLowerCase()\n\t\t.normalize(\"NFD\")\n\t\t.replace(/[\\u0300-\\u036f]/g, \"\")\n\t\t.replace(/['']/g, \"\");\n}\n\n/**\n * Tokenize a name string\n * - Split into printed words (`splitWords`)\n * - Preserve hyphens and apostrophes within tokens\n */\nexport function tokenize(s: string): string[] {\n\tif (!s) return [];\n\treturn splitWords(s).map((t) => t.replace(/^[,;.]+|[,;.]+$/g, \"\")); // Strip leading/trailing punctuation\n}\n\n/**\n * Check if token is a stopword (name particle)\n */\nexport function isStopword(token: string): boolean {\n\treturn STOPWORDS.has(normalize(token));\n}\n\n/**\n * Check if token is a school concept word\n */\nexport function isConceptWord(token: string): boolean {\n\treturn CONCEPT_WORDS.has(normalize(token));\n}\n\n/**\n * Check if token is an initial (single letter or X.)\n */\nexport function isInitial(token: string): boolean {\n\treturn /^[A-Za-z]\\.?$/.test(token);\n}\n\n/**\n * Check if token is title case (First char upper, rest lower)\n */\nexport function isTitleCase(token: string): boolean {\n\tif (token.length < 2) return false;\n\treturn /^[A-Z][a-z]+$/.test(token.replace(/[''.-]/g, \"\"));\n}\n\n/**\n * Check if token is all caps\n */\nexport function isAllCaps(token: string): boolean {\n\tconst letters = token.replace(/[^A-Za-z]/g, \"\");\n\treturn letters.length > 0 && letters === letters.toUpperCase();\n}\n\n/**\n * Check if token is all lowercase\n */\nexport function isLowerCase(token: string): boolean {\n\tconst letters = token.replace(/[^A-Za-z]/g, \"\");\n\treturn letters.length > 0 && letters === letters.toLowerCase();\n}\n\n/**\n * Create a combined token sequence from person + school names\n */\nexport function combineForTraining(\n\tdancerName: string,\n\tschoolName: string,\n): { tokens: string[]; personEnd: number; schoolEnd: number } {\n\tconst personTokens = tokenize(dancerName);\n\tconst schoolTokens = tokenize(schoolName);\n\n\treturn {\n\t\ttokens: [...personTokens, ...schoolTokens],\n\t\tpersonEnd: personTokens.length,\n\t\tschoolEnd: personTokens.length + schoolTokens.length,\n\t};\n}\n",
|
|
11
11
|
"/**\n * Trained weights for name classifier v4 (with boundary detection).\n * Trained by `training/train-phrase.ts --fit all` on corpus-v3.0.0-188, solo competitions,\n * seed 1, generated 2026-10-02T00:05:22.763Z. Category examples 153301,\n * boundary examples 462360. Never edited by hand: retrain to change.\n */\n\nexport const FEATURE_NAMES = [\n\t\"bf_pos0_firstname\",\n\t\"bf_pos0_surname\",\n\t\"bf_pos0_irish_surname\",\n\t\"bf_pos0_location\",\n\t\"bf_pos0_school\",\n\t\"bf_pos0_unknown\",\n\t\"bf_pos1_firstname\",\n\t\"bf_pos1_surname\",\n\t\"bf_pos1_location\",\n\t\"bf_last_firstname\",\n\t\"bf_last_surname\",\n\t\"bf_last_irish_surname\",\n\t\"bf_last_location\",\n\t\"bf_last_school\",\n\t\"bf_last_unknown\",\n\t\"bf_firstname_surname_pattern\",\n\t\"bf_surname_firstname_pattern\",\n\t\"bf_has_firstname\",\n\t\"bf_has_surname\",\n\t\"bf_has_irish_surname\",\n\t\"bf_has_location\",\n\t\"bf_has_school_token\",\n\t\"bf_firstname_count\",\n\t\"bf_surname_count\",\n\t\"bf_location_count\",\n\t\"bf_school_score_sum\",\n\t\"bf_school_score_max\",\n\t\"bf_all_surnames\",\n\t\"bf_all_school_tokens\",\n\t\"bf_surname_chain\",\n\t\"bf_has_location_bigram\",\n\t\"bf_location_bigram_length\",\n\t\"lut_pos0_firstname\",\n\t\"lut_pos0_surname_only\",\n\t\"lut_pos0_school\",\n\t\"lut_pos0_geo\",\n\t\"lut_pos0_unknown\",\n\t\"lut_last_firstname\",\n\t\"lut_last_surname_only\",\n\t\"lut_last_school\",\n\t\"lut_last_geo\",\n\t\"lut_last_unknown\",\n\t\"lut_has_firstname\",\n\t\"lut_has_surname\",\n\t\"lut_has_school\",\n\t\"lut_has_geo\",\n\t\"lut_all_surname_or_school\",\n\t\"lut_all_school\",\n\t\"lut_firstname_count\",\n\t\"lut_surname_count\",\n\t\"word_count_1\",\n\t\"word_count_2\",\n\t\"word_count_3\",\n\t\"word_count_4\",\n\t\"word_count_5\",\n\t\"word_count_6plus\",\n\t\"has_parenthetical\",\n\t\"has_connector\",\n\t\"has_apostrophe\",\n\t\"has_school_ngram\",\n\t\"school_ngram_length\",\n\t\"has_academy_kw\",\n\t\"prefix_firstname_surname\",\n\t\"prefix_surname_surname\",\n\t\"prefix_surname_firstname\",\n\t\"all_tokens_person_like\",\n\t\"all_tokens_bf_person\",\n\t\"suffix_is_surname\",\n\t\"suffix_is_school_kw\",\n\t\"suffix_is_location\",\n\t\"tokens_after_pos2\",\n\t\"has_school_kw_after_pos2\",\n\t\"has_location_after_pos2\",\n] as const;\n\nexport const weights = {\n \"person\": {\n \"weights\": [\n -0.6112336724158413,\n -0.42113547589695083,\n -0.381349194354269,\n 0.17824548211792524,\n -1.0698741877777174,\n 0.7514004225316695,\n -0.2304012831053301,\n 0.025654105544097316,\n -0.48263481621549303,\n -0.40468759600814463,\n -0.05324268900341806,\n -0.6763391035969885,\n 0.24970625669424143,\n -0.39186631319983484,\n 0.6421468771849265,\n 0.217703954873147,\n -0.22026834201263368,\n 1.9399897652686446,\n 0.42844600622901224,\n 0.6181770704130128,\n 0.3155372827693072,\n -0.3197449308006452,\n 1.2066122581078622,\n 0.12363463226159546,\n -0.2510926666063162,\n 0.49992729368654304,\n -0.6288678550236712,\n -0.24467201838214295,\n 0.10604331167754756,\n 0.8598636157947174,\n 0.09526105565656097,\n -0.04232672708002049,\n -0.6207854992271944,\n -0.023138866339507395,\n -1.0673428268644067,\n -2.154606427985159,\n -0.7994336565644093,\n 0.9165055631057475,\n 1.017370368223158,\n -0.8838122459287312,\n -3.682525012340939,\n 0.8937697231488002,\n 1.5861223168558722,\n 1.1542424694485274,\n -0.2942946067300229,\n 0.48175609449621665,\n 0.7393798550139582,\n -0.9810995850188937,\n 1.863572761007552,\n 0.10185173618889827,\n -2.7323540899445478,\n 1.7254073293656165,\n 0.2384190450749743,\n -1.4422916939847117,\n 0.19617274094624138,\n 0.26692073336917177,\n -0.35599790633815326,\n 1.125940604961518,\n -0.9213974546283615,\n 6.106031075930575,\n -5.510721184490145,\n -3.176432613882549,\n 0.2517547082831132,\n -0.2756337480012139,\n -0.18970223802336916,\n -1.4227639764535265,\n 1.144553090316706,\n -0.05815295998956505,\n -2.362971602923758,\n 0.2749214970060496,\n -0.7037058667229663,\n -0.6210211249532173,\n -0.3121324817966726\n ],\n \"bias\": -1.7820326391233978\n },\n \"school\": {\n \"weights\": [\n -0.14242313829367712,\n 0.011089099741492046,\n -0.05724984516248611,\n 0.7461455772821994,\n 0.4515090644683929,\n -1.4811088862301753,\n 0.12104975470475243,\n -0.30775840162532553,\n 0.15181760111567977,\n 1.184559131801758,\n -0.2247840362011196,\n 0.6099319714921375,\n 0.46962712274149393,\n -0.5614922227199818,\n -0.187101329963359,\n 0.08128353774185997,\n -0.31981502751322094,\n -1.3999840727134318,\n -1.0142253060319257,\n 0.09145082518743211,\n -0.5033056765722672,\n 0.17781756454056163,\n -0.6535885465794181,\n 0.6887853813950847,\n -0.670617901883327,\n 0.760878309446622,\n 0.3453983340192854,\n 0.5837680306613927,\n -0.27785431670864436,\n -0.42084209636682857,\n 0.44717406043204133,\n -0.4358646189342689,\n 0.9501952551267173,\n 0.7584611849573518,\n 1.2717422758581391,\n -4.462287541259553,\n 1.092217754507797,\n -1.0503162294711668,\n -0.5993524289361202,\n 0.8233769378363408,\n -0.11486565185296896,\n 0.41965983258056555,\n -1.323299742755546,\n -1.2545825499792065,\n 0.6378469689186973,\n 2.796933505173397,\n -0.7317348556536989,\n 0.8645750264259233,\n -0.7991718379624354,\n 0.6173596963156321,\n 2.072862570966647,\n -2.087159184905027,\n -1.5391757121960736,\n 0.5556901412647429,\n 0.035091991261994936,\n 0.04015199266921746,\n 0.6820500518445635,\n 0.3319587772897134,\n 0.9350875657412961,\n -4.138036807600265,\n 4.888010533014557,\n 3.9741685884985585,\n 0.029396960186866977,\n -0.15606264333309466,\n -0.34724461621107666,\n 0.6153940182809924,\n -1.3197437893558055,\n -0.20355614813666803,\n 2.5129145207498667,\n 0.4581090154101259,\n -0.5171868976729882,\n 0.7930184643825646,\n -1.3454411574873375\n ],\n \"bias\": -1.0664230298349566\n },\n \"location\": {\n \"weights\": [\n 0.5273566762435277,\n 0.7751600567689855,\n -0.2915232998441614,\n 0.5811733069302208,\n -0.9802180853490376,\n 1.4947787081482025,\n -0.5893108235205712,\n -0.03785887962115832,\n 0.11172227259778934,\n -0.5445694831393606,\n -0.029915700247579106,\n -0.8771953036719516,\n -0.14501163852880364,\n 0.3985226746529118,\n -0.4784860381840705,\n -1.151633493524039,\n 0.43617477084955264,\n -1.024694073428206,\n -0.2328755918881764,\n -1.2228112506771813,\n -0.2528721165604776,\n 0.20213199790089273,\n -0.26641392039260686,\n 0.9905157042903207,\n -0.20610623660049412,\n -1.4196011584481045,\n -0.04124679014319425,\n -0.7087420344220559,\n -1.1375660739743472,\n -0.5733339746948014,\n 0.6865112589926574,\n 0.6341284609501776,\n -0.6283651236665803,\n -1.0529102281801497,\n -1.722322396106415,\n 4.40623110723813,\n 1.0271195391152128,\n -1.35280318958855,\n -0.08033683057220396,\n 0.5288034097091396,\n 3.3500329504743216,\n -1.6912220238072924,\n -1.6633589007587601,\n -0.800536212637553,\n -0.537635271610603,\n 0.03534988999720812,\n 0.17173179352988438,\n -0.18768562656253354,\n -1.7784594523834218,\n -0.8585346438841036,\n 0.6805004474572487,\n -1.7755131976546161,\n -0.16662183508358125,\n 0.11672013115289323,\n -0.061249210261448035,\n 0.03194506902183965,\n -0.26338019787586875,\n -0.5185074594370266,\n -0.7690414207190391,\n -0.014899643207394045,\n -1.1977722062525282,\n -1.1298572015608785,\n -1.079419982913896,\n 0.18165115181467564,\n 0.442512272982646,\n -0.9849639873636495,\n -0.3814002321585536,\n -0.022393367369722802,\n -0.6316140884979266,\n -0.1545792440233266,\n 0.2994235326087804,\n -0.40471027006048493,\n 0.11066129291287184\n ],\n \"bias\": -1.1607932581004352\n },\n \"onlyPerson\": {\n \"weights\": [\n 0.3035718181691276,\n -0.029808395374272705,\n -0.04182346630002349,\n -0.29483189324219267,\n -0.8287917719564764,\n 0.7259529767998817,\n 0.4895326397966464,\n -0.8002632139464882,\n -0.4081662992190748,\n -0.21078539552617628,\n 0.8098360778834506,\n 0.3794805045708056,\n 0.33632627191163905,\n -3.931607817383289,\n 0.6688991950668227,\n 0.02137542869768342,\n -0.020508228201926215,\n 2.234535196295891,\n 0.7859056471347639,\n -0.02599832389866141,\n -0.001231608335776933,\n 0.6602048344708119,\n 0.501143213705879,\n -0.33072282848976076,\n 0.30252364311062513,\n -0.31864582738835706,\n -0.32663534547690876,\n -0.2853624284436133,\n 2.019272534866535,\n -0.12140981794006188,\n -0.4287380242867223,\n 0.17333167149033604,\n -0.5970771141818076,\n 0.7807939107830716,\n -0.6704062238518748,\n -3.1941690769331528,\n -0.10137278914451499,\n 1.912680725371697,\n 2.0121031645532477,\n -0.9712591473653486,\n -6.156526990428295,\n -0.11045142588930479,\n 1.2695541313460623,\n 1.5919985798791305,\n -0.2214406081887326,\n 1.625550288429504,\n 1.166507342676067,\n -1.7255701016909084,\n 1.171441603383974,\n -1.735301698428343,\n -2.7026446759165004,\n 2.852427199310492,\n -1.4275568676825328,\n -1.2122488234470383,\n -0.7797064035415977,\n 0.7923427165218895,\n -0.7801169487368054,\n 2.7060216437639797,\n -0.5294584520234914,\n 3.9611466859650517,\n -4.389618188380304,\n -2.6226311430659712,\n 0.004375211567240973,\n 0.8080026577171774,\n 0.010497537901094317,\n -0.2027444572764276,\n 1.0310578996834123,\n 0.765184953210488,\n -1.4851748875105137,\n 0.26721315543297347,\n -2.1861054129974367,\n -0.254916889758511,\n -0.8004008160529222\n ],\n \"bias\": -2.3134378597680554\n },\n \"personConcat\": {\n \"weights\": [\n 0.07887712655083576,\n 1.127031473596521,\n -0.010880969940137129,\n 0.86802466832314,\n -1.710034172337037,\n 0.5503957263825928,\n -1.3976117670113455,\n 1.023446112464517,\n 0.25940029566808925,\n -1.4671784239664238,\n -0.17981326766553585,\n -0.08909646856028745,\n 0.43805066771116313,\n 2.7936585750716536,\n 0.15742994523507667,\n 0.09542566242727114,\n 0.1875540307831474,\n 0.3044486972130043,\n -0.5815134865327877,\n -0.2382331545653873,\n -0.2536463965928169,\n 2.528836098080279,\n 1.009413944185225,\n -0.29807612531701155,\n -0.6474942229132604,\n 0.2542962989336769,\n -2.137137340664946,\n -0.13289082707115263,\n 0.6844743361564071,\n -0.3653775150274598,\n -0.13490322105443783,\n 0.2557984261696267,\n -1.823734213920561,\n -1.6457529614106323,\n -1.5549990553129136,\n -0.7110829931200648,\n 0.2905997285206375,\n -1.0178139503932806,\n -1.455604964681524,\n 0.5573840729837877,\n -1.4630440528509032,\n 0.7865526276522007,\n 3.6240515351878084,\n -0.22487585052597872,\n 0.7306904955982093,\n 0.47930906909096704,\n 0.05808956002915409,\n -2.057088065270145,\n -0.09344495385651093,\n 1.9774110055955596,\n -4.173411013593005,\n -8.013386083130055,\n -0.4652531961639981,\n 1.9199056168843311,\n 1.7732350379593589,\n 2.088918199226959,\n 0.4747156134083946,\n -1.620028611618029,\n -0.08262814793671235,\n 3.7736648036749108,\n -1.1902569981956446,\n -4.916882393769631,\n 0.08677183893142339,\n -0.6089335589747863,\n 0.14880705195166657,\n -1.302794533276272,\n -0.36247090045407904,\n -0.23913566160720004,\n -1.9355956713800084,\n 0.4554734038213429,\n 1.3791313681800512,\n 3.7153941618148902,\n -0.2845505158589555\n ],\n \"bias\": -6.838917915610676\n }\n} as const;\n",
|
|
12
|
-
"/**\n * The phrase classifier's features: the one definition the runtime classifier\n * (`library-v4.ts`) and the trainers both run. Internal: not re-exported from any\n * entry point, so it can change with the weights it was trained for.\n *\n * `FEATURE_NAMES` stays in the weights file it was generated with; a weights\n * object is valid for this code only when its vectors are that long.\n */\n\nimport { lookupKey } from \"../lexicon/keys.ts\";\nimport { FIELD_END, isPlacePhrase } from \"../lexicon/place.ts\";\nimport { isFirstName, isIrishSurname, isSurname } from \"./bf/filters.ts\";\nimport { isLocation } from \"./bf/locations.ts\";\nimport { findSchoolNgrams, isSchool, schoolScore } from \"./bf/schools.ts\";\nimport { isUSLocation } from \"./bf/us-locations.ts\";\nimport { CONNECTORS, SCHOOL_KEYWORDS } from \"./constants.ts\";\nimport { splitWords } from \"./seg/tokenize.ts\";\nimport { FEATURE_NAMES } from \"./weights-v4.ts\";\n\nexport { FEATURE_NAMES, isPlacePhrase };\n\n/** The three phrase categories, as the weights and the exact-match short-circuit name them. */\nexport interface CategoryScores {\n\tperson: number;\n\tschool: number;\n\tlocation: number;\n}\n\n/**\n * Exact-match short-circuit: if the entire phrase is in names.txt with clear flags,\n * the runtime returns that classification without running the regression. A trainer\n * uses it to know which phrases the regression never sees.\n */\nexport function exactMatch(\n\tphrase: string,\n\tgetFlags: (name: string) => string | null,\n): CategoryScores | null {\n\tconst flags = getFlags(phrase);\n\tif (!flags) return null;\n\n\t// T = school (Training school)\n\tif (flags.includes(\"T\")) {\n\t\treturn { person: 0, school: 1, location: 0 };\n\t}\n\t// G = geographic location\n\tif (flags.includes(\"G\")) {\n\t\treturn { person: 0, school: 0, location: 1 };\n\t}\n\t// F/M/N/L = person names (only if no T or G)\n\tif (/[FMNL]/.test(flags) && !flags.includes(\"T\") && !flags.includes(\"G\")) {\n\t\treturn { person: 1, school: 0, location: 0 };\n\t}\n\n\treturn null;\n}\n\n// =============================================================================\n// Tokenization (with bigram collapsing)\n// =============================================================================\n\nfunction tokenizeSimple(phrase: string): string[] {\n\treturn splitWords(phrase.replace(/\\([^)]*\\)/g, \" \"));\n}\n\n/**\n * A printed word as `matchBigramContinuations` spells it (`Rí` -> `ri`), or\n * `null` for a word that ends a field (`FIELD_END`): `Aaron Quarrie, London`\n * is not `Aaron Quarrie`.\n */\nfunction continuationKey(word: string): string | null {\n\treturn FIELD_END.test(word) ? null : lookupKey(word);\n}\n\n/**\n * The phrase's comma-separated parts: its printed words, cut after each word that\n * ends with a comma (which is dropped). A school name found in the phrase lies within\n * one part: `Mid Atlantic Region, USA` is two, and no school name spans them.\n *\n * The comma only, not `FIELD_END`'s hyphen: the school table holds printed school\n * cells such as `Dance- Academy` whole, and that cell is one school.\n */\nfunction commaParts(phrase: string): string[] {\n\tconst out: string[][] = [[]];\n\tfor (const word of splitWords(phrase)) {\n\t\tconst bare = word.replace(/,+$/, \"\");\n\t\tif (bare) out[out.length - 1]!.push(bare);\n\t\tif (bare !== word) out.push([]);\n\t}\n\treturn out.filter((f) => f.length > 0).map((f) => f.join(\" \"));\n}\n\n/**\n * The phrase's tokens as the classifier reads them: its words, with each run the\n * lexicon holds as a multi-word entry (`Ard Ri`, `Mc Laughlin`) collapsed into one\n * token. `names stat -v` prints these, so what it shows is what the features see.\n */\nexport function tokenize(\n\tphrase: string,\n\tmatchBigramContinuations?: (word: string) => string[][] | null,\n): string[] {\n\tconst rawTokens = tokenizeSimple(phrase);\n\tif (!matchBigramContinuations || rawTokens.length < 2) return rawTokens;\n\n\tconst result: string[] = [];\n\tlet i = 0;\n\n\twhile (i < rawTokens.length) {\n\t\tconst word = rawTokens[i]!;\n\t\t// A word that ends a field ends any phrase it would start, too: `SOUTHERN, USA` is not `Southern USA`.\n\t\tconst continuations = FIELD_END.test(word) ? null : matchBigramContinuations(word);\n\n\t\tif (continuations && i + 1 < rawTokens.length) {\n\t\t\tlet matched = false;\n\t\t\tfor (const cont of continuations) {\n\t\t\t\tif (i + cont.length < rawTokens.length) {\n\t\t\t\t\tlet matches = true;\n\t\t\t\t\tfor (let j = 0; j < cont.length; j++) {\n\t\t\t\t\t\tif (continuationKey(rawTokens[i + 1 + j]!) !== cont[j]) {\n\t\t\t\t\t\t\tmatches = false;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (matches) {\n\t\t\t\t\t\tconst bigram = [word, ...rawTokens.slice(i + 1, i + 1 + cont.length)].join(\" \");\n\t\t\t\t\t\tresult.push(bigram);\n\t\t\t\t\t\ti += 1 + cont.length;\n\t\t\t\t\t\tmatched = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!matched) {\n\t\t\t\tresult.push(word);\n\t\t\t\ti++;\n\t\t\t}\n\t\t} else {\n\t\t\tresult.push(word);\n\t\t\ti++;\n\t\t}\n\t}\n\n\treturn result;\n}\n\nfunction hasParenthetical(phrase: string): boolean {\n\treturn /\\([^)]+\\)/.test(phrase);\n}\n\n// =============================================================================\n// Token Analysis (Combined BF + LUT)\n// =============================================================================\n\ninterface TokenInfo {\n\tword: string;\n\t// Bloom filter signals\n\tbf_isFirstName: boolean;\n\tbf_isSurname: boolean;\n\tbf_isIrishSurname: boolean;\n\tbf_isLocation: boolean;\n\tbf_isSchool: boolean;\n\tbf_schoolScore: number;\n\tbf_isUnknown: boolean;\n\t// names.txt signals (LUT)\n\tlut_hasFirstname: boolean;\n\tlut_hasSurname: boolean;\n\tlut_hasSchool: boolean;\n\tlut_hasGeo: boolean;\n\tlut_isUnknown: boolean;\n\tisConnector: boolean;\n}\n\nfunction analyzeToken(word: string, getFlags: (name: string) => string | null): TokenInfo {\n\t// names.txt lookups\n\tconst flags = getFlags(word) ?? \"\";\n\n\t// Bloom filter lookups. A word that ends a field asks without its `,`/`-`, as `getFlags`\n\t// does (`Victoria,` is `Victoria`). A token the tokenizer merged from a split spelling\n\t// (\"Mc Laughlin\", \"Mary Kate\") asks the filters its joined form, as the tables hold it;\n\t// a B phrase is asked as is.\n\tconst bare = word.replace(FIELD_END, \"\");\n\tconst bw = bare.includes(\" \") && !flags.includes(\"B\") ? bare.replace(/\\s+/g, \"\") : bare;\n\tconst bf_firstName = isFirstName(bw);\n\tconst bf_surname = isSurname(bw);\n\tconst bf_irishSurname = isIrishSurname(bw);\n\tconst bf_location = isLocation(bw) || isUSLocation(bw);\n\tconst bf_school = isSchool(bw);\n\tconst bf_score = schoolScore(bw);\n\tconst lut_isKnown = flags !== \"\";\n\n\treturn {\n\t\tword,\n\t\tbf_isFirstName: bf_firstName,\n\t\tbf_isSurname: bf_surname,\n\t\tbf_isIrishSurname: bf_irishSurname,\n\t\tbf_isLocation: bf_location,\n\t\tbf_isSchool: bf_school,\n\t\tbf_schoolScore: bf_score,\n\t\tbf_isUnknown: !bf_firstName && !bf_surname && !bf_location && !bf_school,\n\t\tlut_hasFirstname: /[FMN]/.test(flags),\n\t\tlut_hasSurname: flags.includes(\"L\"),\n\t\tlut_hasSchool: flags.includes(\"T\"),\n\t\tlut_hasGeo: flags.includes(\"G\"),\n\t\tlut_isUnknown: !lut_isKnown,\n\t\tisConnector: CONNECTORS.has(word.toLowerCase()),\n\t};\n}\n\n// =============================================================================\n// Feature Extraction (v4: Combined BF + LUT + Boundary)\n// =============================================================================\n\nexport function extractFeatures(\n\tphrase: string,\n\tgetFlags: (name: string) => string | null,\n\tmatchBigramContinuations?: (word: string) => string[][] | null,\n): number[] {\n\tconst tokens = tokenize(phrase, matchBigramContinuations);\n\tif (tokens.length === 0) {\n\t\treturn new Array(FEATURE_NAMES.length).fill(0);\n\t}\n\n\tconst infos = tokens.map((t) => analyzeToken(t, getFlags));\n\tconst first = infos[0]!;\n\tconst second = infos.length > 1 ? infos[1] : null;\n\tconst last = infos[infos.length - 1]!;\n\n\t// === BLOOM FILTER AGGREGATES ===\n\tlet bf_firstNameCount = 0;\n\tlet bf_surnameCount = 0;\n\tlet bf_locationCount = 0;\n\tlet bf_schoolScoreSum = 0;\n\tlet bf_schoolScoreMax = 0;\n\n\tfor (const info of infos) {\n\t\tif (info.bf_isFirstName) bf_firstNameCount++;\n\t\tif (info.bf_isSurname) bf_surnameCount++;\n\t\tif (info.bf_isLocation) bf_locationCount++;\n\t\tbf_schoolScoreSum += info.bf_schoolScore;\n\t\tbf_schoolScoreMax = Math.max(bf_schoolScoreMax, info.bf_schoolScore);\n\t}\n\n\tconst bf_allSurnames = infos.every((t) => t.bf_isSurname);\n\tconst bf_allSchool = infos.every((t) => t.bf_isSchool || t.bf_schoolScore > 0.5);\n\tconst bf_firstnameSurnamePattern = first.bf_isFirstName && second?.bf_isSurname;\n\tconst bf_surnameFirstnamePattern = first.bf_isSurname && second?.bf_isFirstName;\n\n\tlet bf_hasSurnameChain = false;\n\tfor (let i = 0; i < infos.length - 1; i++) {\n\t\tif (infos[i]!.bf_isSurname && infos[i + 1]!.bf_isSurname) {\n\t\t\tbf_hasSurnameChain = true;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tlet bf_hasLocationBigram = false;\n\tlet bf_locationBigramLength = 0;\n\tlet currentLocationRun = 0;\n\tfor (const info of infos) {\n\t\tif (info.bf_isLocation) {\n\t\t\tcurrentLocationRun++;\n\t\t\tif (currentLocationRun >= 2) {\n\t\t\t\tbf_hasLocationBigram = true;\n\t\t\t\tbf_locationBigramLength = Math.max(bf_locationBigramLength, currentLocationRun);\n\t\t\t}\n\t\t} else {\n\t\t\tcurrentLocationRun = 0;\n\t\t}\n\t}\n\n\t// === NAMES.TXT AGGREGATES ===\n\tlet lut_firstnameCount = 0;\n\tlet lut_surnameCount = 0;\n\n\tfor (const info of infos) {\n\t\tif (info.lut_hasFirstname) lut_firstnameCount++;\n\t\tif (info.lut_hasSurname) lut_surnameCount++;\n\t}\n\n\tconst lut_allSurnameOrSchool = infos.every(\n\t\t(t) => t.lut_hasSurname || t.lut_hasSchool || t.isConnector,\n\t);\n\tconst lut_allSchool = infos.every((t) => t.lut_hasSchool);\n\n\t// === STRUCTURAL ===\n\tconst hasConnector = infos.some((t) => t.isConnector);\n\tconst hasApostrophe = tokens.some((t) => /[''']/.test(t));\n\tconst ngrams = commaParts(phrase).flatMap((f) => findSchoolNgrams(f));\n\tconst longestNgram =\n\t\tngrams.length > 0\n\t\t\t? ngrams.reduce((a, b) => (a.split(\" \").length > b.split(\" \").length ? a : b))\n\t\t\t: \"\";\n\tconst hasAcademyKw = tokens.some((t) => SCHOOL_KEYWORDS.has(t.toLowerCase()));\n\n\treturn [\n\t\t// === BLOOM FILTER FEATURES ===\n\t\tfirst.bf_isFirstName ? 1 : 0,\n\t\tfirst.bf_isSurname ? 1 : 0,\n\t\tfirst.bf_isIrishSurname ? 1 : 0,\n\t\tfirst.bf_isLocation ? 1 : 0,\n\t\tfirst.bf_isSchool ? 1 : 0,\n\t\tfirst.bf_isUnknown ? 1 : 0,\n\n\t\tsecond?.bf_isFirstName ? 1 : 0,\n\t\tsecond?.bf_isSurname ? 1 : 0,\n\t\tsecond?.bf_isLocation ? 1 : 0,\n\n\t\tlast.bf_isFirstName ? 1 : 0,\n\t\tlast.bf_isSurname ? 1 : 0,\n\t\tlast.bf_isIrishSurname ? 1 : 0,\n\t\tlast.bf_isLocation ? 1 : 0,\n\t\tlast.bf_isSchool ? 1 : 0,\n\t\tlast.bf_isUnknown ? 1 : 0,\n\n\t\tbf_firstnameSurnamePattern ? 1 : 0,\n\t\tbf_surnameFirstnamePattern ? 1 : 0,\n\n\t\tbf_firstNameCount > 0 ? 1 : 0,\n\t\tbf_surnameCount > 0 ? 1 : 0,\n\t\tinfos.some((t) => t.bf_isIrishSurname) ? 1 : 0,\n\t\tbf_locationCount > 0 ? 1 : 0,\n\t\tinfos.some((t) => t.bf_isSchool) ? 1 : 0,\n\n\t\tbf_firstNameCount,\n\t\tbf_surnameCount,\n\t\tbf_locationCount,\n\t\tbf_schoolScoreSum,\n\t\tbf_schoolScoreMax,\n\n\t\tbf_allSurnames ? 1 : 0,\n\t\tbf_allSchool ? 1 : 0,\n\t\tbf_hasSurnameChain ? 1 : 0,\n\t\tbf_hasLocationBigram ? 1 : 0,\n\t\tbf_locationBigramLength,\n\n\t\t// === NAMES.TXT FEATURES ===\n\t\tfirst.lut_hasFirstname ? 1 : 0,\n\t\tfirst.lut_hasSurname && !first.lut_hasFirstname ? 1 : 0,\n\t\tfirst.lut_hasSchool ? 1 : 0,\n\t\tfirst.lut_hasGeo ? 1 : 0,\n\t\tfirst.lut_isUnknown ? 1 : 0,\n\n\t\tlast.lut_hasFirstname ? 1 : 0,\n\t\tlast.lut_hasSurname && !last.lut_hasFirstname ? 1 : 0,\n\t\tlast.lut_hasSchool ? 1 : 0,\n\t\tlast.lut_hasGeo ? 1 : 0,\n\t\tlast.lut_isUnknown ? 1 : 0,\n\n\t\tinfos.some((t) => t.lut_hasFirstname) ? 1 : 0,\n\t\tinfos.some((t) => t.lut_hasSurname) ? 1 : 0,\n\t\tinfos.some((t) => t.lut_hasSchool) ? 1 : 0,\n\t\tinfos.some((t) => t.lut_hasGeo) ? 1 : 0,\n\n\t\tlut_allSurnameOrSchool ? 1 : 0,\n\t\tlut_allSchool ? 1 : 0,\n\t\tlut_firstnameCount,\n\t\tlut_surnameCount,\n\n\t\t// === STRUCTURAL FEATURES ===\n\t\ttokens.length === 1 ? 1 : 0,\n\t\ttokens.length === 2 ? 1 : 0,\n\t\ttokens.length === 3 ? 1 : 0,\n\t\ttokens.length === 4 ? 1 : 0,\n\t\ttokens.length === 5 ? 1 : 0,\n\t\ttokens.length >= 6 ? 1 : 0,\n\t\thasParenthetical(phrase) ? 1 : 0,\n\t\thasConnector ? 1 : 0,\n\t\thasApostrophe ? 1 : 0,\n\n\t\tngrams.length > 0 ? 1 : 0,\n\t\tlongestNgram ? longestNgram.split(\" \").length : 0,\n\t\thasAcademyKw ? 1 : 0,\n\n\t\t// === BOUNDARY DETECTION FEATURES ===\n\t\t// Prefix patterns\n\t\tfirst.bf_isFirstName && second?.bf_isSurname ? 1 : 0, // prefix_firstname_surname\n\t\tfirst.bf_isSurname && second?.bf_isSurname ? 1 : 0, // prefix_surname_surname\n\t\tfirst.bf_isSurname && second?.bf_isFirstName ? 1 : 0, // prefix_surname_firstname\n\n\t\t// All-person detection\n\t\tinfos.every((t) => t.lut_hasFirstname || t.lut_hasSurname || t.isConnector) ? 1 : 0, // all_tokens_person_like\n\t\tinfos.every((t) => t.bf_isFirstName || t.bf_isSurname || t.isConnector) ? 1 : 0, // all_tokens_bf_person\n\n\t\t// Suffix patterns\n\t\tlast.bf_isSurname ? 1 : 0, // suffix_is_surname\n\t\tSCHOOL_KEYWORDS.has(tokens[tokens.length - 1]!.toLowerCase()) ? 1 : 0, // suffix_is_school_kw\n\t\tlast.bf_isLocation ? 1 : 0, // suffix_is_location\n\n\t\t// Length after person pattern\n\t\tMath.max(0, tokens.length - 2), // tokens_after_pos2\n\t\ttokens.slice(2).some((t) => SCHOOL_KEYWORDS.has(t.toLowerCase())) ? 1 : 0, // has_school_kw_after_pos2\n\t\tinfos.slice(2).some((t) => t.bf_isLocation) ? 1 : 0, // has_location_after_pos2\n\t];\n}\n",
|
|
12
|
+
"/**\n * The phrase classifier's features: the one definition the runtime classifier\n * (`library-v4.ts`) and the trainers both run. Internal: not re-exported from any\n * entry point, so it can change with the weights it was trained for.\n *\n * `FEATURE_NAMES` stays in the weights file it was generated with; a weights\n * object is valid for this code only when its vectors are that long.\n */\n\nimport { lookupKey } from \"../lexicon/keys.ts\";\nimport { FIELD_END, isCommaPlacePhrase, isPlacePhrase } from \"../lexicon/place.ts\";\nimport { isFirstName, isIrishSurname, isSurname } from \"./bf/filters.ts\";\nimport { isLocation } from \"./bf/locations.ts\";\nimport { findSchoolNgrams, isSchool, schoolScore } from \"./bf/schools.ts\";\nimport { isUSLocation } from \"./bf/us-locations.ts\";\nimport { CONNECTORS, SCHOOL_KEYWORDS } from \"./constants.ts\";\nimport { splitWords } from \"./seg/tokenize.ts\";\nimport { FEATURE_NAMES } from \"./weights-v4.ts\";\n\nexport { FEATURE_NAMES, isCommaPlacePhrase, isPlacePhrase };\n\n/** The three phrase categories, as the weights and the exact-match short-circuit name them. */\nexport interface CategoryScores {\n\tperson: number;\n\tschool: number;\n\tlocation: number;\n}\n\n/**\n * Exact-match short-circuit: if the entire phrase is in names.txt with clear flags,\n * the runtime returns that classification without running the regression. A trainer\n * uses it to know which phrases the regression never sees.\n */\nexport function exactMatch(\n\tphrase: string,\n\tgetFlags: (name: string) => string | null,\n): CategoryScores | null {\n\tconst flags = getFlags(phrase);\n\tif (!flags) return null;\n\n\t// T = school (Training school)\n\tif (flags.includes(\"T\")) {\n\t\treturn { person: 0, school: 1, location: 0 };\n\t}\n\t// G = geographic location\n\tif (flags.includes(\"G\")) {\n\t\treturn { person: 0, school: 0, location: 1 };\n\t}\n\t// F/M/N/L = person names (only if no T or G)\n\tif (/[FMNL]/.test(flags) && !flags.includes(\"T\") && !flags.includes(\"G\")) {\n\t\treturn { person: 1, school: 0, location: 0 };\n\t}\n\n\treturn null;\n}\n\n// =============================================================================\n// Tokenization (with bigram collapsing)\n// =============================================================================\n\nfunction tokenizeSimple(phrase: string): string[] {\n\treturn splitWords(phrase.replace(/\\([^)]*\\)/g, \" \"));\n}\n\n/**\n * A printed word as `matchBigramContinuations` spells it (`Rí` -> `ri`), or\n * `null` for a word that ends a field (`FIELD_END`): `Aaron Quarrie, London`\n * is not `Aaron Quarrie`.\n */\nfunction continuationKey(word: string): string | null {\n\treturn FIELD_END.test(word) ? null : lookupKey(word);\n}\n\n/**\n * The phrase's comma-separated parts: its printed words, cut after each word that\n * ends with a comma (which is dropped). A school name found in the phrase lies within\n * one part: `Mid Atlantic Region, USA` is two, and no school name spans them.\n *\n * The comma only, not `FIELD_END`'s hyphen: the school table holds printed school\n * cells such as `Dance- Academy` whole, and that cell is one school.\n */\nfunction commaParts(phrase: string): string[] {\n\tconst out: string[][] = [[]];\n\tfor (const word of splitWords(phrase)) {\n\t\tconst bare = word.replace(/,+$/, \"\");\n\t\tif (bare) out[out.length - 1]!.push(bare);\n\t\tif (bare !== word) out.push([]);\n\t}\n\treturn out.filter((f) => f.length > 0).map((f) => f.join(\" \"));\n}\n\n/**\n * The phrase's tokens as the classifier reads them: its words, with each run the\n * lexicon holds as a multi-word entry (`Ard Ri`, `Mc Laughlin`) collapsed into one\n * token. `names stat -v` prints these, so what it shows is what the features see.\n */\nexport function tokenize(\n\tphrase: string,\n\tmatchBigramContinuations?: (word: string) => string[][] | null,\n): string[] {\n\tconst rawTokens = tokenizeSimple(phrase);\n\tif (!matchBigramContinuations || rawTokens.length < 2) return rawTokens;\n\n\tconst result: string[] = [];\n\tlet i = 0;\n\n\twhile (i < rawTokens.length) {\n\t\tconst word = rawTokens[i]!;\n\t\t// A word that ends a field ends any phrase it would start, too: `SOUTHERN, USA` is not `Southern USA`.\n\t\tconst continuations = FIELD_END.test(word) ? null : matchBigramContinuations(word);\n\n\t\tif (continuations && i + 1 < rawTokens.length) {\n\t\t\tlet matched = false;\n\t\t\tfor (const cont of continuations) {\n\t\t\t\tif (i + cont.length < rawTokens.length) {\n\t\t\t\t\tlet matches = true;\n\t\t\t\t\tfor (let j = 0; j < cont.length; j++) {\n\t\t\t\t\t\tif (continuationKey(rawTokens[i + 1 + j]!) !== cont[j]) {\n\t\t\t\t\t\t\tmatches = false;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (matches) {\n\t\t\t\t\t\tconst bigram = [word, ...rawTokens.slice(i + 1, i + 1 + cont.length)].join(\" \");\n\t\t\t\t\t\tresult.push(bigram);\n\t\t\t\t\t\ti += 1 + cont.length;\n\t\t\t\t\t\tmatched = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!matched) {\n\t\t\t\tresult.push(word);\n\t\t\t\ti++;\n\t\t\t}\n\t\t} else {\n\t\t\tresult.push(word);\n\t\t\ti++;\n\t\t}\n\t}\n\n\treturn result;\n}\n\nfunction hasParenthetical(phrase: string): boolean {\n\treturn /\\([^)]+\\)/.test(phrase);\n}\n\n// =============================================================================\n// Token Analysis (Combined BF + LUT)\n// =============================================================================\n\ninterface TokenInfo {\n\tword: string;\n\t// Bloom filter signals\n\tbf_isFirstName: boolean;\n\tbf_isSurname: boolean;\n\tbf_isIrishSurname: boolean;\n\tbf_isLocation: boolean;\n\tbf_isSchool: boolean;\n\tbf_schoolScore: number;\n\tbf_isUnknown: boolean;\n\t// names.txt signals (LUT)\n\tlut_hasFirstname: boolean;\n\tlut_hasSurname: boolean;\n\tlut_hasSchool: boolean;\n\tlut_hasGeo: boolean;\n\tlut_isUnknown: boolean;\n\tisConnector: boolean;\n}\n\nfunction analyzeToken(word: string, getFlags: (name: string) => string | null): TokenInfo {\n\t// names.txt lookups\n\tconst flags = getFlags(word) ?? \"\";\n\n\t// Bloom filter lookups. A word that ends a field asks without its `,`/`-`, as `getFlags`\n\t// does (`Victoria,` is `Victoria`). A token the tokenizer merged from a split spelling\n\t// (\"Mc Laughlin\", \"Mary Kate\") asks the filters its joined form, as the tables hold it;\n\t// a B phrase is asked as is.\n\tconst bare = word.replace(FIELD_END, \"\");\n\tconst bw = bare.includes(\" \") && !flags.includes(\"B\") ? bare.replace(/\\s+/g, \"\") : bare;\n\tconst bf_firstName = isFirstName(bw);\n\tconst bf_surname = isSurname(bw);\n\tconst bf_irishSurname = isIrishSurname(bw);\n\tconst bf_location = isLocation(bw) || isUSLocation(bw);\n\tconst bf_school = isSchool(bw);\n\tconst bf_score = schoolScore(bw);\n\tconst lut_isKnown = flags !== \"\";\n\n\treturn {\n\t\tword,\n\t\tbf_isFirstName: bf_firstName,\n\t\tbf_isSurname: bf_surname,\n\t\tbf_isIrishSurname: bf_irishSurname,\n\t\tbf_isLocation: bf_location,\n\t\tbf_isSchool: bf_school,\n\t\tbf_schoolScore: bf_score,\n\t\tbf_isUnknown: !bf_firstName && !bf_surname && !bf_location && !bf_school,\n\t\tlut_hasFirstname: /[FMN]/.test(flags),\n\t\tlut_hasSurname: flags.includes(\"L\"),\n\t\tlut_hasSchool: flags.includes(\"T\"),\n\t\tlut_hasGeo: flags.includes(\"G\"),\n\t\tlut_isUnknown: !lut_isKnown,\n\t\tisConnector: CONNECTORS.has(word.toLowerCase()),\n\t};\n}\n\n// =============================================================================\n// Feature Extraction (v4: Combined BF + LUT + Boundary)\n// =============================================================================\n\nexport function extractFeatures(\n\tphrase: string,\n\tgetFlags: (name: string) => string | null,\n\tmatchBigramContinuations?: (word: string) => string[][] | null,\n): number[] {\n\tconst tokens = tokenize(phrase, matchBigramContinuations);\n\tif (tokens.length === 0) {\n\t\treturn new Array(FEATURE_NAMES.length).fill(0);\n\t}\n\n\tconst infos = tokens.map((t) => analyzeToken(t, getFlags));\n\tconst first = infos[0]!;\n\tconst second = infos.length > 1 ? infos[1] : null;\n\tconst last = infos[infos.length - 1]!;\n\n\t// === BLOOM FILTER AGGREGATES ===\n\tlet bf_firstNameCount = 0;\n\tlet bf_surnameCount = 0;\n\tlet bf_locationCount = 0;\n\tlet bf_schoolScoreSum = 0;\n\tlet bf_schoolScoreMax = 0;\n\n\tfor (const info of infos) {\n\t\tif (info.bf_isFirstName) bf_firstNameCount++;\n\t\tif (info.bf_isSurname) bf_surnameCount++;\n\t\tif (info.bf_isLocation) bf_locationCount++;\n\t\tbf_schoolScoreSum += info.bf_schoolScore;\n\t\tbf_schoolScoreMax = Math.max(bf_schoolScoreMax, info.bf_schoolScore);\n\t}\n\n\tconst bf_allSurnames = infos.every((t) => t.bf_isSurname);\n\tconst bf_allSchool = infos.every((t) => t.bf_isSchool || t.bf_schoolScore > 0.5);\n\tconst bf_firstnameSurnamePattern = first.bf_isFirstName && second?.bf_isSurname;\n\tconst bf_surnameFirstnamePattern = first.bf_isSurname && second?.bf_isFirstName;\n\n\tlet bf_hasSurnameChain = false;\n\tfor (let i = 0; i < infos.length - 1; i++) {\n\t\tif (infos[i]!.bf_isSurname && infos[i + 1]!.bf_isSurname) {\n\t\t\tbf_hasSurnameChain = true;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tlet bf_hasLocationBigram = false;\n\tlet bf_locationBigramLength = 0;\n\tlet currentLocationRun = 0;\n\tfor (const info of infos) {\n\t\tif (info.bf_isLocation) {\n\t\t\tcurrentLocationRun++;\n\t\t\tif (currentLocationRun >= 2) {\n\t\t\t\tbf_hasLocationBigram = true;\n\t\t\t\tbf_locationBigramLength = Math.max(bf_locationBigramLength, currentLocationRun);\n\t\t\t}\n\t\t} else {\n\t\t\tcurrentLocationRun = 0;\n\t\t}\n\t}\n\n\t// === NAMES.TXT AGGREGATES ===\n\tlet lut_firstnameCount = 0;\n\tlet lut_surnameCount = 0;\n\n\tfor (const info of infos) {\n\t\tif (info.lut_hasFirstname) lut_firstnameCount++;\n\t\tif (info.lut_hasSurname) lut_surnameCount++;\n\t}\n\n\tconst lut_allSurnameOrSchool = infos.every(\n\t\t(t) => t.lut_hasSurname || t.lut_hasSchool || t.isConnector,\n\t);\n\tconst lut_allSchool = infos.every((t) => t.lut_hasSchool);\n\n\t// === STRUCTURAL ===\n\tconst hasConnector = infos.some((t) => t.isConnector);\n\tconst hasApostrophe = tokens.some((t) => /[''']/.test(t));\n\tconst ngrams = commaParts(phrase).flatMap((f) => findSchoolNgrams(f));\n\tconst longestNgram =\n\t\tngrams.length > 0\n\t\t\t? ngrams.reduce((a, b) => (a.split(\" \").length > b.split(\" \").length ? a : b))\n\t\t\t: \"\";\n\tconst hasAcademyKw = tokens.some((t) => SCHOOL_KEYWORDS.has(t.toLowerCase()));\n\n\treturn [\n\t\t// === BLOOM FILTER FEATURES ===\n\t\tfirst.bf_isFirstName ? 1 : 0,\n\t\tfirst.bf_isSurname ? 1 : 0,\n\t\tfirst.bf_isIrishSurname ? 1 : 0,\n\t\tfirst.bf_isLocation ? 1 : 0,\n\t\tfirst.bf_isSchool ? 1 : 0,\n\t\tfirst.bf_isUnknown ? 1 : 0,\n\n\t\tsecond?.bf_isFirstName ? 1 : 0,\n\t\tsecond?.bf_isSurname ? 1 : 0,\n\t\tsecond?.bf_isLocation ? 1 : 0,\n\n\t\tlast.bf_isFirstName ? 1 : 0,\n\t\tlast.bf_isSurname ? 1 : 0,\n\t\tlast.bf_isIrishSurname ? 1 : 0,\n\t\tlast.bf_isLocation ? 1 : 0,\n\t\tlast.bf_isSchool ? 1 : 0,\n\t\tlast.bf_isUnknown ? 1 : 0,\n\n\t\tbf_firstnameSurnamePattern ? 1 : 0,\n\t\tbf_surnameFirstnamePattern ? 1 : 0,\n\n\t\tbf_firstNameCount > 0 ? 1 : 0,\n\t\tbf_surnameCount > 0 ? 1 : 0,\n\t\tinfos.some((t) => t.bf_isIrishSurname) ? 1 : 0,\n\t\tbf_locationCount > 0 ? 1 : 0,\n\t\tinfos.some((t) => t.bf_isSchool) ? 1 : 0,\n\n\t\tbf_firstNameCount,\n\t\tbf_surnameCount,\n\t\tbf_locationCount,\n\t\tbf_schoolScoreSum,\n\t\tbf_schoolScoreMax,\n\n\t\tbf_allSurnames ? 1 : 0,\n\t\tbf_allSchool ? 1 : 0,\n\t\tbf_hasSurnameChain ? 1 : 0,\n\t\tbf_hasLocationBigram ? 1 : 0,\n\t\tbf_locationBigramLength,\n\n\t\t// === NAMES.TXT FEATURES ===\n\t\tfirst.lut_hasFirstname ? 1 : 0,\n\t\tfirst.lut_hasSurname && !first.lut_hasFirstname ? 1 : 0,\n\t\tfirst.lut_hasSchool ? 1 : 0,\n\t\tfirst.lut_hasGeo ? 1 : 0,\n\t\tfirst.lut_isUnknown ? 1 : 0,\n\n\t\tlast.lut_hasFirstname ? 1 : 0,\n\t\tlast.lut_hasSurname && !last.lut_hasFirstname ? 1 : 0,\n\t\tlast.lut_hasSchool ? 1 : 0,\n\t\tlast.lut_hasGeo ? 1 : 0,\n\t\tlast.lut_isUnknown ? 1 : 0,\n\n\t\tinfos.some((t) => t.lut_hasFirstname) ? 1 : 0,\n\t\tinfos.some((t) => t.lut_hasSurname) ? 1 : 0,\n\t\tinfos.some((t) => t.lut_hasSchool) ? 1 : 0,\n\t\tinfos.some((t) => t.lut_hasGeo) ? 1 : 0,\n\n\t\tlut_allSurnameOrSchool ? 1 : 0,\n\t\tlut_allSchool ? 1 : 0,\n\t\tlut_firstnameCount,\n\t\tlut_surnameCount,\n\n\t\t// === STRUCTURAL FEATURES ===\n\t\ttokens.length === 1 ? 1 : 0,\n\t\ttokens.length === 2 ? 1 : 0,\n\t\ttokens.length === 3 ? 1 : 0,\n\t\ttokens.length === 4 ? 1 : 0,\n\t\ttokens.length === 5 ? 1 : 0,\n\t\ttokens.length >= 6 ? 1 : 0,\n\t\thasParenthetical(phrase) ? 1 : 0,\n\t\thasConnector ? 1 : 0,\n\t\thasApostrophe ? 1 : 0,\n\n\t\tngrams.length > 0 ? 1 : 0,\n\t\tlongestNgram ? longestNgram.split(\" \").length : 0,\n\t\thasAcademyKw ? 1 : 0,\n\n\t\t// === BOUNDARY DETECTION FEATURES ===\n\t\t// Prefix patterns\n\t\tfirst.bf_isFirstName && second?.bf_isSurname ? 1 : 0, // prefix_firstname_surname\n\t\tfirst.bf_isSurname && second?.bf_isSurname ? 1 : 0, // prefix_surname_surname\n\t\tfirst.bf_isSurname && second?.bf_isFirstName ? 1 : 0, // prefix_surname_firstname\n\n\t\t// All-person detection\n\t\tinfos.every((t) => t.lut_hasFirstname || t.lut_hasSurname || t.isConnector) ? 1 : 0, // all_tokens_person_like\n\t\tinfos.every((t) => t.bf_isFirstName || t.bf_isSurname || t.isConnector) ? 1 : 0, // all_tokens_bf_person\n\n\t\t// Suffix patterns\n\t\tlast.bf_isSurname ? 1 : 0, // suffix_is_surname\n\t\tSCHOOL_KEYWORDS.has(tokens[tokens.length - 1]!.toLowerCase()) ? 1 : 0, // suffix_is_school_kw\n\t\tlast.bf_isLocation ? 1 : 0, // suffix_is_location\n\n\t\t// Length after person pattern\n\t\tMath.max(0, tokens.length - 2), // tokens_after_pos2\n\t\ttokens.slice(2).some((t) => SCHOOL_KEYWORDS.has(t.toLowerCase())) ? 1 : 0, // has_school_kw_after_pos2\n\t\tinfos.slice(2).some((t) => t.bf_isLocation) ? 1 : 0, // has_location_after_pos2\n\t];\n}\n",
|
|
13
13
|
"/**\n * The segmenter's features: token, span and boundary vectors. The one definition the\n * runtime segmenter (`seg-library.ts`) and the trainers both run. Internal: not\n * re-exported from any entry point.\n *\n * The bloom-filter features are the runtime's (`isLocation` includes the US table;\n * \"human name\" is surname | first name | Irish surname). The trainer once had its\n * own copy that differed on exactly those, which is why there is one copy now.\n */\n\nimport { isFirstName, isIrishSurname, isSurname } from \"../bf/filters.ts\";\nimport { isLocation } from \"../bf/locations.ts\";\nimport { findSchoolNgrams, isSchool, schoolScore } from \"../bf/schools.ts\";\nimport { isUSLocation } from \"../bf/us-locations.ts\";\nimport {\n\tisAllCaps,\n\tisConceptWord,\n\tisInitial,\n\tisLowerCase,\n\tisStopword,\n\tisTitleCase,\n\tnormalize,\n} from \"./tokenize.ts\";\n\n// =============================================================================\n// Team Pattern Detection\n// =============================================================================\n\nexport function isTeamPatternAt(tokens: string[], i: number): boolean {\n\tif (i + 1 >= tokens.length) return false;\n\tconst t0 = tokens[i]!.toLowerCase();\n\tconst t1 = tokens[i + 1]!;\n\treturn t0 === \"team\" && /^[A-Za-z]$/.test(t1);\n}\n\nexport function getTeamBoundary(tokens: string[]): number | null {\n\tif (tokens.length >= 3 && isTeamPatternAt(tokens, 0)) {\n\t\treturn 2; // \"Team X\" is exactly 2 tokens\n\t}\n\treturn null;\n}\n\n// =============================================================================\n// Feature Extraction\n// =============================================================================\n\nexport interface TokenFeatures {\n\ttext: string;\n\tnorm: string;\n\tisSurname: boolean;\n\tisFirstName: boolean;\n\tisIrishSurname: boolean;\n\thasHyphen: boolean;\n\thasApostrophe: boolean;\n\tisInitial: boolean;\n\tisTitleCase: boolean;\n\tisAllCaps: boolean;\n\tisLowerCase: boolean;\n\tisStopword: boolean;\n\thasDigits: boolean;\n\tlutFlags: string | undefined;\n\thasSchoolFlag: boolean;\n\tisLocation: boolean;\n\tisUSLocation: boolean;\n\tisSchool: boolean;\n\tschoolScore: number;\n}\n\nexport function extractTokenFeatures(\n\ttoken: string,\n\tgetFlags: (name: string) => string | null,\n): TokenFeatures {\n\tconst norm = normalize(token);\n\tconst flags = getFlags(token) ?? undefined;\n\n\treturn {\n\t\ttext: token,\n\t\tnorm,\n\t\tisSurname: isSurname(token),\n\t\tisFirstName: isFirstName(token),\n\t\tisIrishSurname: isIrishSurname(token),\n\t\thasHyphen: token.includes(\"-\"),\n\t\thasApostrophe: /[''']/.test(token),\n\t\tisInitial: isInitial(token),\n\t\tisTitleCase: isTitleCase(token),\n\t\tisAllCaps: isAllCaps(token),\n\t\tisLowerCase: isLowerCase(token),\n\t\tisStopword: isStopword(token),\n\t\thasDigits: /\\d/.test(token),\n\t\tlutFlags: flags,\n\t\thasSchoolFlag: flags?.includes(\"T\") ?? false,\n\t\tisLocation: isLocation(token) || isUSLocation(token),\n\t\tisUSLocation: isUSLocation(token),\n\t\tisSchool: isSchool(token),\n\t\tschoolScore: schoolScore(token),\n\t};\n}\n\nexport const TOKEN_FEATURE_DIM = 22;\n\nexport function tokenFeaturesToVector(f: TokenFeatures): number[] {\n\tconst flags = f.lutFlags ?? \"\";\n\treturn [\n\t\tf.isSurname ? 1 : 0,\n\t\tf.isFirstName ? 1 : 0,\n\t\tf.isSurname || f.isFirstName || f.isIrishSurname ? 1 : 0, // isHumanName\n\t\tf.isIrishSurname ? 1 : 0,\n\t\tf.hasHyphen ? 1 : 0,\n\t\tf.hasApostrophe ? 1 : 0,\n\t\tf.isInitial ? 1 : 0,\n\t\tf.isTitleCase ? 1 : 0,\n\t\tf.isAllCaps ? 1 : 0,\n\t\tf.isLowerCase ? 1 : 0,\n\t\tf.isStopword ? 1 : 0,\n\t\tf.hasDigits ? 1 : 0,\n\t\tflags.includes(\"F\") ? 1 : 0,\n\t\tflags.includes(\"M\") ? 1 : 0,\n\t\tflags.includes(\"L\") ? 1 : 0,\n\t\tflags.includes(\"T\") ? 1 : 0,\n\t\tflags.includes(\"G\") ? 1 : 0,\n\t\tflags.includes(\"A\") ? 1 : 0,\n\t\tf.isLocation ? 1 : 0,\n\t\tf.isUSLocation ? 1 : 0,\n\t\tf.isSchool ? 1 : 0,\n\t\tf.schoolScore,\n\t];\n}\n\nexport function getTokenFeaturesWithContext(allFeatures: TokenFeatures[], i: number): number[] {\n\tconst self = tokenFeaturesToVector(allFeatures[i]!);\n\tconst left =\n\t\ti > 0 ? tokenFeaturesToVector(allFeatures[i - 1]!) : new Array(TOKEN_FEATURE_DIM).fill(0);\n\tconst right =\n\t\ti < allFeatures.length - 1\n\t\t\t? tokenFeaturesToVector(allFeatures[i + 1]!)\n\t\t\t: new Array(TOKEN_FEATURE_DIM).fill(0);\n\treturn [...left, ...self, ...right];\n}\n\n// =============================================================================\n// Span Features\n// =============================================================================\n\nexport interface SpanFeatures {\n\tlength: number;\n\tsurnameDensity: number;\n\tfirstNameDensity: number;\n\tlocationDensity: number;\n\thasConceptWord: boolean;\n\tconceptWordPosition: number;\n\tstartsWithSurname: boolean;\n\tendsWithSurname: boolean;\n\tstartsWithFirstName: boolean;\n\tisSurnameChain: boolean;\n\thasSchoolNgram: boolean;\n\tschoolNgramLength: number;\n\tschoolNgramCoverage: number;\n}\n\nexport function extractSpanFeatures(\n\tallFeatures: TokenFeatures[],\n\tstart: number,\n\tend: number,\n): SpanFeatures {\n\tconst span = allFeatures.slice(start, end);\n\tconst len = span.length;\n\n\tif (len === 0) {\n\t\treturn {\n\t\t\tlength: 0,\n\t\t\tsurnameDensity: 0,\n\t\t\tfirstNameDensity: 0,\n\t\t\tlocationDensity: 0,\n\t\t\thasConceptWord: false,\n\t\t\tconceptWordPosition: -1,\n\t\t\tstartsWithSurname: false,\n\t\t\tendsWithSurname: false,\n\t\t\tstartsWithFirstName: false,\n\t\t\tisSurnameChain: false,\n\t\t\thasSchoolNgram: false,\n\t\t\tschoolNgramLength: 0,\n\t\t\tschoolNgramCoverage: 0,\n\t\t};\n\t}\n\n\tconst surnameCount = span.filter((f) => f.isSurname).length;\n\tconst firstNameCount = span.filter((f) => f.isFirstName).length;\n\tconst locationCount = span.filter((f) => f.lutFlags?.includes(\"G\")).length;\n\n\tlet conceptIdx = -1;\n\tfor (let i = 0; i < span.length; i++) {\n\t\tif (isConceptWord(span[i]!.text)) {\n\t\t\tconceptIdx = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tconst spanText = span.map((f) => f.text).join(\" \");\n\tconst schoolNgrams = findSchoolNgrams(spanText);\n\tconst longestNgram =\n\t\tschoolNgrams.length > 0\n\t\t\t? schoolNgrams.reduce((a, b) => (a.split(\" \").length > b.split(\" \").length ? a : b))\n\t\t\t: \"\";\n\tconst longestNgramWordCount = longestNgram ? longestNgram.split(\" \").length : 0;\n\n\treturn {\n\t\tlength: len,\n\t\tsurnameDensity: surnameCount / len,\n\t\tfirstNameDensity: firstNameCount / len,\n\t\tlocationDensity: locationCount / len,\n\t\thasConceptWord: conceptIdx >= 0,\n\t\tconceptWordPosition: conceptIdx,\n\t\tstartsWithSurname: span[0]!.isSurname,\n\t\tendsWithSurname: span[len - 1]!.isSurname,\n\t\tstartsWithFirstName: span[0]!.isFirstName,\n\t\tisSurnameChain: span.every((f) => f.isSurname),\n\t\thasSchoolNgram: schoolNgrams.length > 0,\n\t\tschoolNgramLength: longestNgramWordCount,\n\t\tschoolNgramCoverage: longestNgramWordCount / len,\n\t};\n}\n\nexport function spanFeaturesToVector(f: SpanFeatures): number[] {\n\treturn [\n\t\tf.length,\n\t\tf.length === 1 ? 1 : 0,\n\t\tf.length === 2 ? 1 : 0,\n\t\tf.length >= 3 ? 1 : 0,\n\t\tf.surnameDensity,\n\t\tf.firstNameDensity,\n\t\tf.locationDensity,\n\t\tf.hasConceptWord ? 1 : 0,\n\t\tf.conceptWordPosition >= 0 ? f.conceptWordPosition / f.length : 0,\n\t\tf.startsWithSurname ? 1 : 0,\n\t\tf.endsWithSurname ? 1 : 0,\n\t\tf.startsWithFirstName ? 1 : 0,\n\t\tf.isSurnameChain ? 1 : 0,\n\t\tf.hasSchoolNgram ? 1 : 0,\n\t\tf.schoolNgramLength,\n\t\tf.schoolNgramCoverage,\n\t];\n}\n\n// =============================================================================\n// Boundary Features\n// =============================================================================\n\nexport interface BoundaryFeatures {\n\tsurnameToSchool: boolean;\n\tfirstNameToConcept: boolean;\n\tbothAmbiguous: boolean;\n\thasHyphen: boolean;\n\thasOOV: boolean;\n\tkHasFirstName: boolean;\n\tkHasSurname: boolean;\n\tkp1HasSchoolFlag: boolean;\n\tkp1IsConceptWord: boolean;\n\tkHasSchoolFlag: boolean;\n\tkp1HasSurname: boolean;\n}\n\nexport function isOOV(f: TokenFeatures): boolean {\n\treturn !f.isSurname && !f.isFirstName && !f.isIrishSurname;\n}\n\nexport function isAmbiguous(f: TokenFeatures): boolean {\n\treturn (f.isSurname || f.isFirstName) && f.hasSchoolFlag;\n}\n\nexport function extractBoundaryFeatures(allFeatures: TokenFeatures[], k: number): BoundaryFeatures {\n\tconst fK = allFeatures[k];\n\tconst fKp1 = allFeatures[k + 1];\n\n\tif (!fK || !fKp1) {\n\t\treturn {\n\t\t\tsurnameToSchool: false,\n\t\t\tfirstNameToConcept: false,\n\t\t\tbothAmbiguous: false,\n\t\t\thasHyphen: false,\n\t\t\thasOOV: false,\n\t\t\tkHasFirstName: false,\n\t\t\tkHasSurname: false,\n\t\t\tkp1HasSchoolFlag: false,\n\t\t\tkp1IsConceptWord: false,\n\t\t\tkHasSchoolFlag: false,\n\t\t\tkp1HasSurname: false,\n\t\t};\n\t}\n\n\treturn {\n\t\tsurnameToSchool: fK.isSurname && fKp1.hasSchoolFlag,\n\t\tfirstNameToConcept: fK.isFirstName && isConceptWord(fKp1.text),\n\t\tbothAmbiguous: isAmbiguous(fK) && isAmbiguous(fKp1),\n\t\thasHyphen: fK.hasHyphen || fKp1.hasHyphen,\n\t\thasOOV: isOOV(fK) || isOOV(fKp1),\n\t\tkHasFirstName: fK.isFirstName,\n\t\tkHasSurname: fK.isSurname,\n\t\tkp1HasSchoolFlag: fKp1.hasSchoolFlag,\n\t\tkp1IsConceptWord: isConceptWord(fKp1.text),\n\t\tkHasSchoolFlag: fK.hasSchoolFlag,\n\t\tkp1HasSurname: fKp1.isSurname,\n\t};\n}\n\nexport function boundaryFeaturesToVector(f: BoundaryFeatures): number[] {\n\treturn [\n\t\tf.surnameToSchool ? 1 : 0,\n\t\tf.firstNameToConcept ? 1 : 0,\n\t\tf.bothAmbiguous ? 1 : 0,\n\t\tf.hasHyphen ? 1 : 0,\n\t\tf.hasOOV ? 1 : 0,\n\t\tf.kHasFirstName ? 1 : 0,\n\t\tf.kHasSurname ? 1 : 0,\n\t\tf.kp1HasSchoolFlag ? 1 : 0,\n\t\tf.kp1IsConceptWord ? 1 : 0,\n\t\tf.kHasSchoolFlag ? 1 : 0,\n\t\tf.kp1HasSurname ? 1 : 0,\n\t];\n}\n",
|
|
14
14
|
"/**\n * The segmenter's model: the legal segmentations of a token run, the concept-word\n * anchors that prune them, and the score of one segmentation under a set of weights.\n * Internal; the runtime segmenter and the trainers both score through here.\n */\n\nimport {\n\ttype TokenFeatures,\n\tboundaryFeaturesToVector,\n\textractBoundaryFeatures,\n\textractSpanFeatures,\n\tgetTokenFeaturesWithContext,\n\tspanFeaturesToVector,\n} from \"./features.ts\";\nimport { isConceptWord } from \"./tokenize.ts\";\n\nexport type TokenLabel = \"P\" | \"S\" | \"L\";\n\n// =============================================================================\n// Model\n// =============================================================================\n\nexport interface Segmentation {\n\ttype: string;\n\tboundaries: number[];\n\tlabels: TokenLabel[];\n}\n\n/**\n * The segmenter's weights: per label (P, S, L) a token-emission vector over the\n * token features with context and a span vector over the span features; one vector\n * over the boundary features; and the calibrated softmax temperature.\n */\nexport interface SegmenterWeights {\n\treadonly tokenWeights: readonly (readonly number[])[];\n\treadonly tokenBiases: readonly number[];\n\treadonly spanWeights: readonly (readonly number[])[];\n\treadonly spanBiases: readonly number[];\n\treadonly boundaryWeights?: readonly number[];\n\treadonly boundaryBias?: number;\n\treadonly temperature?: number;\n}\n\nexport function dot(a: readonly number[], b: readonly number[]): number {\n\tlet sum = 0;\n\tfor (let i = 0; i < a.length; i++) {\n\t\tsum += a[i]! * b[i]!;\n\t}\n\treturn sum;\n}\n\nexport function softmax(scores: number[]): number[] {\n\tconst max = Math.max(...scores);\n\tconst exps = scores.map((s) => Math.exp(s - max));\n\tconst sum = exps.reduce((a, b) => a + b, 0);\n\treturn exps.map((e) => e / sum);\n}\n\nexport function enumerateSegmentations(n: number): Segmentation[] {\n\tconst results: Segmentation[] = [];\n\n\tconst makeLabels = (pEnd: number, sEnd: number, total: number): TokenLabel[] => {\n\t\tconst labels: TokenLabel[] = [];\n\t\tfor (let i = 0; i < pEnd; i++) labels.push(\"P\");\n\t\tfor (let i = pEnd; i < sEnd; i++) labels.push(\"S\");\n\t\tfor (let i = sEnd; i < total; i++) labels.push(\"L\");\n\t\treturn labels;\n\t};\n\n\t// P only\n\tif (n >= 2) {\n\t\tresults.push({ type: \"P\", boundaries: [n], labels: new Array(n).fill(\"P\") });\n\t}\n\n\t// S only\n\tresults.push({ type: \"S\", boundaries: [0, n], labels: new Array(n).fill(\"S\") });\n\n\t// PS\n\tfor (let k = 2; k < n; k++) {\n\t\tresults.push({ type: \"PS\", boundaries: [k], labels: makeLabels(k, n, n) });\n\t}\n\n\t// SL\n\tfor (let m = 1; m < n; m++) {\n\t\tresults.push({ type: \"SL\", boundaries: [0, m], labels: makeLabels(0, m, n) });\n\t}\n\n\t// PL\n\tfor (let k = 2; k < n; k++) {\n\t\tresults.push({ type: \"PL\", boundaries: [k, k], labels: makeLabels(k, k, n) });\n\t}\n\n\t// PSL\n\tfor (let k = 2; k < n - 1; k++) {\n\t\tfor (let m = k + 1; m < n; m++) {\n\t\t\tresults.push({ type: \"PSL\", boundaries: [k, m], labels: makeLabels(k, m, n) });\n\t\t}\n\t}\n\n\treturn results;\n}\n\nexport function findConceptAnchorsInternal(tokens: string[]): number[] {\n\tconst anchors: number[] = [];\n\tfor (let i = 0; i < tokens.length; i++) {\n\t\tif (isConceptWord(tokens[i]!)) {\n\t\t\tanchors.push(i);\n\t\t}\n\t}\n\treturn anchors;\n}\n\nexport function violatesConceptAnchors(seg: Segmentation, anchors: number[]): boolean {\n\tfor (const idx of anchors) {\n\t\tif (seg.labels[idx] !== \"S\") return true;\n\t}\n\treturn false;\n}\n\n// =============================================================================\n// Scoring\n// =============================================================================\n\n/** Label index into the weight rows: P 0, S 1, L 2. */\nexport function labelIndex(label: TokenLabel): number {\n\treturn label === \"P\" ? 0 : label === \"S\" ? 1 : 2;\n}\n\n/**\n * What a segmentation scores beyond its token emissions: its spans `[start, end,\n * labelIdx]` and the positions `k` of its boundary transitions (the last token\n * before each), in the order the score adds them.\n */\nexport function segmentationParts(\n\tseg: Segmentation,\n\tn: number,\n): { spans: [number, number, number][]; boundaries: number[] } {\n\tif (seg.type === \"P\") return { spans: [[0, n, 0]], boundaries: [] };\n\tif (seg.type === \"S\") return { spans: [[0, n, 1]], boundaries: [] };\n\tif (seg.type === \"PS\") {\n\t\tconst k = seg.boundaries[0]!;\n\t\treturn {\n\t\t\tspans: [\n\t\t\t\t[0, k, 0],\n\t\t\t\t[k, n, 1],\n\t\t\t],\n\t\t\tboundaries: [k - 1],\n\t\t};\n\t}\n\tif (seg.type === \"SL\") {\n\t\tconst m = seg.boundaries[1]!;\n\t\treturn {\n\t\t\tspans: [\n\t\t\t\t[0, m, 1],\n\t\t\t\t[m, n, 2],\n\t\t\t],\n\t\t\tboundaries: [m - 1],\n\t\t};\n\t}\n\tif (seg.type === \"PL\") {\n\t\tconst k = seg.boundaries[0]!;\n\t\treturn {\n\t\t\tspans: [\n\t\t\t\t[0, k, 0],\n\t\t\t\t[k, n, 2],\n\t\t\t],\n\t\t\tboundaries: [k - 1],\n\t\t};\n\t}\n\tif (seg.type === \"PSL\") {\n\t\tconst k = seg.boundaries[0]!;\n\t\tconst m = seg.boundaries[1]!;\n\t\treturn {\n\t\t\tspans: [\n\t\t\t\t[0, k, 0],\n\t\t\t\t[k, m, 1],\n\t\t\t\t[m, n, 2],\n\t\t\t],\n\t\t\tboundaries: [k - 1, m - 1],\n\t\t};\n\t}\n\treturn { spans: [], boundaries: [] };\n}\n\nexport function computeTokenEmissions(\n\ttokenFeatures: TokenFeatures[],\n\tweights: SegmenterWeights,\n): number[][] {\n\tconst n = tokenFeatures.length;\n\tconst emissions: number[][] = [];\n\n\tfor (let i = 0; i < n; i++) {\n\t\tconst features = getTokenFeaturesWithContext(tokenFeatures, i);\n\t\tconst scores = [\n\t\t\tdot(features, weights.tokenWeights[0]!) + weights.tokenBiases[0]!,\n\t\t\tdot(features, weights.tokenWeights[1]!) + weights.tokenBiases[1]!,\n\t\t\tdot(features, weights.tokenWeights[2]!) + weights.tokenBiases[2]!,\n\t\t];\n\t\temissions.push(scores);\n\t}\n\n\treturn emissions;\n}\n\nexport function computeSpanScore(\n\ttokenFeatures: TokenFeatures[],\n\tstart: number,\n\tend: number,\n\tlabelIdx: number,\n\tweights: SegmenterWeights,\n): number {\n\tconst spanFeatures = extractSpanFeatures(tokenFeatures, start, end);\n\tconst features = spanFeaturesToVector(spanFeatures);\n\treturn dot(features, weights.spanWeights[labelIdx]!) + weights.spanBiases[labelIdx]!;\n}\n\nexport function computeBoundaryScore(\n\ttokenFeatures: TokenFeatures[],\n\tk: number,\n\tweights: SegmenterWeights,\n): number {\n\tif (!weights.boundaryWeights) return 0;\n\tconst bf = extractBoundaryFeatures(tokenFeatures, k);\n\tconst features = boundaryFeaturesToVector(bf);\n\treturn dot(features, weights.boundaryWeights) + (weights.boundaryBias ?? 0);\n}\n\nexport function scoreSegmentation(\n\ttokenFeatures: TokenFeatures[],\n\temissions: number[][],\n\tseg: Segmentation,\n\tweights: SegmenterWeights,\n): number {\n\tlet score = 0;\n\tconst n = tokenFeatures.length;\n\n\t// Token emissions\n\tfor (let i = 0; i < n; i++) {\n\t\tscore += emissions[i]![labelIndex(seg.labels[i]!)]!;\n\t}\n\n\t// Span scores, then boundary scores, in the order `segmentationParts` lists them\n\tconst { spans, boundaries } = segmentationParts(seg, n);\n\tfor (const [start, end, labelIdx] of spans)\n\t\tscore += computeSpanScore(tokenFeatures, start, end, labelIdx, weights);\n\tfor (const k of boundaries) score += computeBoundaryScore(tokenFeatures, k, weights);\n\n\treturn score;\n}\n",
|
|
15
15
|
"/**\n * Segmentation Library (Bundled)\n *\n * Self-contained segmentation model for splitting token sequences into\n * Person, School, and Location spans.\n *\n * Accepts external names.txt lookup for runtime flexibility.\n *\n * Usage:\n * import { createSegmenter } from './seg-library';\n * const segmenter = createSegmenter(namesData);\n * const result = segmenter.segment(\"Mary Kate O'Trurane Quorrish Dance Academy\");\n */\n\n// Import weights (will be bundled)\nimport weightsJson from \"./weights-v3-calibrated.json\";\n\nimport {\n\tTEAM_DESIGNATION_WORDS,\n\ttype TeamSuffixPartition,\n\tpartitionTeamSuffix,\n} from \"../normalize/team-name.ts\";\n\nimport { type TokenFeatures, extractTokenFeatures, getTeamBoundary } from \"./seg/features.ts\";\nimport {\n\ttype SegmenterWeights,\n\tcomputeTokenEmissions,\n\tenumerateSegmentations,\n\tfindConceptAnchorsInternal,\n\tscoreSegmentation,\n\tsoftmax,\n\tviolatesConceptAnchors,\n} from \"./seg/model.ts\";\nimport { tokenize } from \"./seg/tokenize.ts\";\n\nconst WORDS = new Set(TEAM_DESIGNATION_WORDS.map((w) => w.toLowerCase()));\n\nexport type { SegmenterWeights } from \"./seg/model.ts\";\nexport type { TokenLabel } from \"./seg/model.ts\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n// Use same NamesData interface as library-v4.ts\ninterface NamesData {\n\tgetNameFlags(name: string): string | null;\n}\n\nexport interface SegmentResult {\n\t/** Segmentation type: PS, PSL, S, SL, P; `none` when a phrase classifier refused the input (`garbageVocab`) */\n\ttype: string;\n\t/** Person tokens (empty if no person span) */\n\tperson: string[];\n\t/** School tokens (empty if no school span) */\n\tschool: string[];\n\t/** Location tokens (empty if no location span) */\n\tlocation: string[];\n\t/** Boundary index (end of person span) */\n\tboundary: number;\n\t/** Model confidence (0-1) */\n\tconfidence: number;\n\t/** Whether Team pattern was detected */\n\tisTeam: boolean;\n}\n\nexport interface Segmenter {\n\t/** Segment a combined name string */\n\tsegment(input: string): SegmentResult;\n\t/** Segment pre-tokenized input */\n\tsegmentTokens(tokens: string[]): SegmentResult;\n\t/** Check if string starts with \"Team X\", or ends with a team designation (`<school> - B`) */\n\tisTeamPattern(input: string): boolean;\n\t/** Find concept word positions in token sequence */\n\tfindConceptAnchors(tokens: string[]): number[];\n}\n\n/**\n * `isStopword`, the concept words and the token predicates are defined once, in\n * `seg/tokenize.ts`; the features in `seg/features.ts` and the model in\n * `seg/model.ts`. This file was a self-contained copy of all three, kept in step\n * with the trainer's copies by nobody noticing they had to be.\n */\n\n// =============================================================================\n// Factory\n// =============================================================================\n\nexport function createSegmenter(\n\tdata: NamesData,\n\tweights: SegmenterWeights = weightsJson as SegmenterWeights,\n): Segmenter {\n\tconst getFlags = (name: string) => data.getNameFlags(name);\n\n\tfunction extractAllFeatures(tokens: string[]): TokenFeatures[] {\n\t\treturn tokens.map((t) => extractTokenFeatures(t, getFlags));\n\t}\n\n\t/**\n\t * Where the trailing designation starts, counted FROM THE END of the caller's tokens: the\n\t * letter, then an optional designation word, then an optional dash, skipping empty tokens.\n\t * Counting from the end keeps the school part as the caller tokenized it, however that was\n\t * (`[\"Quorrish Academy\", \"-\", \"B\"]` keeps `\"Quorrish Academy\"` whole and drops the dash).\n\t */\n\tfunction designationStart(tokens: string[]): number {\n\t\tlet i = tokens.length;\n\t\tconst skipEmpty = (): void => {\n\t\t\twhile (i > 0 && tokens[i - 1]!.trim() === \"\") i--;\n\t\t};\n\t\tskipEmpty();\n\t\ti--; // the letter\n\t\tskipEmpty();\n\t\tconst word = tokens[i - 1]?.trim().toLowerCase();\n\t\tif (word !== undefined && WORDS.has(word)) i--;\n\t\tskipEmpty();\n\t\tif (i > 0 && /^[-\\u2013]$/u.test(tokens[i - 1]!.trim())) i--;\n\t\tskipEmpty();\n\t\treturn i;\n\t}\n\n\t/**\n\t * `suffix` is the cell's trailing designation as `partitionTeamSuffix` read it, from the\n\t * string the caller holds: `segment` asks it of the input, `segmentTokens` of the tokens\n\t * joined, so `segment`, `isTeamPattern` and the phrase classifier read one rule.\n\t */\n\tfunction segmentWith(tokens: string[], suffix: TeamSuffixPartition | null): SegmentResult {\n\t\tconst n = tokens.length;\n\n\t\t// Single token -> all school\n\t\tif (n < 2) {\n\t\t\treturn {\n\t\t\t\ttype: \"S\",\n\t\t\t\tperson: [],\n\t\t\t\tschool: tokens,\n\t\t\t\tlocation: [],\n\t\t\t\tboundary: 0,\n\t\t\t\tconfidence: 1.0,\n\t\t\t\tisTeam: false,\n\t\t\t};\n\t\t}\n\n\t\t// Fast path: Team X pattern\n\t\tconst teamBoundary = getTeamBoundary(tokens);\n\t\tif (teamBoundary !== null) {\n\t\t\treturn {\n\t\t\t\ttype: \"PS\",\n\t\t\t\tperson: tokens.slice(0, teamBoundary),\n\t\t\t\tschool: tokens.slice(teamBoundary),\n\t\t\t\tlocation: [],\n\t\t\t\tboundary: teamBoundary,\n\t\t\t\tconfidence: 1.0,\n\t\t\t\tisTeam: true,\n\t\t\t};\n\t\t}\n\n\t\t// Fast path: a trailing designation (`<school> - B`, `<school> Team B`). Structure, not\n\t\t// a name: the school part is the school, the designation is dropped, nothing is scored.\n\t\tif (suffix !== null) {\n\t\t\tconst school = tokens.slice(0, designationStart(tokens));\n\t\t\treturn {\n\t\t\t\ttype: \"S\",\n\t\t\t\tperson: [],\n\t\t\t\tschool,\n\t\t\t\tlocation: [],\n\t\t\t\tboundary: 0,\n\t\t\t\tconfidence: 1.0,\n\t\t\t\tisTeam: true,\n\t\t\t};\n\t\t}\n\n\t\tconst tokenFeatures = extractAllFeatures(tokens);\n\t\tconst emissions = computeTokenEmissions(tokenFeatures, weights);\n\t\tlet candidates = enumerateSegmentations(n);\n\n\t\t// Apply concept word anchors\n\t\tconst conceptAnchors = findConceptAnchorsInternal(tokens);\n\t\tif (conceptAnchors.length > 0) {\n\t\t\tcandidates = candidates.filter((seg) => !violatesConceptAnchors(seg, conceptAnchors));\n\t\t\tif (candidates.length === 0) {\n\t\t\t\t// Fallback to all-school\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"S\",\n\t\t\t\t\tperson: [],\n\t\t\t\t\tschool: tokens,\n\t\t\t\t\tlocation: [],\n\t\t\t\t\tboundary: 0,\n\t\t\t\t\tconfidence: 1.0,\n\t\t\t\t\tisTeam: false,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// Score all candidates\n\t\tconst scores = candidates.map((seg) =>\n\t\t\tscoreSegmentation(tokenFeatures, emissions, seg, weights),\n\t\t);\n\n\t\t// Apply temperature\n\t\tconst temp = weights.temperature ?? 1.0;\n\t\tconst scaledScores = temp !== 1.0 ? scores.map((s) => s / temp) : scores;\n\t\tconst probs = softmax(scaledScores);\n\n\t\t// Find best\n\t\tlet bestIdx = 0;\n\t\tfor (let i = 1; i < probs.length; i++) {\n\t\t\tif (probs[i]! > probs[bestIdx]!) bestIdx = i;\n\t\t}\n\n\t\tconst best = candidates[bestIdx]!;\n\t\tconst boundary = best.type === \"S\" ? 0 : best.boundaries[0]!;\n\t\tconst schoolEnd = best.type === \"PSL\" || best.type === \"SL\" ? best.boundaries[1]! : n;\n\n\t\treturn {\n\t\t\ttype: best.type,\n\t\t\tperson: tokens.slice(0, boundary),\n\t\t\tschool: tokens.slice(boundary, schoolEnd),\n\t\t\tlocation: tokens.slice(schoolEnd),\n\t\t\tboundary,\n\t\t\tconfidence: probs[bestIdx]!,\n\t\t\tisTeam: false,\n\t\t};\n\t}\n\n\tfunction segmentTokens(tokens: string[]): SegmentResult {\n\t\treturn segmentWith(tokens, partitionTeamSuffix(tokens.join(\" \")));\n\t}\n\n\tfunction segment(input: string): SegmentResult {\n\t\treturn segmentWith(tokenize(input), partitionTeamSuffix(input));\n\t}\n\n\tfunction isTeamPattern(input: string): boolean {\n\t\treturn getTeamBoundary(tokenize(input)) !== null || partitionTeamSuffix(input) !== null;\n\t}\n\n\tfunction findConceptAnchors(tokens: string[]): number[] {\n\t\treturn findConceptAnchorsInternal(tokens);\n\t}\n\n\treturn {\n\t\tsegment,\n\t\tsegmentTokens,\n\t\tisTeamPattern,\n\t\tfindConceptAnchors,\n\t};\n}\n",
|
|
16
16
|
"/**\n * Name Classifier v4 Library (BF + LUT + Boundary Detection + Segmentation)\n *\n * Combines bloom filter features with names.txt lookup.\n * Adds boundary detection: isOnlyPerson, isPersonConcat\n * Adds segmentation: splits token sequences into Person/School/Location spans\n * Accepts external name lookup to pick up names.txt changes at runtime.\n */\n\nimport { FEATURE_NAMES, exactMatch, extractFeatures } from \"./features.ts\";\nimport { weights as SHIPPED } from \"./weights-v4.ts\";\n\n// Re-export segmentation API (will be bundled together, sharing bloom filters)\nexport { createSegmenter } from \"./seg-library.ts\";\nexport type { Segmenter, SegmenterWeights, SegmentResult } from \"./seg-library.ts\";\n\n// Re-export constants for consumers\nexport { CONNECTORS, SCHOOL_KEYWORDS } from \"./constants.ts\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface NamesData {\n\tgetNameFlags(name: string): string | null;\n\tmatchBigramContinuations?(firstWord: string): string[][] | null;\n}\n\nexport interface ClassifyResult {\n\tperson: number;\n\tschool: number;\n\tlocation: number;\n}\n\nexport interface BoundaryResult {\n\tonlyPerson: number;\n\tpersonConcat: number;\n}\n\n/**\n * `none` is the refusal: a phrase the caller declared garbage (`garbageVocab`) is not a\n * person, a school or a place. The trained model never answers it.\n */\nexport type NameCategory = \"person\" | \"school\" | \"location\" | \"none\";\n\nexport interface NormalizedResult {\n\tscores: ClassifyResult;\n\tconfidence: number;\n\tcategory: NameCategory;\n}\n\nexport interface NameClassifier {\n\t// Category classification\n\tclassifyName(phrase: string): ClassifyResult;\n\tclassifyNameNormalized(phrase: string): NormalizedResult;\n\tgetNameCategory(phrase: string): NameCategory;\n\tisPerson(phrase: string, threshold?: number): boolean;\n\tisSchool(phrase: string, threshold?: number): boolean;\n\tisLocation(phrase: string, threshold?: number): boolean;\n\t// Boundary detection\n\tclassifyBoundary(phrase: string): BoundaryResult;\n\tisOnlyPerson(phrase: string, threshold?: number): boolean;\n\tisPersonConcat(phrase: string, threshold?: number): boolean;\n}\n\n/** One logistic regression: a weight per feature (`FEATURE_NAMES` order) and a bias. */\nexport interface LogisticWeights {\n\treadonly weights: readonly number[];\n\treadonly bias: number;\n}\n\n/**\n * The five regressions `createClassifier` runs. The default is the shipped set; a\n * trainer passes its own to evaluate them through this same code.\n */\nexport interface ClassifierWeights {\n\treadonly person: LogisticWeights;\n\treadonly school: LogisticWeights;\n\treadonly location: LogisticWeights;\n\treadonly onlyPerson: LogisticWeights;\n\treadonly personConcat: LogisticWeights;\n}\n\n// =============================================================================\n// Core\n// =============================================================================\n\nfunction sigmoid(x: number): number {\n\treturn 1 / (1 + Math.exp(-Math.max(-500, Math.min(500, x))));\n}\n\nfunction predict(model: { weights: readonly number[]; bias: number }, features: number[]): number {\n\tlet sum = model.bias;\n\tfor (let i = 0; i < features.length; i++) {\n\t\tsum += model.weights[i]! * features[i]!;\n\t}\n\treturn sigmoid(sum);\n}\n\n// =============================================================================\n// Factory Function\n// =============================================================================\n\nexport function createClassifier(\n\tdata: NamesData,\n\tweights: ClassifierWeights = SHIPPED,\n): NameClassifier {\n\tfor (const m of [\"person\", \"school\", \"location\", \"onlyPerson\", \"personConcat\"] as const)\n\t\tif (weights[m].weights.length !== FEATURE_NAMES.length)\n\t\t\tthrow new Error(\n\t\t\t\t`classifier weights: ${m} has ${weights[m].weights.length} weights, the features are ${FEATURE_NAMES.length}`,\n\t\t\t);\n\tconst getFlags = (name: string) => data.getNameFlags(name);\n\tconst matchBigrams = data.matchBigramContinuations\n\t\t? (word: string) => data.matchBigramContinuations!(word)\n\t\t: undefined;\n\n\tfunction tryExactMatch(phrase: string): ClassifyResult | null {\n\t\treturn exactMatch(phrase, getFlags);\n\t}\n\n\tfunction classifyName(phrase: string): ClassifyResult {\n\t\t// Try exact match first\n\t\tconst exactMatch = tryExactMatch(phrase);\n\t\tif (exactMatch) return exactMatch;\n\n\t\tconst features = extractFeatures(phrase, getFlags, matchBigrams);\n\t\treturn {\n\t\t\tperson: predict(weights.person, features),\n\t\t\tschool: predict(weights.school, features),\n\t\t\tlocation: predict(weights.location, features),\n\t\t};\n\t}\n\n\tfunction classifyBoundary(phrase: string): BoundaryResult {\n\t\t// For boundary detection, exact school/location match means NOT only person\n\t\tconst exactMatch = tryExactMatch(phrase);\n\t\tif (exactMatch) {\n\t\t\tif (exactMatch.school === 1 || exactMatch.location === 1) {\n\t\t\t\treturn { onlyPerson: 0, personConcat: 0 };\n\t\t\t}\n\t\t\tif (exactMatch.person === 1) {\n\t\t\t\treturn { onlyPerson: 1, personConcat: 0 };\n\t\t\t}\n\t\t}\n\n\t\tconst features = extractFeatures(phrase, getFlags, matchBigrams);\n\t\treturn {\n\t\t\tonlyPerson: predict(weights.onlyPerson, features),\n\t\t\tpersonConcat: predict(weights.personConcat, features),\n\t\t};\n\t}\n\n\tfunction normalize(raw: ClassifyResult): ClassifyResult {\n\t\tconst { person, school, location } = raw;\n\t\tconst sum = person + school + location;\n\t\tif (sum === 0) return { person: 1 / 3, school: 1 / 3, location: 1 / 3 };\n\t\treturn { person: person / sum, school: school / sum, location: location / sum };\n\t}\n\n\tfunction classifyNameNormalized(phrase: string): NormalizedResult {\n\t\tconst raw = classifyName(phrase);\n\t\tconst scores = normalize(raw);\n\t\tconst sorted = [scores.person, scores.school, scores.location].sort((a, b) => b - a);\n\t\tconst confidence = sorted[0]! - sorted[1]!;\n\t\tconst max = Math.max(scores.person, scores.school, scores.location);\n\t\tconst category: NameCategory =\n\t\t\tscores.person === max ? \"person\" : scores.school === max ? \"school\" : \"location\";\n\t\treturn { scores, confidence, category };\n\t}\n\n\tfunction getNameCategory(phrase: string): NameCategory {\n\t\tconst scores = classifyName(phrase);\n\t\tconst max = Math.max(scores.person, scores.school, scores.location);\n\t\tif (scores.person === max) return \"person\";\n\t\tif (scores.school === max) return \"school\";\n\t\treturn \"location\";\n\t}\n\n\tfunction isPerson(phrase: string, threshold = 0.5): boolean {\n\t\treturn classifyName(phrase).person >= threshold;\n\t}\n\n\tfunction isSchool(phrase: string, threshold = 0.5): boolean {\n\t\treturn classifyName(phrase).school >= threshold;\n\t}\n\n\tfunction isLocation(phrase: string, threshold = 0.5): boolean {\n\t\treturn classifyName(phrase).location >= threshold;\n\t}\n\n\tfunction isOnlyPerson(phrase: string, threshold = 0.5): boolean {\n\t\treturn classifyBoundary(phrase).onlyPerson >= threshold;\n\t}\n\n\tfunction isPersonConcat(phrase: string, threshold = 0.5): boolean {\n\t\treturn classifyBoundary(phrase).personConcat >= threshold;\n\t}\n\n\treturn {\n\t\tclassifyName,\n\t\tclassifyNameNormalized,\n\t\tgetNameCategory,\n\t\tisPerson,\n\t\tisSchool,\n\t\tisLocation,\n\t\tclassifyBoundary,\n\t\tisOnlyPerson,\n\t\tisPersonConcat,\n\t};\n}\n",
|
|
17
17
|
"/**\n * Trained weights for name classifier v4, given-first: only the examples from documents that\n * declare given-first (`nameFormat`); undeclared documents' examples are not in them.\n * Trained by `training/train-phrase.ts --fit all --order given-first` on corpus-v3.0.0-188,\n * solo competitions, seed 1, generated 2026-10-02T03:05:27.756Z. Category examples\n * 95050, boundary examples 329302. Never edited by hand: retrain to change.\n */\n\nexport const weights = {\n \"person\": {\n \"weights\": [\n 0.6195199206419814,\n -0.8202054580721198,\n -0.23355668690608186,\n 0.0006666731860548,\n -0.7415146439094898,\n 0.8370590048801871,\n 0.0996785576760308,\n 0.1756201354749242,\n -0.34561851048797404,\n -1.245578354477327,\n 0.0957267312842454,\n -0.18200978593580894,\n 0.23450254648973057,\n -0.47279344138789664,\n 0.5964208652501063,\n 0.08059506410198101,\n -0.40988854615164366,\n 1.0280069278695163,\n 0.18771296988983163,\n 0.3298522433962064,\n 0.24547853245301973,\n -0.33926062949177893,\n 1.936903885259617,\n 0.03709828291211923,\n -0.29266105947278237,\n 0.3751329166375387,\n -0.5335556420951678,\n 0.15863425750785,\n 0.00020704001779874777,\n 0.8668987670287303,\n 0.059049595983843566,\n -0.06603771207934131,\n 0.35803746591073704,\n -0.9399317404506027,\n -0.615630355512877,\n -1.6428516326695723,\n -0.7898461504872063,\n 0.06591846674923782,\n 1.7363416614388603,\n -1.0161812749486085,\n -3.0765226977359243,\n 0.826399514189808,\n 0.5224790491754983,\n -0.21788428728114131,\n -0.2261405706712043,\n 0.2738235009627903,\n 0.5619203292961242,\n -1.1120925700124946,\n 1.755962756716922,\n 0.9003496064793057,\n -2.352126714839257,\n 1.4815680725003448,\n -0.33236546854827037,\n -1.1301405460764247,\n 0.23405898244185927,\n 0.1737657118948418,\n -0.15795495670860088,\n 0.9055045894596289,\n -0.6832323802058374,\n 5.342371002715105,\n -4.900059998737134,\n -2.2920531753715316,\n 0.11464581751195647,\n -0.16923158764142016,\n -0.37932244216238326,\n -1.417505522010709,\n 0.28206843264084996,\n 0.0908164602980898,\n -1.5976036976153123,\n 0.25971778680154844,\n -0.9329879249077894,\n -0.6600754858347005,\n -0.26386343858258554\n ],\n \"bias\": -1.95954666657718\n },\n \"school\": {\n \"weights\": [\n -1.0544998706758575,\n -0.10384330483602566,\n -0.03400080976359632,\n 0.8313971142747015,\n 0.4387971241561891,\n -1.3464173611033428,\n -0.2905776022610812,\n -0.13475820785959888,\n 0.418685654139068,\n 1.731573345542497,\n -0.286599463613448,\n 0.1516548524107816,\n 0.20983812386642994,\n -0.4166739377552944,\n 0.09087894894445066,\n -0.015679477555402645,\n 0.041323666538506096,\n -1.1415558889661859,\n -0.5799022418796994,\n 0.4522583228673876,\n -0.6210160911487462,\n 0.3336346006316047,\n -1.176208013703989,\n 0.6867655966101326,\n -0.4446885391145362,\n 0.5265712672487846,\n 0.38011283233471355,\n 0.20983567270312142,\n -0.06727403967252564,\n -0.2983296594118634,\n 0.23614413853687607,\n -0.5278079101189694,\n 0.04784604642793379,\n 1.8648526935448582,\n 1.19773838547731,\n -3.880891222703581,\n 0.9485565002279587,\n -0.38219589161370593,\n -1.3722685730178468,\n 0.8353962039777545,\n -0.3923143574083318,\n 0.46753250840980604,\n -0.08940963517657012,\n 0.25231580748965937,\n 0.502409784363176,\n 2.0382728864206894,\n -0.7889324119016248,\n 1.0197045767866382,\n -0.7577108897449616,\n -0.2058364816516351,\n 1.8119784407048685,\n -2.11514582772018,\n -1.263276099426621,\n 0.40183934731152565,\n -0.1300164520213836,\n 0.20019690522279035,\n 0.4385011614456507,\n 0.3415665081591304,\n 0.8482148660128757,\n -3.431677237213499,\n 4.437032257587943,\n 3.233047831597354,\n -0.06756605511040065,\n -0.19311654039251175,\n 0.013894077840652228,\n 0.5879133471354547,\n -0.48729964911706913,\n -0.26537157554898394,\n 2.0466918755183925,\n 0.19832001653506906,\n -0.39418030595300074,\n 0.7327416374700382,\n -1.1994473180980794\n ],\n \"bias\": -1.2383085148252126\n },\n \"location\": {\n \"weights\": [\n 0.26357485181650303,\n 1.043627971804682,\n -0.30056548649217346,\n 0.8061631850467185,\n -1.1794763894619897,\n 1.5125422624625926,\n -0.5575044591117583,\n -0.23347077461309768,\n 0.0026616506012378054,\n -0.03742135586757933,\n -0.2569992548619351,\n -0.9269971016949216,\n -0.257910616757116,\n 0.24252720719954995,\n -0.924294877572842,\n -1.2934940583063086,\n 0.5219290985477636,\n -0.6866619984282517,\n -0.16093100269510965,\n -1.1967940260960832,\n -0.3921333308484023,\n 0.05674695222027627,\n -0.3908789202975646,\n 0.7233260243922744,\n 0.04478945051439172,\n -1.1070727269676857,\n -0.1072002547552028,\n -0.5893147244690041,\n -1.12824381866823,\n -0.6146137537870807,\n 0.45579479947045487,\n 0.7230038412707902,\n -1.5777174919794426,\n -0.23741140862588167,\n -1.6187858394801982,\n 3.872034044973391,\n 1.2861551424488946,\n 0.08920598835873424,\n -0.784366019001415,\n 0.14006271631384662,\n 2.8076407175425797,\n -2.049773555492032,\n -1.326241802002101,\n -0.7732992808385678,\n -0.37696002276291013,\n 0.2716631170377265,\n 0.06507427158477434,\n -0.19907159475432762,\n -1.5304655219479075,\n -0.8513438311679482,\n 0.5519114106518352,\n -1.2892381089644152,\n -0.05468803001248956,\n 0.3912471558270733,\n -0.15365209464725618,\n -0.020800743361180103,\n -0.3098290335805803,\n -0.20668292078595574,\n -0.5160023710381304,\n -0.06907589150807357,\n -1.3839703262464642,\n -1.0224576039043933,\n -1.2212805476961943,\n 0.26316941728231696,\n 0.5282666006808578,\n -0.8747163339890432,\n -0.09985295278472447,\n -0.24947692198407795,\n -0.49230275728472134,\n -0.2674782222516313,\n 0.42878843835689506,\n -0.22841290628570055,\n -0.12912228577529597\n ],\n \"bias\": -0.5617950732393108\n },\n \"onlyPerson\": {\n \"weights\": [\n 1.3199784748656738,\n 0.6147080401631639,\n 0.0714266893250333,\n -0.16386273646182628,\n -0.8418972664696797,\n 1.4619846538759154,\n 0.20955675258299739,\n -0.6102732582009475,\n -0.3518288198532537,\n -0.9351686862931406,\n 1.2724017294342524,\n 0.5064048983803947,\n 0.47016073920771306,\n -4.371212906286964,\n 0.8224829301353678,\n 0.3469898720789701,\n 0.07881232912396183,\n 2.170545337729337,\n 0.4811719230625672,\n -0.1441772696052077,\n -0.02642850163258862,\n 0.6802785835469782,\n 1.1535834028160679,\n -0.8884623318210739,\n 0.14772259592376655,\n -0.3195343900430349,\n 0.013998334376445395,\n -0.2456475885807741,\n 2.077630539571615,\n -0.28622520026997406,\n -0.3825396234639853,\n 0.17054177253480193,\n -0.882432127871201,\n 0.05046010820871394,\n -0.7253321346413256,\n -2.964530254068059,\n 0.07443316244108057,\n 0.8540769981750209,\n 3.181485760933891,\n -0.6902755524939809,\n -5.838981884958765,\n 0.3387244479793421,\n 1.191289085668101,\n 0.6411191911795364,\n -0.20077086605172922,\n 1.514226591843206,\n 0.9035148795497974,\n -1.4959820188184194,\n 1.6015440944380357,\n -1.4598477142267734,\n -2.770550800821848,\n 2.2091049308381203,\n -1.8517240875527197,\n -1.1060919382440537,\n -0.7883145069828679,\n 0.770619240004312,\n -0.6295608594273212,\n 2.346525351898181,\n -0.16587207685418706,\n 3.9366655127783057,\n -4.344779532076344,\n -1.8099460202376383,\n 0.32998965494851956,\n 0.4864756087640203,\n 0.10981809522708746,\n -0.31647246049880856,\n 0.43724250175874957,\n 1.2277506047612734,\n -0.7733837334838484,\n 0.40104762272914707,\n -2.535938125111339,\n -0.14298857969613682,\n -0.812625274743487\n ],\n \"bias\": -3.4294569704996785\n },\n \"personConcat\": {\n \"weights\": [\n 2.7040125232639127,\n 0.8607705424111824,\n -0.002147726582057801,\n 0.5917802918044546,\n -1.5365086390757163,\n 1.812463564831419,\n -1.632669940837512,\n 1.57470537137785,\n 0.3131981410505287,\n -1.2169272568925407,\n -0.12825906432662987,\n -0.0976211088039148,\n 0.29157685337453687,\n 3.1788711857475964,\n 0.4727893502437439,\n -0.11680148852928593,\n -0.14862109774523027,\n -0.7334354328439564,\n -0.2562391631875072,\n -0.23192474710890684,\n 0.03073073791276668,\n 2.0255000327556663,\n 0.9598302772270341,\n -0.426180737074724,\n -0.7508484990148684,\n 0.2764961799469655,\n -1.6677673691865942,\n -0.01641035094801428,\n 0.848249940032717,\n -0.15736621020251618,\n -0.4378346281700839,\n 0.4786013431585805,\n 0.29968968484760417,\n -3.6100458006640044,\n -1.6637878704843745,\n -0.5602754967911419,\n 0.39155974968965784,\n 0.1426681232043979,\n -2.055950305301061,\n 0.46022392801602263,\n -1.6345988569934498,\n 0.45939473386674595,\n 1.1769428346102495,\n -0.8091321935220755,\n 0.5475878923340445,\n 0.47059702228670375,\n 0.8679155699648028,\n -2.582184796460328,\n -0.2446317697965208,\n 2.440689646221024,\n -4.169691274713061,\n -8.465512496860208,\n -0.74522739924449,\n 1.5366748579272884,\n 2.0984860296191816,\n 2.6173914632792994,\n 0.950522237894,\n -1.4653305977837585,\n -0.34890759018098133,\n 3.6517543134064883,\n -0.9856027269614295,\n -3.941895317173533,\n -0.12545531202512478,\n -0.07553740941062605,\n -0.18736807657670682,\n -1.2749131977186092,\n -0.697406726311921,\n -0.18758145826832623,\n -2.233327387557046,\n 0.3089995894847142,\n 1.1561751005233283,\n 2.5064322003782364,\n -0.4957101244346029\n ],\n \"bias\": -7.096635188189562\n }\n} as const;\n",
|
|
18
18
|
"/**\n * Trained weights for name classifier v4, surname-first: only the examples from documents that\n * declare surname-first (`nameFormat`); undeclared documents' examples are not in them.\n * Trained by `training/train-phrase.ts --fit all --order surname-first` on corpus-v3.0.0-188,\n * solo competitions, seed 1, generated 2026-10-02T02:59:25.628Z. Category examples\n * 57586, boundary examples 129843. Never edited by hand: retrain to change.\n */\n\nexport const weights = {\n \"person\": {\n \"weights\": [\n -0.6802641337932245,\n 0.8548619672277231,\n 0.044691633048926406,\n 0.8841856128949623,\n -0.32249172486468675,\n 1.5218962119958412,\n 0.713179998821169,\n 0.13750906453159664,\n -0.3188430096747399,\n 1.390181166042834,\n 0.1421800006933851,\n -0.052312729745749964,\n -0.37781354246287424,\n 0.6176463499527647,\n 0.27197703568546044,\n 0.08333797974989691,\n 0.5192201985627591,\n -0.057607236098493386,\n 0.9632960343429329,\n 0.13719710885016814,\n 0.6030512052935172,\n 0.9136476295652554,\n 0.3923694018053142,\n 0.5058616329224156,\n 0.2060303218107819,\n -0.24090301319117946,\n 0.5408998705006768,\n 0.05805780260756167,\n -0.40461655144764935,\n -0.042402998532671404,\n 0.14552630297014668,\n 0.3121455155755663,\n -0.8081826454788347,\n 1.1106107610690084,\n -1.2910724625760666,\n -0.07881563743612562,\n -0.8214787552311315,\n 1.6634029142427427,\n -0.997712400401828,\n -0.29032357440451567,\n -1.7129279563041666,\n 1.039984628471868,\n 1.3544887615896468,\n 0.593369594198337,\n -0.8914555083027907,\n -1.5541167135274176,\n -0.15186185715206718,\n -0.3940736493271397,\n 1.239114049603093,\n -0.10371896572656196,\n -1.6252238568922885,\n 1.171347325988512,\n 0.3753633175617233,\n -0.25492106492792277,\n -0.04313903933237184,\n -0.014865465486615142,\n -0.35401916919641213,\n 0.2667532042592745,\n -1.2943830299514483,\n 0.7085420431552465,\n -3.926876419544795,\n -2.2542160329218954,\n 0.11738873315987168,\n 0.03724677725521601,\n 0.5497863025520175,\n 0.22912319138123838,\n -0.38748179749416695,\n 0.1372697297072374,\n -1.8037691383256322,\n -0.35259830215106513,\n -0.474332456499799,\n -0.3293270205171453,\n -0.24426691630054073\n ],\n \"bias\": -0.42574548703913623\n },\n \"school\": {\n \"weights\": [\n 0.6734632085324743,\n -0.7841107472500497,\n -0.01267738081847338,\n -0.8862698595622077,\n 0.36221436728394857,\n -1.4577856507349694,\n -0.6945546550007351,\n -0.11813142128245196,\n 0.35051098099164807,\n -1.4077104981129338,\n -0.15275782415431216,\n 0.07070068570978344,\n 0.3272724804850709,\n -0.5899042778216348,\n -0.23707822847655724,\n -0.08722175736947903,\n -0.5464868875902426,\n 0.0997585722324736,\n -1.0233703453932128,\n -0.1697629444953638,\n -0.5566421571932044,\n -0.8858448580130073,\n -0.37411226587566976,\n -0.4929689582607377,\n -0.2335115945490377,\n 0.2197586207430141,\n -0.5976580450856182,\n -0.09955947440053337,\n 0.4191855892218139,\n 0.02191624744050281,\n -0.13012065519757537,\n -0.3215575392808165,\n 0.8306722196488964,\n -1.1557329140813581,\n 1.280734056441089,\n -0.024998289358161774,\n 0.7958066190139574,\n -1.7008519635201507,\n 0.9598610072284148,\n 0.29551241133234324,\n 1.669033859140968,\n -1.088407155811417,\n -1.3370535096761935,\n -0.5684804181895554,\n 0.8608379877804008,\n 1.5781630825900745,\n 0.16226712467807178,\n 0.39208836459018437,\n -1.234804745241182,\n 0.12514548569712441,\n 1.690953261920599,\n -1.175716692076952,\n -0.35663839010641923,\n 0.25131086680736164,\n 0.14429460663394394,\n -0.0074620297221686,\n 0.30194708702994333,\n -0.25946592935733825,\n 1.2637618252658394,\n -0.6994377410264787,\n 3.91098951666482,\n 2.2046857212088553,\n -0.1391083349244567,\n -0.026019448384588972,\n -0.5739164762880925,\n -0.25185766273846827,\n 0.4343185306769878,\n -0.13152993608985242,\n 1.8127187241134113,\n 0.31575437315371585,\n 0.44101972544773754,\n 0.21386962048633798,\n 0.2615852383508134\n ],\n \"bias\": 0.4028567945600977\n },\n \"location\": {\n \"weights\": [\n -0.21765902811290552,\n -0.42645181205944593,\n -0.13946453149036686,\n -0.06899857365436717,\n -0.35231317249339855,\n -0.6819659590778303,\n -0.6011104932149923,\n -0.29261000570241924,\n -0.07433798455212268,\n -0.6543018622070438,\n -0.30298846056479467,\n -0.06590790012772062,\n -0.13030902368968983,\n -0.25550489418489,\n -0.5430646921863658,\n -0.09803925796143194,\n -0.2860127626943099,\n -0.6877138795108211,\n -0.5693826128465518,\n -0.11538766296698072,\n -0.19478602503135137,\n -0.3224752895736741,\n -0.8401735397923357,\n -0.7507956548919091,\n -0.2406861285480076,\n -0.46208283622915336,\n -0.3495187695591757,\n -0.08308934782242736,\n -0.2928286245020677,\n -0.1135948344095418,\n 0.0018437118935128096,\n 0.003404689434481628,\n -0.04662414819855964,\n -0.5487279978076887,\n -0.08448603521801377,\n -0.015288622885394645,\n -0.8134615168720808,\n -0.5683816137188481,\n 0.014732692947835684,\n -0.10896756582312958,\n 0.03761353663496375,\n -0.7298163464821324,\n -0.5584231138457028,\n -0.6186196414356776,\n -0.174131971738788,\n -0.04227620383204951,\n -0.11305130197314238,\n -0.08863551103678415,\n -0.5415464290208888,\n -0.570837427782285,\n -0.2240555361312711,\n -1.079826973511573,\n -0.08123348827984528,\n -0.027057914928536795,\n -0.005122941970121867,\n -0.010690400650978843,\n -0.04822560443570033,\n -0.027852871366763784,\n -0.1494883718346695,\n -0.3275828265103096,\n -0.518190137683569,\n -0.11268347796918961,\n -0.025825747351262158,\n -0.12404774477759929,\n -0.27967526056120917,\n -0.27082065845891856,\n -0.328667743662517,\n -0.2954661276869428,\n -0.09371477092329639,\n -0.13987662918421095,\n -0.14050228446892457,\n -0.030088324313229706,\n -0.035478999289307894\n ],\n \"bias\": -1.414561918205175\n },\n \"onlyPerson\": {\n \"weights\": [\n 0.2248254096049931,\n 1.217585324842893,\n -0.3073282020091678,\n 0.3198562444746799,\n 0.7663924330438184,\n 2.1511213252284302,\n -0.10973780442750451,\n -0.11019182204932611,\n -0.21671761300333436,\n 3.2435067463139173,\n 0.6057336785319238,\n 0.45092018376380866,\n 0.26600506823596937,\n -0.6769327138476003,\n 0.8569557818143896,\n 0.29954560428787447,\n -0.13880812732906034,\n -0.07268263641661278,\n 1.5823214003636075,\n 0.2136890599116029,\n 0.6351978738867924,\n 0.2112484854726797,\n -0.7150568870139336,\n 0.19557052538763137,\n -0.06876194929151791,\n -0.6076058050632626,\n -0.14288153726932218,\n 0.035105058334635,\n 0.33954729846751713,\n 0.2610330386959275,\n 0.2883807120891806,\n 0.09778758320147643,\n -0.18763308678650184,\n -0.16638398963219095,\n -0.6705328510749619,\n 0.4315658279686732,\n -0.7251352654902212,\n 4.574597511320742,\n -2.642735920065974,\n -1.4636922267015018,\n -3.148881592746076,\n 0.4536429938381194,\n 0.026250955669666412,\n 1.0476085222024605,\n -0.29958090280533206,\n -1.353860467977709,\n 1.8166904752226256,\n -1.256954441217474,\n -0.020698274317048695,\n -0.44891197500982327,\n -1.5111022263915628,\n 1.6809529762714368,\n -0.701551842105741,\n -0.8133703377901855,\n 0.11666082828615477,\n 0.05794963315515925,\n -0.23368395891020116,\n 0.9458979910878481,\n -1.9142140176726736,\n 0.45640742861295613,\n -2.785360713572069,\n -2.4519544564138833,\n 0.2825453871574616,\n -0.420843213097721,\n -0.10780236122610767,\n 0.12695557289795295,\n 1.0707650060165224,\n 0.5610825538589519,\n -2.0844548888812393,\n 0.19689195175740237,\n -1.5647324719281273,\n -0.2739005209307571,\n -0.13860792858753523\n ],\n \"bias\": -1.0210557404964498\n },\n \"personConcat\": {\n \"weights\": [\n -1.331228759474304,\n 0.9178038799000076,\n 0.421670811111696,\n 1.1294964663746134,\n -1.6246572777011679,\n 1.3148470404285397,\n 0.2832518117587816,\n -0.6285104047385536,\n 0.23951945437202846,\n -3.009066192527357,\n -0.3064010251173732,\n -0.6962616130478719,\n -0.0006103311682060597,\n 0.8865109274294649,\n -1.6413737585388817,\n -0.2380966551419231,\n 0.8406155360984569,\n -2.24277747743974,\n -1.222685185307904,\n 0.009327292918820047,\n -0.6399791668443053,\n 1.6047871204607216,\n 1.5119550058839448,\n -0.08726298667237668,\n -0.3936948664474824,\n 0.3947026239285945,\n 0.514144366227117,\n 0.9818625042975008,\n -0.0012631118860073397,\n -0.7920051478184,\n -0.09338824951471096,\n 0.24552496300099733,\n -2.122166654730588,\n 0.6873317733452251,\n -1.5774102779421042,\n -0.8507355037952126,\n 0.6642384954114076,\n -3.3414453446781818,\n 2.6801199748122704,\n 1.8480434476219738,\n 0.1619378038249343,\n 1.1358552068099441,\n 1.2755049996095402,\n -0.6987814316879185,\n 1.2555569345373698,\n 0.5080347391557241,\n -1.584329452912894,\n -1.674618431362743,\n 1.6244410693445963,\n 1.9267853986195633,\n -1.4833605705475903,\n -3.3222767613381063,\n -0.7380863853703215,\n 1.2497676211618842,\n 0.28278739203497355,\n -1.6452913605869461,\n -0.04770503697929005,\n -0.4589511017520741,\n 0.414290549507874,\n 2.2868860910796895,\n -1.737279846729174,\n -2.1419358003113422,\n -0.24675047863777372,\n 0.1031454858861457,\n 0.8018685572669799,\n -2.3818703533292145,\n -2.1170566185154263,\n -0.3657234190590508,\n -1.2546015374725163,\n 0.016812404941957664,\n 2.7178879063105423,\n 0.3639211261795243,\n -0.24614284108144613\n ],\n \"bias\": -5.627642503232043\n }\n} as const;\n",
|
|
19
|
-
"/**\n * The phrase classifier: the runtime classifier and segmenter bound to a lexicon.\n *\n * The classifier is designed for MULTI-TOKEN phrases. For a single token, ask the\n * lexicon (`Lexicon.getNameFlags`) directly.\n *\n * @example\n * ```ts\n * import { phraseClassifier } from \"@finbheara/names/classifier\";\n *\n * const pc = phraseClassifier(); // over the committed names.txt\n * pc.classifyName(\"Quorrish Kearenn\"); // { person: 0.00, school: 0.99, location: 0.00 }\n * pc.classifyNameNormalized(\"Quorrish Kearenn\");\n * // { scores: { person: 0.00, school: 1.00, location: 0.00 }, confidence: 0.99, category: \"school\" }\n * ```\n */\n\nimport { Lexicon } from \"../lexicon/index.ts\";\nimport { lexiconKey } from \"../lexicon/keys.ts\";\nimport type { NameOrder } from \"../normalize/name-split.ts\";\nimport { isTeamDesignationFragment, partitionTeamSuffix } from \"../normalize/team-name.ts\";\nimport { isPlacePhrase } from \"./features.ts\";\nimport {\n\ttype BoundaryResult,\n\ttype ClassifierWeights,\n\ttype ClassifyResult,\n\ttype NameCategory,\n\ttype NameClassifier,\n\ttype NamesData,\n\ttype NormalizedResult,\n\ttype SegmentResult,\n\ttype Segmenter,\n\ttype SegmenterWeights,\n\tcreateClassifier,\n\tcreateSegmenter,\n} from \"./library-v4.ts\";\nimport { splitWords } from \"./seg/tokenize.ts\";\nimport { weights as GIVEN_FIRST } from \"./weights-v4-given-first.ts\";\nimport { weights as SURNAME_FIRST } from \"./weights-v4-surname-first.ts\";\nimport { weights as UNKNOWN } from \"./weights-v4.ts\";\n\n/**\n * Every method that takes an `order` takes the name order the phrase's DOCUMENT declares\n * (a sheet's `nameFormat`), and defaults to `unknown`. A declared order selects the\n * weights fitted only on documents declaring it; `unknown` (or no order) selects the\n * weights fitted on every document with its order withheld. Pass a declaration, never a\n * guess: an order read off the phrase itself (`inferNameOrder`) is not one. The\n * overrides (a declared garbage phrase, a one-word place, a place phrase) answer first\n * under every order.\n */\nexport interface PhraseClassifier {\n\t/** Raw classification scores (independent sigmoids, don't sum to 1). */\n\tclassifyName(phrase: string, order?: NameOrder): ClassifyResult;\n\t/** Category with the highest raw score. */\n\tgetNameCategory(phrase: string, order?: NameOrder): NameCategory;\n\tisPerson(phrase: string, threshold?: number, order?: NameOrder): boolean;\n\tisSchool(phrase: string, threshold?: number, order?: NameOrder): boolean;\n\tisLocation(phrase: string, threshold?: number, order?: NameOrder): boolean;\n\t/** Scores that sum to 1, the margin between the top two, and the winner. */\n\tclassifyNameNormalized(phrase: string, order?: NameOrder): NormalizedResult;\n\t/** Is this only a person, or person + school/location? */\n\tclassifyBoundary(phrase: string, order?: NameOrder): BoundaryResult;\n\tisOnlyPerson(phrase: string, threshold?: number, order?: NameOrder): boolean;\n\tisPersonConcat(phrase: string, threshold?: number, order?: NameOrder): boolean;\n\t/**\n\t * Segment a combined name string into Person/School/Location spans.\n\t *\n\t * segment(\"Mary Kate O'Trurane Quorrish Dance Academy\")\n\t * // { type: 'PS', person: ['Mary', 'Kate', \"O'Trurane\"],\n\t * // school: ['Quorrish', 'Dance', 'Academy'], boundary: 3, ... }\n\t */\n\tsegment(input: string): SegmentResult;\n\tsegmentTokens(tokens: string[]): SegmentResult;\n\t/** \"Team X <school>\" forces boundary=2, and \"<school> - X\" all-school, with full confidence. */\n\tisTeamPattern(input: string): boolean;\n\t/** Concept word positions (Academy, School, Dance, ...), which must be labelled 'S'. */\n\tfindConceptAnchors(tokens: string[]): number[];\n\t/** The `unknown`-order classifier. */\n\treadonly classifier: NameClassifier;\n\treadonly segmenter: Segmenter;\n}\n\nexport interface PhraseClassifierOptions {\n\t/**\n\t * Phrases that are not names: page furniture, footers, headings (\"Results are\n\t * provisional\", \"Dance Drama\"). A phrase whose `lexiconKey` equals one of these\n\t * scores zero for every category, is categorised `none`, and segments to nothing.\n\t * The match is the WHOLE phrase, ignoring case, spacing and punctuation; a phrase\n\t * that merely contains one is classified as usual.\n\t *\n\t * A team designation fragment (`- A`, `-A`; not a bare letter) is refused the same way\n\t * without being listed: it names nothing. A school printed with its designation after\n\t * it (`St. Rerkaskby - B`) is classified, and bounded, as its school part.\n\t */\n\tgarbageVocab?: Iterable<string>;\n\t/**\n\t * Weights other than the shipped ones (a trainer evaluating its own). `classifier` is\n\t * the `unknown` set; `ordered` the declared-order sets. Given `classifier` and no\n\t * `ordered`, that one set answers every order.\n\t */\n\tweights?: {\n\t\tclassifier?: ClassifierWeights;\n\t\tordered?: Partial<Record<Exclude<NameOrder, \"unknown\">, ClassifierWeights>>;\n\t\tsegmenter?: SegmenterWeights;\n\t};\n}\n\n/**\n * The declared orders whose `location` regression is taken from the `unknown` set. A\n * declared fit learns only from its own documents, and surname-first documents print\n * almost no place column (their place rides in the school cell), so that fit's location\n * regression saw next to no place and is untrained. Its person and school regressions,\n * and its boundary regressions, are its own. The regressions are independent sigmoids\n * over the same features, so one can come from another fit; the normalised scores then\n * sum to 1 as before.\n */\nconst LOCATION_FROM_UNKNOWN: ReadonlySet<NameOrder> = new Set([\"surname-first\"]);\n\nconst ZERO: ClassifyResult = { person: 0, school: 0, location: 0 };\n\n/**\n * Normalize scores to sum to 1 (simple division, not softmax).\n * Softmax doesn't apply here since inputs are already probabilities.\n */\nfunction normalize(raw: ClassifyResult): ClassifyResult {\n\tconst { person, school, location } = raw;\n\tconst sum = person + school + location;\n\n\tif (sum === 0) {\n\t\treturn { person: 1 / 3, school: 1 / 3, location: 1 / 3 };\n\t}\n\n\treturn {\n\t\tperson: person / sum,\n\t\tschool: school / sum,\n\t\tlocation: location / sum,\n\t};\n}\n\n/**\n * Compute confidence as margin between top 2 scores\n */\nfunction computeConfidence(scores: ClassifyResult): number {\n\tconst sorted = [scores.person, scores.school, scores.location].sort((a, b) => b - a);\n\treturn (sorted[0] ?? 0) - (sorted[1] ?? 0); // margin between 1st and 2nd\n}\n\n/**\n * A phrase classifier over `names` (default: the committed lexicon), with the\n * shipped weights unless `weights` names others (a trainer evaluating its own).\n */\nexport function phraseClassifier(\n\tnames: NamesData = Lexicon.default(),\n\toptions: PhraseClassifierOptions = {},\n): PhraseClassifier {\n\tconst garbage = new Set<string>();\n\tfor (const phrase of options.garbageVocab ?? []) {\n\t\tconst key = lexiconKey(phrase);\n\t\tif (key) garbage.add(key);\n\t}\n\t/** the phrase a question is asked of: the school part of `<school> - B`, else the phrase */\n\tconst subject = (phrase: string): string => partitionTeamSuffix(phrase)?.school ?? phrase;\n\t/** declared garbage, as printed or as the school part of `<garbage> - B`; or a bare `- A` */\n\tconst isGarbage = (phrase: string): boolean =>\n\t\tisTeamDesignationFragment(phrase) ||\n\t\t(garbage.size > 0 &&\n\t\t\t(garbage.has(lexiconKey(phrase)) || garbage.has(lexiconKey(subject(phrase)))));\n\tconst refused = (): SegmentResult => ({\n\t\ttype: \"none\",\n\t\tperson: [],\n\t\tschool: [],\n\t\tlocation: [],\n\t\tboundary: 0,\n\t\tconfidence: 0,\n\t\tisTeam: false,\n\t});\n\n\tconst namesData: NamesData = {\n\t\tgetNameFlags: (n) => names.getNameFlags(n),\n\t\tmatchBigramContinuations: (w) => names.matchBigramContinuations?.(w) ?? null,\n\t};\n\tconst w = options.weights;\n\tconst classifier = createClassifier(namesData, w?.classifier);\n\tconst declared = (o: Exclude<NameOrder, \"unknown\">, shipped: ClassifierWeights) => {\n\t\tconst set = w?.ordered?.[o] ?? (w?.classifier ? undefined : shipped);\n\t\tif (!set) return classifier;\n\t\tconst location = LOCATION_FROM_UNKNOWN.has(o)\n\t\t\t? (w?.classifier ?? UNKNOWN).location\n\t\t\t: set.location;\n\t\treturn createClassifier(namesData, { ...set, location });\n\t};\n\tconst byOrder: Record<NameOrder, NameClassifier> = {\n\t\tunknown: classifier,\n\t\t\"given-first\": declared(\"given-first\", GIVEN_FIRST),\n\t\t\"surname-first\": declared(\"surname-first\", SURNAME_FIRST),\n\t};\n\tconst model = (order: NameOrder = \"unknown\"): NameClassifier => byOrder[order] ?? classifier;\n\tconst segmenter = createSegmenter(namesData, options.weights?.segmenter);\n\n\tconst PLACE: ClassifyResult = { person: 0.05, school: 0.05, location: 0.9 };\n\n\t/**\n\t * A place the lexicon names outright is a location, without the regression:\n\t * - a single word with the G flag is almost certainly a location (\"Virginia\",\n\t * \"Texas\", \"Maryland\"), not a person's first name;\n\t * - a phrase of place words, none a given name or a school's name\n\t * (`isPlacePhrase`: \"Hilton Baltimore\").\n\t */\n\tfunction placeOverride(phrase: string): ClassifyResult | null {\n\t\tconst trimmed = phrase.trim();\n\t\tif (splitWords(trimmed).length !== 1)\n\t\t\treturn isPlacePhrase(trimmed, (n) => names.getNameFlags(n)) ? { ...PLACE } : null;\n\t\tconst flags = names.getNameFlags(trimmed);\n\t\tif (!flags) return null;\n\t\tif (flags.includes(\"G\")) return { ...PLACE };\n\t\treturn null;\n\t}\n\n\tfunction classifyName(phrase: string, order?: NameOrder): ClassifyResult {\n\t\tif (isGarbage(phrase)) return { ...ZERO };\n\t\tconst s = subject(phrase);\n\t\treturn placeOverride(s) ?? model(order).classifyName(s);\n\t}\n\n\tfunction category(scores: ClassifyResult): NameCategory {\n\t\tconst max = Math.max(scores.person, scores.school, scores.location);\n\t\tif (max === 0) return \"none\";\n\t\tif (scores.person === max) return \"person\";\n\t\tif (scores.school === max) return \"school\";\n\t\treturn \"location\";\n\t}\n\n\treturn {\n\t\tclassifyName,\n\t\tgetNameCategory: (phrase, order) => category(classifyName(phrase, order)),\n\t\tisPerson: (phrase, threshold = 0.5, order?: NameOrder) =>\n\t\t\tclassifyName(phrase, order).person >= threshold,\n\t\tisSchool: (phrase, threshold = 0.5, order?: NameOrder) =>\n\t\t\tclassifyName(phrase, order).school >= threshold,\n\t\tisLocation: (phrase, threshold = 0.5, order?: NameOrder) =>\n\t\t\tclassifyName(phrase, order).location >= threshold,\n\t\tclassifyNameNormalized(phrase, order) {\n\t\t\tif (isGarbage(phrase)) return { scores: { ...ZERO }, confidence: 0, category: \"none\" };\n\t\t\tconst scores = normalize(classifyName(phrase, order));\n\t\t\treturn { scores, confidence: computeConfidence(scores), category: category(scores) };\n\t\t},\n\t\tclassifyBoundary: (phrase, order) =>\n\t\t\tisGarbage(phrase)\n\t\t\t\t? { onlyPerson: 0, personConcat: 0 }\n\t\t\t\t: model(order).classifyBoundary(subject(phrase)),\n\t\tisOnlyPerson: (phrase, threshold = 0.5, order?: NameOrder) =>\n\t\t\t!isGarbage(phrase) && model(order).isOnlyPerson(subject(phrase), threshold),\n\t\tisPersonConcat: (phrase, threshold = 0.5, order?: NameOrder) =>\n\t\t\t!isGarbage(phrase) && model(order).isPersonConcat(subject(phrase), threshold),\n\t\tsegment: (input) => (isGarbage(input) ? refused() : segmenter.segment(input)),\n\t\tsegmentTokens: (tokens) =>\n\t\t\tisGarbage(tokens.join(\" \")) ? refused() : segmenter.segmentTokens(tokens),\n\t\tisTeamPattern: (input) => segmenter.isTeamPattern(input),\n\t\tfindConceptAnchors: (tokens) => segmenter.findConceptAnchors(tokens),\n\t\tclassifier,\n\t\tsegmenter,\n\t};\n}\n"
|
|
19
|
+
"/**\n * The phrase classifier: the runtime classifier and segmenter bound to a lexicon.\n *\n * The classifier is designed for MULTI-TOKEN phrases. For a single token, ask the\n * lexicon (`Lexicon.getNameFlags`) directly.\n *\n * @example\n * ```ts\n * import { phraseClassifier } from \"@finbheara/names/classifier\";\n *\n * const pc = phraseClassifier(); // over the committed names.txt\n * pc.classifyName(\"Quorrish Kearenn\"); // { person: 0.00, school: 0.99, location: 0.00 }\n * pc.classifyNameNormalized(\"Quorrish Kearenn\");\n * // { scores: { person: 0.00, school: 1.00, location: 0.00 }, confidence: 0.99, category: \"school\" }\n * ```\n */\n\nimport { Lexicon } from \"../lexicon/index.ts\";\nimport { lexiconKey } from \"../lexicon/keys.ts\";\nimport type { NameOrder } from \"../normalize/name-split.ts\";\nimport { isTeamDesignationFragment, partitionTeamSuffix } from \"../normalize/team-name.ts\";\nimport { isCommaPlacePhrase, isPlacePhrase } from \"./features.ts\";\nimport {\n\ttype BoundaryResult,\n\ttype ClassifierWeights,\n\ttype ClassifyResult,\n\ttype NameCategory,\n\ttype NameClassifier,\n\ttype NamesData,\n\ttype NormalizedResult,\n\ttype SegmentResult,\n\ttype Segmenter,\n\ttype SegmenterWeights,\n\tcreateClassifier,\n\tcreateSegmenter,\n} from \"./library-v4.ts\";\nimport { splitWords } from \"./seg/tokenize.ts\";\nimport { weights as GIVEN_FIRST } from \"./weights-v4-given-first.ts\";\nimport { weights as SURNAME_FIRST } from \"./weights-v4-surname-first.ts\";\nimport { weights as UNKNOWN } from \"./weights-v4.ts\";\n\n/**\n * Every method that takes an `order` takes the name order the phrase's DOCUMENT declares\n * (a sheet's `nameFormat`), and defaults to `unknown`. A declared order selects the\n * weights fitted only on documents declaring it; `unknown` (or no order) selects the\n * weights fitted on every document with its order withheld. Pass a declaration, never a\n * guess: an order read off the phrase itself (`inferNameOrder`) is not one. The\n * overrides (a declared garbage phrase, a one-word place, a place phrase) answer first\n * under every order.\n */\nexport interface PhraseClassifier {\n\t/** Raw classification scores (independent sigmoids, don't sum to 1). */\n\tclassifyName(phrase: string, order?: NameOrder): ClassifyResult;\n\t/** Category with the highest raw score. */\n\tgetNameCategory(phrase: string, order?: NameOrder): NameCategory;\n\tisPerson(phrase: string, threshold?: number, order?: NameOrder): boolean;\n\tisSchool(phrase: string, threshold?: number, order?: NameOrder): boolean;\n\tisLocation(phrase: string, threshold?: number, order?: NameOrder): boolean;\n\t/** Scores that sum to 1, the margin between the top two, and the winner. */\n\tclassifyNameNormalized(phrase: string, order?: NameOrder): NormalizedResult;\n\t/** Is this only a person, or person + school/location? */\n\tclassifyBoundary(phrase: string, order?: NameOrder): BoundaryResult;\n\tisOnlyPerson(phrase: string, threshold?: number, order?: NameOrder): boolean;\n\tisPersonConcat(phrase: string, threshold?: number, order?: NameOrder): boolean;\n\t/**\n\t * Segment a combined name string into Person/School/Location spans.\n\t *\n\t * segment(\"Mary Kate O'Trurane Quorrish Dance Academy\")\n\t * // { type: 'PS', person: ['Mary', 'Kate', \"O'Trurane\"],\n\t * // school: ['Quorrish', 'Dance', 'Academy'], boundary: 3, ... }\n\t */\n\tsegment(input: string): SegmentResult;\n\tsegmentTokens(tokens: string[]): SegmentResult;\n\t/** \"Team X <school>\" forces boundary=2, and \"<school> - X\" all-school, with full confidence. */\n\tisTeamPattern(input: string): boolean;\n\t/** Concept word positions (Academy, School, Dance, ...), which must be labelled 'S'. */\n\tfindConceptAnchors(tokens: string[]): number[];\n\t/** The `unknown`-order classifier. */\n\treadonly classifier: NameClassifier;\n\treadonly segmenter: Segmenter;\n}\n\nexport interface PhraseClassifierOptions {\n\t/**\n\t * Phrases that are not names: page furniture, footers, headings (\"Results are\n\t * provisional\", \"Dance Drama\"). A phrase whose `lexiconKey` equals one of these\n\t * scores zero for every category, is categorised `none`, and segments to nothing.\n\t * The match is the WHOLE phrase, ignoring case, spacing and punctuation; a phrase\n\t * that merely contains one is classified as usual.\n\t *\n\t * A team designation fragment (`- A`, `-A`; not a bare letter) is refused the same way\n\t * without being listed: it names nothing. A school printed with its designation after\n\t * it (`St. Rerkaskby - B`) is classified, and bounded, as its school part.\n\t */\n\tgarbageVocab?: Iterable<string>;\n\t/**\n\t * Weights other than the shipped ones (a trainer evaluating its own). `classifier` is\n\t * the `unknown` set; `ordered` the declared-order sets. Given `classifier` and no\n\t * `ordered`, that one set answers every order.\n\t */\n\tweights?: {\n\t\tclassifier?: ClassifierWeights;\n\t\tordered?: Partial<Record<Exclude<NameOrder, \"unknown\">, ClassifierWeights>>;\n\t\tsegmenter?: SegmenterWeights;\n\t};\n}\n\n/**\n * The declared orders whose `location` regression is taken from the `unknown` set. A\n * declared fit learns only from its own documents, and surname-first documents print\n * almost no place column (their place rides in the school cell), so that fit's location\n * regression saw next to no place and is untrained. Its person and school regressions,\n * and its boundary regressions, are its own. The regressions are independent sigmoids\n * over the same features, so one can come from another fit; the normalised scores then\n * sum to 1 as before.\n */\nconst LOCATION_FROM_UNKNOWN: ReadonlySet<NameOrder> = new Set([\"surname-first\"]);\n\nconst ZERO: ClassifyResult = { person: 0, school: 0, location: 0 };\n\n/**\n * Normalize scores to sum to 1 (simple division, not softmax).\n * Softmax doesn't apply here since inputs are already probabilities.\n */\nfunction normalize(raw: ClassifyResult): ClassifyResult {\n\tconst { person, school, location } = raw;\n\tconst sum = person + school + location;\n\n\tif (sum === 0) {\n\t\treturn { person: 1 / 3, school: 1 / 3, location: 1 / 3 };\n\t}\n\n\treturn {\n\t\tperson: person / sum,\n\t\tschool: school / sum,\n\t\tlocation: location / sum,\n\t};\n}\n\n/**\n * Compute confidence as margin between top 2 scores\n */\nfunction computeConfidence(scores: ClassifyResult): number {\n\tconst sorted = [scores.person, scores.school, scores.location].sort((a, b) => b - a);\n\treturn (sorted[0] ?? 0) - (sorted[1] ?? 0); // margin between 1st and 2nd\n}\n\n/**\n * A phrase classifier over `names` (default: the committed lexicon), with the\n * shipped weights unless `weights` names others (a trainer evaluating its own).\n */\nexport function phraseClassifier(\n\tnames: NamesData = Lexicon.default(),\n\toptions: PhraseClassifierOptions = {},\n): PhraseClassifier {\n\tconst garbage = new Set<string>();\n\tfor (const phrase of options.garbageVocab ?? []) {\n\t\tconst key = lexiconKey(phrase);\n\t\tif (key) garbage.add(key);\n\t}\n\t/** the phrase a question is asked of: the school part of `<school> - B`, else the phrase */\n\tconst subject = (phrase: string): string => partitionTeamSuffix(phrase)?.school ?? phrase;\n\t/** declared garbage, as printed or as the school part of `<garbage> - B`; or a bare `- A` */\n\tconst isGarbage = (phrase: string): boolean =>\n\t\tisTeamDesignationFragment(phrase) ||\n\t\t(garbage.size > 0 &&\n\t\t\t(garbage.has(lexiconKey(phrase)) || garbage.has(lexiconKey(subject(phrase)))));\n\tconst refused = (): SegmentResult => ({\n\t\ttype: \"none\",\n\t\tperson: [],\n\t\tschool: [],\n\t\tlocation: [],\n\t\tboundary: 0,\n\t\tconfidence: 0,\n\t\tisTeam: false,\n\t});\n\n\tconst namesData: NamesData = {\n\t\tgetNameFlags: (n) => names.getNameFlags(n),\n\t\tmatchBigramContinuations: (w) => names.matchBigramContinuations?.(w) ?? null,\n\t};\n\tconst w = options.weights;\n\tconst classifier = createClassifier(namesData, w?.classifier);\n\tconst declared = (o: Exclude<NameOrder, \"unknown\">, shipped: ClassifierWeights) => {\n\t\tconst set = w?.ordered?.[o] ?? (w?.classifier ? undefined : shipped);\n\t\tif (!set) return classifier;\n\t\tconst location = LOCATION_FROM_UNKNOWN.has(o)\n\t\t\t? (w?.classifier ?? UNKNOWN).location\n\t\t\t: set.location;\n\t\treturn createClassifier(namesData, { ...set, location });\n\t};\n\tconst byOrder: Record<NameOrder, NameClassifier> = {\n\t\tunknown: classifier,\n\t\t\"given-first\": declared(\"given-first\", GIVEN_FIRST),\n\t\t\"surname-first\": declared(\"surname-first\", SURNAME_FIRST),\n\t};\n\tconst model = (order: NameOrder = \"unknown\"): NameClassifier => byOrder[order] ?? classifier;\n\tconst segmenter = createSegmenter(namesData, options.weights?.segmenter);\n\n\tconst PLACE: ClassifyResult = { person: 0.05, school: 0.05, location: 0.9 };\n\n\t/**\n\t * A place the lexicon names outright is a location, without the regression:\n\t * - a single word with the G flag is almost certainly a location (\"Virginia\",\n\t * \"Texas\", \"Maryland\"), not a person's first name;\n\t * - a phrase of place words, none a given name or a school's name\n\t * (`isPlacePhrase`: \"Hilton Baltimore\");\n\t * - in a document that declares `given-first`, a place cut by a comma whose last part\n\t * is only a place (`isCommaPlacePhrase`: \"Victoria, Australia\").\n\t */\n\tfunction placeOverride(phrase: string, order: NameOrder = \"unknown\"): ClassifyResult | null {\n\t\tconst trimmed = phrase.trim();\n\t\tconst flagsOf = (n: string) => names.getNameFlags(n);\n\t\tif (splitWords(trimmed).length !== 1)\n\t\t\treturn isPlacePhrase(trimmed, flagsOf) ||\n\t\t\t\t(order === \"given-first\" && isCommaPlacePhrase(trimmed, flagsOf))\n\t\t\t\t? { ...PLACE }\n\t\t\t\t: null;\n\t\tconst flags = names.getNameFlags(trimmed);\n\t\tif (!flags) return null;\n\t\tif (flags.includes(\"G\")) return { ...PLACE };\n\t\treturn null;\n\t}\n\n\tfunction classifyName(phrase: string, order?: NameOrder): ClassifyResult {\n\t\tif (isGarbage(phrase)) return { ...ZERO };\n\t\tconst s = subject(phrase);\n\t\treturn placeOverride(s, order) ?? model(order).classifyName(s);\n\t}\n\n\tfunction category(scores: ClassifyResult): NameCategory {\n\t\tconst max = Math.max(scores.person, scores.school, scores.location);\n\t\tif (max === 0) return \"none\";\n\t\tif (scores.person === max) return \"person\";\n\t\tif (scores.school === max) return \"school\";\n\t\treturn \"location\";\n\t}\n\n\treturn {\n\t\tclassifyName,\n\t\tgetNameCategory: (phrase, order) => category(classifyName(phrase, order)),\n\t\tisPerson: (phrase, threshold = 0.5, order?: NameOrder) =>\n\t\t\tclassifyName(phrase, order).person >= threshold,\n\t\tisSchool: (phrase, threshold = 0.5, order?: NameOrder) =>\n\t\t\tclassifyName(phrase, order).school >= threshold,\n\t\tisLocation: (phrase, threshold = 0.5, order?: NameOrder) =>\n\t\t\tclassifyName(phrase, order).location >= threshold,\n\t\tclassifyNameNormalized(phrase, order) {\n\t\t\tif (isGarbage(phrase)) return { scores: { ...ZERO }, confidence: 0, category: \"none\" };\n\t\t\tconst scores = normalize(classifyName(phrase, order));\n\t\t\treturn { scores, confidence: computeConfidence(scores), category: category(scores) };\n\t\t},\n\t\tclassifyBoundary: (phrase, order) =>\n\t\t\tisGarbage(phrase)\n\t\t\t\t? { onlyPerson: 0, personConcat: 0 }\n\t\t\t\t: model(order).classifyBoundary(subject(phrase)),\n\t\tisOnlyPerson: (phrase, threshold = 0.5, order?: NameOrder) =>\n\t\t\t!isGarbage(phrase) && model(order).isOnlyPerson(subject(phrase), threshold),\n\t\tisPersonConcat: (phrase, threshold = 0.5, order?: NameOrder) =>\n\t\t\t!isGarbage(phrase) && model(order).isPersonConcat(subject(phrase), threshold),\n\t\tsegment: (input) => (isGarbage(input) ? refused() : segmenter.segment(input)),\n\t\tsegmentTokens: (tokens) =>\n\t\t\tisGarbage(tokens.join(\" \")) ? refused() : segmenter.segmentTokens(tokens),\n\t\tisTeamPattern: (input) => segmenter.isTeamPattern(input),\n\t\tfindConceptAnchors: (tokens) => segmenter.findConceptAnchors(tokens),\n\t\tclassifier,\n\t\tsegmenter,\n\t};\n}\n"
|
|
20
20
|
],
|
|
21
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;AASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,MAAQ,gBAAgB;AAWxB,IAAM,OAGF,EAAE,4BAAU,iCAAY,iCAAY,sCAAc;AAGtD,IAAM,UAAuC,CAAC;AAE9C,SAAS,SAAS,CAAC,MAAsC;AAAA,EACxD,MAAM,SAAS,QAAQ;AAAA,EACvB,IAAI;AAAA,IAAQ,OAAO;AAAA,EACnB,MAAM,IAAI,KAAK;AAAA,EACf,MAAM,SAAsB,YAAY,SAAS;AAAA,IAChD,MAAM;AAAA,IACN,OAAO,EAAE;AAAA,IACT,WAAW,EAAE;AAAA,IACb,OAAO,EAAE;AAAA,IACT,SAAS,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,EAAE;AAAA,EACpC,CAAQ;AAAA,EACR,QAAQ,QAAQ;AAAA,EAChB,OAAO;AAAA;AAQD,SAAS,SAAS,CAAC,GAAmB;AAAA,EAC5C,OAAO,EACL,YAAY,EACZ,UAAU,KAAK,EACf,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,SAAS,EAAE;AAAA;AAIf,SAAS,SAAS,CAAC,MAAuB;AAAA,EAChD,OAAO,UAAU,UAAU,EAAE,IAAI,UAAU,IAAI,CAAC;AAAA;AAS1C,SAAS,WAAW,CAAC,MAAuB;AAAA,EAClD,OAAO,UAAU,YAAY,EAAE,IAAI,UAAU,IAAI,CAAC;AAAA;AAI5C,SAAS,cAAc,CAAC,MAAuB;AAAA,EACrD,OAAO,UAAU,eAAe,EAAE,IAAI,UAAU,IAAI,CAAC;AAAA;AAU/C,IAAM,QAAQ;AAAA,EACpB,UAAU,EAAE,OAAO,KAAK,SAAS,GAAG,MAAM,KAAK,SAAS,EAAE;AAAA,EAC1D,YAAY,EAAE,OAAO,KAAK,WAAW,GAAG,MAAM,KAAK,WAAW,EAAE;AAAA,EAChE,YAAY,EAAE,OAAO,KAAK,WAAW,GAAG,MAAM,KAAK,WAAW,EAAE;AAAA,EAChE,eAAe,EAAE,OAAO,KAAK,cAAc,GAAG,MAAM,KAAK,cAAc,EAAE;AAC1E;;;ACpEA;;;;;;;;;;;AAEA,MAAQ,8BAAgB;AAMxB,IAAI,SAA6B;AAEjC,SAAS,UAAS,GAAgB;AAAA,EACjC,IAAI,CAAC,QAAQ;AAAA,IACZ,SAAS,aAAY,SAAS;AAAA,MAC7B,MAAM;AAAA,MACN,OAAO,kBAAK;AAAA,MACZ,WAAW,kBAAK;AAAA,MAChB,OAAO,kBAAK;AAAA,MACZ,SAAS,EAAE,MAAM,kBAAK,GAAG,SAAS,kBAAK,EAAE;AAAA,IAC1C,CAAQ;AAAA,EACT;AAAA,EACA,OAAO;AAAA;AAGR,SAAS,UAAS,CAAC,GAAmB;AAAA,EACrC,OAAO,EACL,YAAY,EACZ,UAAU,KAAK,EACf,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,UAAU,EAAE,EACpB,KAAK;AAAA;AAOD,SAAS,UAAU,CAAC,MAAuB;AAAA,EACjD,OAAO,WAAU,EAAE,IAAI,WAAU,IAAI,CAAC;AAAA;AAgDhC,IAAM,SAAQ;AAAA,EACpB,OAAO,kBAAK;AAAA,EACZ,MAAM,kBAAK;AAAA,EACX,KAAK;AACN;;;AC3FA;;;;;;;;;;;AAEA,MAAQ,8BAAgB;AAMxB,IAAI,UAA6B;AAEjC,SAAS,UAAS,GAAgB;AAAA,EACjC,IAAI,CAAC,SAAQ;AAAA,IACZ,UAAS,aAAY,SAAS;AAAA,MAC7B,MAAM;AAAA,MACN,OAAO,gBAAK;AAAA,MACZ,WAAW,gBAAK;AAAA,MAChB,OAAO,gBAAK;AAAA,MACZ,SAAS,EAAE,MAAM,gBAAK,GAAG,SAAS,gBAAK,EAAE;AAAA,IAC1C,CAAQ;AAAA,EACT;AAAA,EACA,OAAO;AAAA;AAGR,SAAS,UAAS,CAAC,GAAmB;AAAA,EACrC,OAAO,EACL,YAAY,EACZ,UAAU,KAAK,EACf,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,WAAW,GAAG,EACtB,QAAQ,SAAS,GAAG,EACpB,KAAK;AAAA;AAID,SAAS,QAAQ,CAAC,MAAuB;AAAA,EAC/C,OAAO,WAAU,EAAE,IAAI,WAAU,IAAI,CAAC;AAAA;AAkBhC,SAAS,gBAAgB,CAAC,QAAgB,WAAW,GAAa;AAAA,EACxE,MAAM,aAAa,WAAU,MAAM;AAAA,EACnC,MAAM,QAAQ,WAAW,MAAM,KAAK,EAAE,OAAO,OAAO;AAAA,EACpD,MAAM,UAAoB,CAAC;AAAA,EAC3B,SAAS,OAAO,MAAM,OAAQ,QAAQ,UAAU,QAAQ;AAAA,IACvD,SAAS,IAAI,EAAG,KAAK,MAAM,SAAS,MAAM,KAAK;AAAA,MAC9C,MAAM,QAAQ,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,KAAK,GAAG;AAAA,MAC/C,IAAI,WAAU,EAAE,IAAI,KAAK;AAAA,QAAG,QAAQ,KAAK,KAAK;AAAA,IAC/C;AAAA,EACD;AAAA,EACA,OAAO;AAAA;AAOD,SAAS,WAAW,CAAC,QAAwB;AAAA,EACnD,MAAM,aAAa,WAAU,MAAM;AAAA,EACnC,MAAM,QAAQ,WAAW,MAAM,KAAK,EAAE,OAAO,OAAO;AAAA,EAGpD,MAAM,kBAAkB,yCAAyC,KAAK,MAAM;AAAA,EAG5E,IAAI,WAAU,EAAE,IAAI,UAAU,GAAG;AAAA,IAChC,OAAO,kBAAkB,IAAM;AAAA,EAChC;AAAA,EAGA,MAAM,UAAU,iBAAiB,QAAQ,CAAC;AAAA,EAC1C,IAAI,QAAQ,SAAS,GAAG;AAAA,IAEvB,MAAM,eAAe,QAAQ,GAAI,MAAM,GAAG,EAAE;AAAA,IAC5C,MAAM,WAAW,eAAe,MAAM;AAAA,IACtC,OAAO,KAAK,IAAI,KAAK,WAAW,OAAO,kBAAkB,MAAM,EAAE;AAAA,EAClE;AAAA,EAEA,OAAO,kBAAkB,MAAM;AAAA;AAGzB,IAAM,SAAQ;AAAA,EACpB,OAAO,gBAAK;AAAA,EACZ,MAAM,gBAAK;AAAA,EACX,KAAK;AACN;;;ACtGA;;;;;;;;;;;AAEA,MAAQ,8BAAgB;AAMxB,IAAI,UAA6B;AAEjC,SAAS,UAAS,GAAgB;AAAA,EACjC,IAAI,CAAC,SAAQ;AAAA,IACZ,UAAS,aAAY,SAAS;AAAA,MAC7B,MAAM;AAAA,MACN,OAAO,qBAAK;AAAA,MACZ,WAAW,qBAAK;AAAA,MAChB,OAAO,qBAAK;AAAA,MACZ,SAAS,EAAE,MAAM,qBAAK,GAAG,SAAS,qBAAK,EAAE;AAAA,IAC1C,CAAQ;AAAA,EACT;AAAA,EACA,OAAO;AAAA;AAGR,SAAS,UAAS,CAAC,GAAmB;AAAA,EACrC,OAAO,EACL,YAAY,EACZ,UAAU,KAAK,EACf,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,UAAU,EAAE,EACpB,KAAK;AAAA;AAID,SAAS,YAAY,CAAC,MAAuB;AAAA,EACnD,OAAO,WAAU,EAAE,IAAI,WAAU,IAAI,CAAC;AAAA;AA+BhC,IAAM,SAAQ;AAAA,EACpB,OAAO,qBAAK;AAAA,EACZ,MAAM,qBAAK;AAAA,EACX,KAAK;AACN;;;ACtDO,IAAM,cAAkC,IAAI,IAAI,CAAC,GAAG,yBAAwB,IAAI,CAAC;AAajF,IAAM,mBAAkB,IAAI,IAAI;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,CAAC;;;ACpCD,IAAM,iBAAiB,CAAC,OAAO,KAAK,OAAO,IAAI;AAC/C,IAAM,2BAA2B,CAAC,OAAO,KAAK;AAC9C,IAAM,YAAY,IAAI,IAAI,CAAC,GAAG,aAAY,GAAG,gBAAgB,GAAG,wBAAwB,CAAC;AAGlF,IAAM,gBAAgB,IAAI,IAAI;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,CAAC;AAQM,SAAS,UAAS,CAAC,GAAmB;AAAA,EAC5C,OAAO,EACL,YAAY,EACZ,UAAU,KAAK,EACf,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,SAAS,EAAE;AAAA;AAQf,SAAS,QAAQ,CAAC,GAAqB;AAAA,EAC7C,IAAI,CAAC;AAAA,IAAG,OAAO,CAAC;AAAA,EAChB,OAAO,WAAW,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,oBAAoB,EAAE,CAAC;AAAA;AAM3D,SAAS,WAAU,CAAC,OAAwB;AAAA,EAClD,OAAO,UAAU,IAAI,WAAU,KAAK,CAAC;AAAA;AAM/B,SAAS,aAAa,CAAC,OAAwB;AAAA,EACrD,OAAO,cAAc,IAAI,WAAU,KAAK,CAAC;AAAA;AAMnC,SAAS,SAAS,CAAC,OAAwB;AAAA,EACjD,OAAO,gBAAgB,KAAK,KAAK;AAAA;AAM3B,SAAS,WAAW,CAAC,OAAwB;AAAA,EACnD,IAAI,MAAM,SAAS;AAAA,IAAG,OAAO;AAAA,EAC7B,OAAO,gBAAgB,KAAK,MAAM,QAAQ,WAAW,EAAE,CAAC;AAAA;AAMlD,SAAS,SAAS,CAAC,OAAwB;AAAA,EACjD,MAAM,UAAU,MAAM,QAAQ,cAAc,EAAE;AAAA,EAC9C,OAAO,QAAQ,SAAS,KAAK,YAAY,QAAQ,YAAY;AAAA;AAMvD,SAAS,WAAW,CAAC,OAAwB;AAAA,EACnD,MAAM,UAAU,MAAM,QAAQ,cAAc,EAAE;AAAA,EAC9C,OAAO,QAAQ,SAAS,KAAK,YAAY,QAAQ,YAAY;AAAA;;;AC3HvD,IAAM,gBAAgB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAEO,IAAM,UAAU;AAAA,EACtB,QAAU;AAAA,IACT,SAAW;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACA,MAAQ;AAAA,EACT;AAAA,EACA,QAAU;AAAA,IACT,SAAW;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACA,MAAQ;AAAA,EACT;AAAA,EACA,UAAY;AAAA,IACX,SAAW;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACA,MAAQ;AAAA,EACT;AAAA,EACA,YAAc;AAAA,IACb,SAAW;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACA,MAAQ;AAAA,EACT;AAAA,EACA,cAAgB;AAAA,IACf,SAAW;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AA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A,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACA,MAAQ;AAAA,EACT;AAAA,EACA,UAAY;AAAA,IACX,SAAW;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACA,MAAQ;AAAA,EACT;AAAA,EACA,YAAc;AAAA,IACb,SAAW;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACA,MAAQ;AAAA,EACT;AAAA,EACA,cAAgB;AAAA,IACf,SAAW;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACA,MAAQ;AAAA,EACT;AACD;;;ACvYO,IAAM,WAAU;AAAA,EACtB,QAAU;AAAA,IACT,SAAW;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACA,MAAQ;AAAA,EACT;AAAA,EACA,QAAU;AAAA,IACT,SAAW;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACA,MAAQ;AAAA,EACT;AAAA,EACA,UAAY;AAAA,IACX,SAAW;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACA,MAAQ;AAAA,EACT;AAAA,EACA,YAAc;AAAA,IACb,SAAW;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACA,MAAQ;AAAA,EACT;AAAA,EACA,cAAgB;AAAA,IACf,SAAW;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACA,MAAQ;AAAA,EACT;AACD;;;AC3RA,IAAM,wBAAgD,IAAI,IAAI,CAAC,eAAe,CAAC;AAE/E,IAAM,OAAuB,EAAE,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",
|
|
22
|
-
"debugId": "
|
|
21
|
+
"mappings": "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A,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAEO,IAAM,UAAU;AAAA,EACtB,QAAU;AAAA,IACT,SAAW;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACA,MAAQ;AAAA,EACT;AAAA,EACA,QAAU;AAAA,IACT,SAAW;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACA,MAAQ;AAAA,EACT;AAAA,EACA,UAAY;AAAA,IACX,SAAW;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACA,MAAQ;AAAA,EACT;AAAA,EACA,YAAc;AAAA,IACb,SAAW;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACA,MAAQ;AAAA,EACT;AAAA,EACA,cAAgB;AAAA,IACf,SAAW;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;A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AA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACA,MAAQ;AAAA,EACT;AAAA,EACA,UAAY;AAAA,IACX,SAAW;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACA,MAAQ;AAAA,EACT;AAAA,EACA,YAAc;AAAA,IACb,SAAW;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACA,MAAQ;AAAA,EACT;AAAA,EACA,cAAgB;AAAA,IACf,SAAW;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACA,MAAQ;AAAA,EACT;AACD;;;ACvYO,IAAM,WAAU;AAAA,EACtB,QAAU;AAAA,IACT,SAAW;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACA,MAAQ;AAAA,EACT;AAAA,EACA,QAAU;AAAA,IACT,SAAW;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACA,MAAQ;AAAA,EACT;AAAA,EACA,UAAY;AAAA,IACX,SAAW;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACA,MAAQ;AAAA,EACT;AAAA,EACA,YAAc;AAAA,IACb,SAAW;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACA,MAAQ;AAAA,EACT;AAAA,EACA,cAAgB;AAAA,IACf,SAAW;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACA,MAAQ;AAAA,EACT;AACD;;;AC3RA,IAAM,wBAAgD,IAAI,IAAI,CAAC,eAAe,CAAC;AAE/E,IAAM,OAAuB,EAAE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",
|
|
22
|
+
"debugId": "DEAAEE822B81CADB64756E2164756E21",
|
|
23
23
|
"names": []
|
|
24
24
|
}
|