@kensio/pinyinjs 1.7.5 → 1.7.6
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/README.md +128 -123
- package/data/full.entries +2595 -2595
- package/data/manifest.json +5 -5
- package/data/script.map +66 -3
- package/dist/decode/chang-context.d.ts +27 -0
- package/dist/decode/chang-context.d.ts.map +1 -0
- package/dist/decode/chang-context.js +66 -0
- package/dist/decode/chang-context.js.map +1 -0
- package/dist/decode/chang-rule.d.ts +37 -0
- package/dist/decode/chang-rule.d.ts.map +1 -0
- package/dist/decode/chang-rule.js +169 -0
- package/dist/decode/chang-rule.js.map +1 -0
- package/dist/decode/confidence.d.ts +11 -3
- package/dist/decode/confidence.d.ts.map +1 -1
- package/dist/decode/confidence.js +11 -3
- package/dist/decode/confidence.js.map +1 -1
- package/dist/decode/convert-pipeline.d.ts.map +1 -1
- package/dist/decode/convert-pipeline.js +2 -1
- package/dist/decode/convert-pipeline.js.map +1 -1
- package/dist/decode/de-rule.d.ts +54 -0
- package/dist/decode/de-rule.d.ts.map +1 -0
- package/dist/decode/de-rule.js +113 -0
- package/dist/decode/de-rule.js.map +1 -0
- package/dist/decode/hint-lattice.d.ts.map +1 -1
- package/dist/decode/hint-lattice.js +17 -3
- package/dist/decode/hint-lattice.js.map +1 -1
- package/dist/decode/jiao-rule.d.ts +9 -3
- package/dist/decode/jiao-rule.d.ts.map +1 -1
- package/dist/decode/jiao-rule.js +44 -5
- package/dist/decode/jiao-rule.js.map +1 -1
- package/dist/decode/lattice-types.d.ts +27 -8
- package/dist/decode/lattice-types.d.ts.map +1 -1
- package/dist/decode/lattice-types.js +27 -8
- package/dist/decode/lattice-types.js.map +1 -1
- package/dist/decode/polyphone-rules.d.ts +7 -27
- package/dist/decode/polyphone-rules.d.ts.map +1 -1
- package/dist/decode/polyphone-rules.js +7 -155
- package/dist/decode/polyphone-rules.js.map +1 -1
- package/dist/decode/reading-rules.d.ts +1 -29
- package/dist/decode/reading-rules.d.ts.map +1 -1
- package/dist/decode/reading-rules.js +4 -69
- package/dist/decode/reading-rules.js.map +1 -1
- package/dist/decode/run-words.d.ts +17 -0
- package/dist/decode/run-words.d.ts.map +1 -0
- package/dist/decode/run-words.js +29 -0
- package/dist/decode/run-words.js.map +1 -0
- package/dist/decode/sandhi-input.d.ts +30 -0
- package/dist/decode/sandhi-input.d.ts.map +1 -0
- package/dist/decode/sandhi-input.js +35 -0
- package/dist/decode/sandhi-input.js.map +1 -0
- package/dist/decode/sandhi-tones.d.ts +33 -5
- package/dist/decode/sandhi-tones.d.ts.map +1 -1
- package/dist/decode/sandhi-tones.js +59 -8
- package/dist/decode/sandhi-tones.js.map +1 -1
- package/dist/decode/sandhi.d.ts +9 -6
- package/dist/decode/sandhi.d.ts.map +1 -1
- package/dist/decode/sandhi.js +10 -7
- package/dist/decode/sandhi.js.map +1 -1
- package/dist/decode/write-run.d.ts +0 -7
- package/dist/decode/write-run.d.ts.map +1 -1
- package/dist/decode/write-run.js +4 -39
- package/dist/decode/write-run.js.map +1 -1
- package/dist/dictionary/cedict-senses.d.ts +7 -0
- package/dist/dictionary/cedict-senses.d.ts.map +1 -1
- package/dist/dictionary/cedict-senses.js +12 -0
- package/dist/dictionary/cedict-senses.js.map +1 -1
- package/dist/dictionary/constituent-repair.d.ts +36 -0
- package/dist/dictionary/constituent-repair.d.ts.map +1 -0
- package/dist/dictionary/constituent-repair.js +117 -0
- package/dist/dictionary/constituent-repair.js.map +1 -0
- package/dist/dictionary/merge-types.d.ts +8 -2
- package/dist/dictionary/merge-types.d.ts.map +1 -1
- package/dist/dictionary/merge-types.js.map +1 -1
- package/dist/dictionary/merge-walk.d.ts +27 -0
- package/dist/dictionary/merge-walk.d.ts.map +1 -0
- package/dist/dictionary/merge-walk.js +49 -0
- package/dist/dictionary/merge-walk.js.map +1 -0
- package/dist/dictionary/merge.d.ts +3 -3
- package/dist/dictionary/merge.d.ts.map +1 -1
- package/dist/dictionary/merge.js +18 -28
- package/dist/dictionary/merge.js.map +1 -1
- package/dist/dictionary/word-readings.d.ts.map +1 -1
- package/dist/dictionary/word-readings.js +3 -0
- package/dist/dictionary/word-readings.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/decode/sandhi.d.ts
CHANGED
|
@@ -39,14 +39,17 @@ export type SandhiGrouping = readonly (number | readonly number[])[];
|
|
|
39
39
|
* contextual tone is put back, over the whole syllable array rather than within
|
|
40
40
|
* a word, which is what lets 不 in one word assimilate to a tone in the next.
|
|
41
41
|
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
* caller holding nothing but a reading has.
|
|
42
|
+
* 不 assimilates to whatever follows it and needs nothing but the syllables.
|
|
43
|
+
* Third-tone sandhi is not like that — its domain is the foot rather than the
|
|
44
|
+
* syllable string — so `grouping` says where the words and their parts are.
|
|
45
|
+
* Without one the whole array is taken for a single word, which is what a
|
|
46
|
+
* caller holding nothing but a reading has. 一 sits between the two: the tone it
|
|
47
|
+
* takes is settled by the syllables, and whether it takes one at all is a
|
|
48
|
+
* question about the 汉字, so `characters` carries them where the caller has
|
|
49
|
+
* them. See {@link isCounting}.
|
|
47
50
|
*
|
|
48
51
|
* Never operates on a string. The old project patched output text with regexes,
|
|
49
52
|
* which is what made its rules order-dependent and untestable.
|
|
50
53
|
*/
|
|
51
|
-
export declare function applySandhi(syllables: readonly Syllable[], options?: SandhiOptions, grouping?: SandhiGrouping): readonly Syllable[];
|
|
54
|
+
export declare function applySandhi(syllables: readonly Syllable[], options?: SandhiOptions, grouping?: SandhiGrouping, characters?: readonly (string | undefined)[]): readonly Syllable[];
|
|
52
55
|
//# sourceMappingURL=sandhi.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandhi.d.ts","sourceRoot":"","sources":["../../src/decode/sandhi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC;AA6HrE
|
|
1
|
+
{"version":3,"file":"sandhi.d.ts","sourceRoot":"","sources":["../../src/decode/sandhi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC;AA6HrE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,WAAW,CACzB,SAAS,EAAE,SAAS,QAAQ,EAAE,EAC9B,OAAO,GAAE,aAAkB,EAC3B,QAAQ,CAAC,EAAE,cAAc,EACzB,UAAU,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,GAC3C,SAAS,QAAQ,EAAE,CA6BrB"}
|
package/dist/decode/sandhi.js
CHANGED
|
@@ -103,16 +103,19 @@ function applyThirdTone(syllables, grouping) {
|
|
|
103
103
|
* contextual tone is put back, over the whole syllable array rather than within
|
|
104
104
|
* a word, which is what lets 不 in one word assimilate to a tone in the next.
|
|
105
105
|
*
|
|
106
|
-
*
|
|
107
|
-
*
|
|
108
|
-
*
|
|
109
|
-
*
|
|
110
|
-
* caller holding nothing but a reading has.
|
|
106
|
+
* 不 assimilates to whatever follows it and needs nothing but the syllables.
|
|
107
|
+
* Third-tone sandhi is not like that — its domain is the foot rather than the
|
|
108
|
+
* syllable string — so `grouping` says where the words and their parts are.
|
|
109
|
+
* Without one the whole array is taken for a single word, which is what a
|
|
110
|
+
* caller holding nothing but a reading has. 一 sits between the two: the tone it
|
|
111
|
+
* takes is settled by the syllables, and whether it takes one at all is a
|
|
112
|
+
* question about the 汉字, so `characters` carries them where the caller has
|
|
113
|
+
* them. See {@link isCounting}.
|
|
111
114
|
*
|
|
112
115
|
* Never operates on a string. The old project patched output text with regexes,
|
|
113
116
|
* which is what made its rules order-dependent and untestable.
|
|
114
117
|
*/
|
|
115
|
-
export function applySandhi(syllables, options = {}, grouping) {
|
|
118
|
+
export function applySandhi(syllables, options = {}, grouping, characters) {
|
|
116
119
|
const { yiBu = true, thirdTone = false } = options;
|
|
117
120
|
const applied = thirdTone
|
|
118
121
|
? applyThirdTone(syllables, grouping)
|
|
@@ -122,7 +125,7 @@ export function applySandhi(syllables, options = {}, grouping) {
|
|
|
122
125
|
if (yiBu && isYi(syllable) && syllable.tone === 1) {
|
|
123
126
|
// A 一 that is not counting keeps its citation tone, so it is left
|
|
124
127
|
// exactly as the dictionary stored it.
|
|
125
|
-
if (isCounting(applied, at)) {
|
|
128
|
+
if (isCounting(applied, at, characters)) {
|
|
126
129
|
applied[at] = { ...syllable, tone: yiToneBefore(following?.tone) };
|
|
127
130
|
}
|
|
128
131
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandhi.js","sourceRoot":"","sources":["../../src/decode/sandhi.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"sandhi.js","sourceRoot":"","sources":["../../src/decode/sandhi.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,11 +18,4 @@ export declare function writeRun(dictionary: Dictionary, words: readonly ScoredW
|
|
|
18
18
|
* Rewrite every piece's text with a pass that reads across all of them.
|
|
19
19
|
*/
|
|
20
20
|
export declare function rewrite(pieces: readonly ConvertedPiece[], pass: (parts: readonly string[]) => readonly string[]): readonly ConvertedPiece[];
|
|
21
|
-
/**
|
|
22
|
-
* The words a Han run decodes to, with 分词连写 applied.
|
|
23
|
-
*
|
|
24
|
-
* Grouping rewrites word boundaries and never the readings behind them, so the
|
|
25
|
-
* syllables — and the confidence beside them — survive it in order.
|
|
26
|
-
*/
|
|
27
|
-
export declare function wordsOf(decoded: readonly ScoredWord[], dictionary: Dictionary, isGrouped: boolean): readonly ScoredWord[];
|
|
28
21
|
//# sourceMappingURL=write-run.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-run.d.ts","sourceRoot":"","sources":["../../src/decode/write-run.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"write-run.d.ts","sourceRoot":"","sources":["../../src/decode/write-run.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EACL,KAAK,cAAc,EAInB,KAAK,OAAO,EACb,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,wBAAgB,QAAQ,CACtB,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,aAAa,GAAG,SAAS,GAChC,SAAS,cAAc,EAAE,CAqC3B;AAED;;GAEG;AACH,wBAAgB,OAAO,CACrB,MAAM,EAAE,SAAS,cAAc,EAAE,EACjC,IAAI,EAAE,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,SAAS,MAAM,EAAE,GACpD,SAAS,cAAc,EAAE,CAO3B"}
|
package/dist/decode/write-run.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { divisionOf } from "./constituents.js";
|
|
1
|
+
import { charactersPerSyllable, groupingOf } from "./sandhi-input.js";
|
|
3
2
|
import { applySandhi } from "./sandhi.js";
|
|
4
3
|
import { plainPiece, readingFor, writeWord, } from "./pieces.js";
|
|
5
4
|
/**
|
|
@@ -7,17 +6,10 @@ import { plainPiece, readingFor, writeWord, } from "./pieces.js";
|
|
|
7
6
|
*/
|
|
8
7
|
export function writeRun(dictionary, words, locale, written, sandhi) {
|
|
9
8
|
// Sandhi runs across the whole run rather than within a word, since 不 in one
|
|
10
|
-
// word assimilates to the tone starting the next
|
|
11
|
-
//
|
|
12
|
-
// only when it is asked for, since dividing a word costs lookups.
|
|
9
|
+
// word assimilates to the tone starting the next, and what it needs beyond
|
|
10
|
+
// the syllables is in `sandhi-input.ts`.
|
|
13
11
|
const readings = words.map((scored) => readingFor(dictionary, scored.word, locale));
|
|
14
|
-
const
|
|
15
|
-
? words.map((scored, index) => {
|
|
16
|
-
const reading = readings[index] ?? [];
|
|
17
|
-
return (divisionOf(dictionary, scored.word.text, reading) ?? reading.length);
|
|
18
|
-
})
|
|
19
|
-
: undefined;
|
|
20
|
-
const flattened = applySandhi(readings.flat(), sandhi, grouping);
|
|
12
|
+
const flattened = applySandhi(readings.flat(), sandhi, groupingOf(dictionary, words, readings, sandhi?.thirdTone === true), charactersPerSyllable(words, readings));
|
|
21
13
|
let at = 0;
|
|
22
14
|
const pieces = [];
|
|
23
15
|
for (const [index, scored] of words.entries()) {
|
|
@@ -47,31 +39,4 @@ export function rewrite(pieces, pass) {
|
|
|
47
39
|
return text === piece.text ? piece : { ...piece, text };
|
|
48
40
|
});
|
|
49
41
|
}
|
|
50
|
-
/**
|
|
51
|
-
* The words a Han run decodes to, with 分词连写 applied.
|
|
52
|
-
*
|
|
53
|
-
* Grouping rewrites word boundaries and never the readings behind them, so the
|
|
54
|
-
* syllables — and the confidence beside them — survive it in order.
|
|
55
|
-
*/
|
|
56
|
-
export function wordsOf(decoded, dictionary, isGrouped) {
|
|
57
|
-
return isGrouped
|
|
58
|
-
? regroup(decoded, applyGrouping(decoded.map((scored) => scored.word), dictionary))
|
|
59
|
-
: decoded;
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Redistribute the decode's per-syllable confidence over regrouped words.
|
|
63
|
-
*
|
|
64
|
-
* 分词连写 moves word boundaries — 看 and 了 become 看了 — without touching a
|
|
65
|
-
* reading, so the run's syllables are the same syllables in the same order and
|
|
66
|
-
* are simply cut in different places.
|
|
67
|
-
*/
|
|
68
|
-
function regroup(decoded, grouped) {
|
|
69
|
-
const confidence = decoded.flatMap((scored) => [...scored.confidence]);
|
|
70
|
-
let at = 0;
|
|
71
|
-
return grouped.map((word) => {
|
|
72
|
-
const held = confidence.slice(at, at + word.reading.length);
|
|
73
|
-
at += word.reading.length;
|
|
74
|
-
return { word, confidence: held };
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
42
|
//# sourceMappingURL=write-run.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-run.js","sourceRoot":"","sources":["../../src/decode/write-run.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"write-run.js","sourceRoot":"","sources":["../../src/decode/write-run.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAsB,MAAM,aAAa,CAAC;AAE9D,OAAO,EAEL,UAAU,EACV,UAAU,EACV,SAAS,GAEV,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,MAAM,UAAU,QAAQ,CACtB,UAAsB,EACtB,KAA4B,EAC5B,MAAc,EACd,OAAgB,EAChB,MAAiC;IAEjC,6EAA6E;IAC7E,2EAA2E;IAC3E,yCAAyC;IACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACpC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAC5C,CAAC;IACF,MAAM,SAAS,GAAG,WAAW,CAC3B,QAAQ,CAAC,IAAI,EAAE,EACf,MAAM,EACN,UAAU,CAAC,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC,EACnE,qBAAqB,CAAC,KAAK,EAAE,QAAQ,CAAC,CACvC,CAAC;IAEF,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,MAAM,MAAM,GAAqB,EAAE,CAAC;IACpC,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QAC9C,0EAA0E;QAC1E,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;QAC5C,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,gEAAgE;YAChE,sDAAsD;YACtD,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,MAAM,CAAC,IAAI,CACT,GAAG,SAAS,CACV,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC;QAChC,qEAAqE;QACrE,mDAAmD;QACnD,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAC5D,MAAM,CAAC,IAAI,EACX,OAAO,CACR,CACF,CAAC;QACF,EAAE,IAAI,MAAM,CAAC;IACf,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CACrB,MAAiC,EACjC,IAAqD;IAErD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QAC9B,qEAAqE;QACrE,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC;QACzC,OAAO,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -32,6 +32,13 @@ export declare function indexCedict(cedict: readonly CedictEntry[], formOf: (ent
|
|
|
32
32
|
* A word's readings as CC-CEDICT gives them, one per sense.
|
|
33
33
|
*/
|
|
34
34
|
export declare function cedictReadingsOf(word: string, entries: readonly CedictEntry[]): readonly (readonly Syllable[])[];
|
|
35
|
+
/**
|
|
36
|
+
* Ask either index for every reading CC-CEDICT gives a spelling.
|
|
37
|
+
*
|
|
38
|
+
* Both scripts, because a word can be listed under one and not the other, and
|
|
39
|
+
* an empty answer means CC-CEDICT does not hold the spelling at all.
|
|
40
|
+
*/
|
|
41
|
+
export declare function senseLookup(byWord: ReadonlyMap<string, readonly CedictEntry[]>, byHant: ReadonlyMap<string, readonly CedictEntry[]>): (word: string) => readonly (readonly Syllable[])[];
|
|
35
42
|
/**
|
|
36
43
|
* Whether a proposed 國語 reading is really another 普通话 sense of the word.
|
|
37
44
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cedict-senses.d.ts","sourceRoot":"","sources":["../../src/dictionary/cedict-senses.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAIxD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC,EACnD,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC,GAClD,OAAO,CAOT;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,MAAM,GACrC,WAAW,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC,CAY7C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,SAAS,WAAW,EAAE,GAC9B,SAAS,CAAC,SAAS,QAAQ,EAAE,CAAC,EAAE,CAIlC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,SAAS,QAAQ,EAAE,EAC3B,aAAa,EAAE,SAAS,CAAC,SAAS,QAAQ,EAAE,CAAC,EAAE,GAC9C,OAAO,CAET;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,WAAW,GAAG,SAAS,GAC7B,OAAO,CAET"}
|
|
1
|
+
{"version":3,"file":"cedict-senses.d.ts","sourceRoot":"","sources":["../../src/dictionary/cedict-senses.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAIxD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC,EACnD,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC,GAClD,OAAO,CAOT;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,MAAM,GACrC,WAAW,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC,CAY7C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,SAAS,WAAW,EAAE,GAC9B,SAAS,CAAC,SAAS,QAAQ,EAAE,CAAC,EAAE,CAIlC;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC,EACnD,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC,GAClD,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC,SAAS,QAAQ,EAAE,CAAC,EAAE,CAKpD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,SAAS,QAAQ,EAAE,EAC3B,aAAa,EAAE,SAAS,CAAC,SAAS,QAAQ,EAAE,CAAC,EAAE,GAC9C,OAAO,CAET;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,WAAW,GAAG,SAAS,GAC7B,OAAO,CAET"}
|
|
@@ -62,6 +62,18 @@ export function cedictReadingsOf(word, entries) {
|
|
|
62
62
|
.map((entry) => readDictionaryReading(word, entry.readings))
|
|
63
63
|
.filter((reading) => reading !== undefined);
|
|
64
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Ask either index for every reading CC-CEDICT gives a spelling.
|
|
67
|
+
*
|
|
68
|
+
* Both scripts, because a word can be listed under one and not the other, and
|
|
69
|
+
* an empty answer means CC-CEDICT does not hold the spelling at all.
|
|
70
|
+
*/
|
|
71
|
+
export function senseLookup(byWord, byHant) {
|
|
72
|
+
return (word) => [
|
|
73
|
+
...cedictReadingsOf(word, byWord.get(word) ?? []),
|
|
74
|
+
...cedictReadingsOf(word, byHant.get(word) ?? []),
|
|
75
|
+
];
|
|
76
|
+
}
|
|
65
77
|
/**
|
|
66
78
|
* Whether a proposed 國語 reading is really another 普通话 sense of the word.
|
|
67
79
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cedict-senses.js","sourceRoot":"","sources":["../../src/dictionary/cedict-senses.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAG5D,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,MAAmD,EACnD,MAAmD;IAEnD,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAClC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,KAAK,KAAK,CAAC,WAAW,CAClD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,MAA8B,EAC9B,MAAsC;IAEtC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;IAChD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,OAA+B;IAE/B,OAAO,OAAO;SACX,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;SAC3D,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC;AAChD,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,UAAU,CACxB,MAA2B,EAC3B,aAA+C;IAE/C,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AACrE,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAY,EACZ,KAA8B;IAE9B,OAAO,KAAK,EAAE,WAAW,KAAK,OAAO,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC;AACnE,CAAC"}
|
|
1
|
+
{"version":3,"file":"cedict-senses.js","sourceRoot":"","sources":["../../src/dictionary/cedict-senses.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAG5D,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,MAAmD,EACnD,MAAmD;IAEnD,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAClC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,KAAK,KAAK,CAAC,WAAW,CAClD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,MAA8B,EAC9B,MAAsC;IAEtC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;IAChD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,OAA+B;IAE/B,OAAO,OAAO;SACX,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;SAC3D,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC;AAChD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CACzB,MAAmD,EACnD,MAAmD;IAEnD,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACf,GAAG,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACjD,GAAG,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;KAClD,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,UAAU,CACxB,MAA2B,EAC3B,aAA+C;IAE/C,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AACrE,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAY,EACZ,KAA8B;IAE9B,OAAO,KAAK,EAAE,WAAW,KAAK,OAAO,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { Syllable } from "../syllable/syllable.js";
|
|
2
|
+
import { type DictionaryEntry } from "./entry.js";
|
|
3
|
+
/**
|
|
4
|
+
* What the repair pass changed.
|
|
5
|
+
*/
|
|
6
|
+
export interface ConstituentRepair {
|
|
7
|
+
readonly entries: readonly DictionaryEntry[];
|
|
8
|
+
/** Entries given a reading from a word inside them. */
|
|
9
|
+
readonly repaired: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Read a phrase entry as the corroborated words inside it read it.
|
|
13
|
+
*
|
|
14
|
+
* 做什么 is stored `zuò shí mǒ` upstream, and 什么 is `shén me` in the same file
|
|
15
|
+
* and in CC-CEDICT besides. The decode has no way back from that: the four
|
|
16
|
+
* characters are one dictionary key, so the key answers and the word inside it
|
|
17
|
+
* is never asked. 什么意思, 不记得 and 这么说 are the same defect, and between
|
|
18
|
+
* them they account for 160 of the 290 sentences a downstream corpus of 13,182
|
|
19
|
+
* reported as misread.
|
|
20
|
+
*
|
|
21
|
+
* The pass runs over entries **nothing but the phrase corpus attests** — no
|
|
22
|
+
* CC-CEDICT headword under either script, no jieba frequency — and takes each
|
|
23
|
+
* one's constituents from `ConstituentIndex`, the same segmentation the locale
|
|
24
|
+
* composition uses. Only a constituent CC-CEDICT holds may correct anything, so
|
|
25
|
+
* this never trades one uncorroborated reading for another. What survives
|
|
26
|
+
* {@link corrects} replaces the span it covers.
|
|
27
|
+
*
|
|
28
|
+
* Measured on the full dictionary it repairs 1,727 entries of the 250,417 it
|
|
29
|
+
* looks at. Sampled by hand at every 61st, the repairs are neutral tones the
|
|
30
|
+
* corpus wrote out in full (骨头, 大夫, 秀才, 和尚), spellings it got wrong
|
|
31
|
+
* (相扑 `xiàng pū`, 武侯 `wǔ hòu`, 用尽 `yòng jǐn`) and one entry with no tones
|
|
32
|
+
* at all (激昂青云). The doubtful ones are homographs either reading is
|
|
33
|
+
* defensible for: 倒数比 and 面糊盆.
|
|
34
|
+
*/
|
|
35
|
+
export declare function repairConstituentReadings(entries: readonly DictionaryEntry[], sensesOf: (word: string) => readonly (readonly Syllable[])[]): ConstituentRepair;
|
|
36
|
+
//# sourceMappingURL=constituent-repair.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constituent-repair.d.ts","sourceRoot":"","sources":["../../src/dictionary/constituent-repair.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,KAAK,eAAe,EAAiB,MAAM,YAAY,CAAC;AAGjE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAC;IAC7C,uDAAuD;IACvD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AA0CD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,SAAS,eAAe,EAAE,EACnC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC,SAAS,QAAQ,EAAE,CAAC,EAAE,GAC3D,iBAAiB,CAmDnB"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Holding a phrase entry to what the words inside it already read.
|
|
3
|
+
*
|
|
4
|
+
* The phrase corpus is a reading source and not a word list, and 251,528 of its
|
|
5
|
+
* 411,956 keys are in neither CC-CEDICT nor jieba. Much of that tail is running
|
|
6
|
+
* text rather than vocabulary — 做什么, 什么意思, 不记得, 一个幽灵在欧洲游荡 —
|
|
7
|
+
* and where a key like that carries a defective reading there is nothing to
|
|
8
|
+
* correct it against, because `settleReading` compares a phrase entry with the
|
|
9
|
+
* CC-CEDICT sense of the *same* headword and CC-CEDICT has no such headword.
|
|
10
|
+
*
|
|
11
|
+
* This is that missing correction, taken from the words inside instead.
|
|
12
|
+
*/
|
|
13
|
+
import { toCharacters } from "../script/characters.js";
|
|
14
|
+
import { NEUTRAL_TONE } from "../tone/tone.js";
|
|
15
|
+
import { isSameReading } from "./entry.js";
|
|
16
|
+
import { ConstituentIndex } from "./locale-segments.js";
|
|
17
|
+
/**
|
|
18
|
+
* Whether a constituent may correct the span it covers.
|
|
19
|
+
*
|
|
20
|
+
* Four tests, and each one rules out a class of damage:
|
|
21
|
+
*
|
|
22
|
+
* 1. **Multi-character only.** A character's own reading is the prior the
|
|
23
|
+
* phrase entry was built from, so correcting against it says nothing new.
|
|
24
|
+
* It is the same reasoning `composeLocaleDeltas` gives for the same
|
|
25
|
+
* restriction.
|
|
26
|
+
* 2. **One syllable per character on both sides**, or the two readings are not
|
|
27
|
+
* describing the same span character for character.
|
|
28
|
+
* 3. **The span must match no sense CC-CEDICT gives the constituent.** A word
|
|
29
|
+
* with two readings has two senses, and a phrase using the other one is
|
|
30
|
+
* right: 分子 is `fēn zǐ` as a molecule and `fèn zǐ` as a member, so
|
|
31
|
+
* 分子结构 keeps the reading it was given. The build's tier check found this
|
|
32
|
+
* one, which is what that check is for.
|
|
33
|
+
* 4. **No 轻声 may gain a tone.** The phrase corpus writes full tones where
|
|
34
|
+
* CC-CEDICT has neutral and never the reverse, so a correction pushing the
|
|
35
|
+
* other way is not a correction at all — it is a constituent that fell
|
|
36
|
+
* across a boundary. Every 地 in the 268 entries this rules out is the
|
|
37
|
+
* adverbial particle, and the words claiming it are 心地, 性地 and 野地.
|
|
38
|
+
*/
|
|
39
|
+
function corrects(part, span, own, senses) {
|
|
40
|
+
if (toCharacters(part.text).length < 2 || own.length !== span.length) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
if (senses.some((sense) => isSameReading(sense, span))) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
return !span.some((syllable, at) => syllable.tone === NEUTRAL_TONE && own[at]?.tone !== NEUTRAL_TONE);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Read a phrase entry as the corroborated words inside it read it.
|
|
50
|
+
*
|
|
51
|
+
* 做什么 is stored `zuò shí mǒ` upstream, and 什么 is `shén me` in the same file
|
|
52
|
+
* and in CC-CEDICT besides. The decode has no way back from that: the four
|
|
53
|
+
* characters are one dictionary key, so the key answers and the word inside it
|
|
54
|
+
* is never asked. 什么意思, 不记得 and 这么说 are the same defect, and between
|
|
55
|
+
* them they account for 160 of the 290 sentences a downstream corpus of 13,182
|
|
56
|
+
* reported as misread.
|
|
57
|
+
*
|
|
58
|
+
* The pass runs over entries **nothing but the phrase corpus attests** — no
|
|
59
|
+
* CC-CEDICT headword under either script, no jieba frequency — and takes each
|
|
60
|
+
* one's constituents from `ConstituentIndex`, the same segmentation the locale
|
|
61
|
+
* composition uses. Only a constituent CC-CEDICT holds may correct anything, so
|
|
62
|
+
* this never trades one uncorroborated reading for another. What survives
|
|
63
|
+
* {@link corrects} replaces the span it covers.
|
|
64
|
+
*
|
|
65
|
+
* Measured on the full dictionary it repairs 1,727 entries of the 250,417 it
|
|
66
|
+
* looks at. Sampled by hand at every 61st, the repairs are neutral tones the
|
|
67
|
+
* corpus wrote out in full (骨头, 大夫, 秀才, 和尚), spellings it got wrong
|
|
68
|
+
* (相扑 `xiàng pū`, 武侯 `wǔ hòu`, 用尽 `yòng jǐn`) and one entry with no tones
|
|
69
|
+
* at all (激昂青云). The doubtful ones are homographs either reading is
|
|
70
|
+
* defensible for: 倒数比 and 面糊盆.
|
|
71
|
+
*/
|
|
72
|
+
export function repairConstituentReadings(entries, sensesOf) {
|
|
73
|
+
const index = new ConstituentIndex(entries);
|
|
74
|
+
let repaired = 0;
|
|
75
|
+
const repair = (entry) => {
|
|
76
|
+
const reading = entry.readings.cn;
|
|
77
|
+
if (entry.frequency > 0 ||
|
|
78
|
+
sensesOf(entry.hans).length > 0 ||
|
|
79
|
+
sensesOf(entry.hant).length > 0 ||
|
|
80
|
+
reading.length !== toCharacters(entry.hans).length ||
|
|
81
|
+
reading.length < 2) {
|
|
82
|
+
return entry;
|
|
83
|
+
}
|
|
84
|
+
const path = index.segment(entry.hans);
|
|
85
|
+
if (path === undefined) {
|
|
86
|
+
return entry;
|
|
87
|
+
}
|
|
88
|
+
let corrected = [...reading];
|
|
89
|
+
let isMoved = false;
|
|
90
|
+
for (const part of path) {
|
|
91
|
+
const own = part.entry.readings.cn;
|
|
92
|
+
const senses = [
|
|
93
|
+
...sensesOf(part.entry.hans),
|
|
94
|
+
...sensesOf(part.entry.hant),
|
|
95
|
+
];
|
|
96
|
+
if (senses.length === 0) {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
if (!corrects(part, reading.slice(part.from, part.to), own, senses)) {
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
corrected = [
|
|
103
|
+
...corrected.slice(0, part.from),
|
|
104
|
+
...own,
|
|
105
|
+
...corrected.slice(part.to),
|
|
106
|
+
];
|
|
107
|
+
isMoved = true;
|
|
108
|
+
}
|
|
109
|
+
if (!isMoved) {
|
|
110
|
+
return entry;
|
|
111
|
+
}
|
|
112
|
+
repaired++;
|
|
113
|
+
return { ...entry, readings: { ...entry.readings, cn: corrected } };
|
|
114
|
+
};
|
|
115
|
+
return { entries: entries.map((entry) => repair(entry)), repaired };
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=constituent-repair.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constituent-repair.js","sourceRoot":"","sources":["../../src/dictionary/constituent-repair.ts"],"names":[],"mappings":"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"}
|
|
@@ -42,6 +42,11 @@ export interface MergeStats {
|
|
|
42
42
|
readonly scriptPairs: number;
|
|
43
43
|
/** Entries a source writes more than one 繁體 spelling of. */
|
|
44
44
|
readonly variantSpellings: number;
|
|
45
|
+
/**
|
|
46
|
+
* Phrase entries read as a corroborated word inside them reads them — see
|
|
47
|
+
* {@link import("./constituent-repair.js").repairConstituentReadings}.
|
|
48
|
+
*/
|
|
49
|
+
readonly repairedConstituents: number;
|
|
45
50
|
/** Entries carrying a zh-TW reading delta a source stated. */
|
|
46
51
|
readonly taiwanReadings: number;
|
|
47
52
|
/** Compounds given a zh-TW delta composed from their constituents. */
|
|
@@ -85,8 +90,9 @@ export interface WordSources {
|
|
|
85
90
|
* What one word contributed to the build's counts.
|
|
86
91
|
*
|
|
87
92
|
* The per-word view of {@link MergeStats}, minus the counts no single word can
|
|
88
|
-
* move: `reducedNeutrals` and `composedTaiwanReadings`
|
|
89
|
-
* over the whole dictionary, and `rejected` is counted by
|
|
93
|
+
* move: `reducedNeutrals`, `repairedConstituents` and `composedTaiwanReadings`
|
|
94
|
+
* are settled by passes over the whole dictionary, and `rejected` is counted by
|
|
95
|
+
* the caller.
|
|
90
96
|
*/
|
|
91
97
|
export interface WordTally {
|
|
92
98
|
readonly neutralToneCorrections: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge-types.d.ts","sourceRoot":"","sources":["../../src/dictionary/merge-types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"merge-types.d.ts","sourceRoot":"","sources":["../../src/dictionary/merge-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge-types.js","sourceRoot":"","sources":["../../src/dictionary/merge-types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"merge-types.js","sourceRoot":"","sources":["../../src/dictionary/merge-types.ts"],"names":[],"mappings":"AAmHA;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAc;IACjC,sBAAsB,EAAE,CAAC;IACzB,YAAY,EAAE,CAAC;IACf,kBAAkB,EAAE,CAAC;IACrB,WAAW,EAAE,CAAC;IACd,gBAAgB,EAAE,CAAC;IACnB,cAAc,EAAE,CAAC;IACjB,gBAAgB,EAAE,CAAC;IACnB,cAAc,EAAE,CAAC;IACjB,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,CAAC;IACd,WAAW,EAAE,CAAC;CACf,CAAC;AAYF;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAgB,EAAE,KAAgB;IACzD,OAAO;QACL,sBAAsB,EACpB,KAAK,CAAC,sBAAsB,GAAG,KAAK,CAAC,sBAAsB;QAC7D,YAAY,EAAE,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY;QACrD,kBAAkB,EAAE,KAAK,CAAC,kBAAkB,GAAG,KAAK,CAAC,kBAAkB;QACvE,WAAW,EAAE,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW;QAClD,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB;QACjE,cAAc,EAAE,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc;QAC3D,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB;QACjE,cAAc,EAAE,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc;QAC3D,UAAU,EAAE,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU;QAC/C,WAAW,EAAE,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW;QAClD,WAAW,EAAE,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW;KACnD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { CedictEntry } from "../sources/cedict.js";
|
|
2
|
+
import type { DictionaryEntry } from "./entry.js";
|
|
3
|
+
import { type WordSources, type WordTally } from "./merge-types.js";
|
|
4
|
+
/**
|
|
5
|
+
* Every spelling the merge will try to give an entry.
|
|
6
|
+
*
|
|
7
|
+
* The characters Unihan knows, the phrase corpus's headwords and CC-CEDICT's,
|
|
8
|
+
* less the phrase headwords that are really 繁體 spellings of another word —
|
|
9
|
+
* see {@link isSpeltTraditionally}. jieba is absent on purpose: it carries
|
|
10
|
+
* frequencies and tags rather than readings, so a word only it has would arrive
|
|
11
|
+
* with nothing to read it by.
|
|
12
|
+
*/
|
|
13
|
+
export declare function wordList(phrase: ReadonlyMap<string, readonly string[]>, defaults: ReadonlyMap<string, unknown>, cedictByWord: ReadonlyMap<string, readonly CedictEntry[]>, cedictByHant: ReadonlyMap<string, readonly CedictEntry[]>): readonly string[];
|
|
14
|
+
/**
|
|
15
|
+
* What the walk produced: the entries, what it turned away, and the counts.
|
|
16
|
+
*/
|
|
17
|
+
export interface MergedWords {
|
|
18
|
+
readonly entries: readonly DictionaryEntry[];
|
|
19
|
+
/** Spellings no source gave a usable reading, and what it gave instead. */
|
|
20
|
+
readonly rejected: ReadonlyMap<string, readonly string[]>;
|
|
21
|
+
readonly counts: WordTally;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Settle every word in the list.
|
|
25
|
+
*/
|
|
26
|
+
export declare function mergeWords(words: readonly string[], sources: WordSources): MergedWords;
|
|
27
|
+
//# sourceMappingURL=merge-walk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-walk.d.ts","sourceRoot":"","sources":["../../src/dictionary/merge-walk.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,SAAS,EACf,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,EAC9C,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC,EACzD,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC,GACxD,SAAS,MAAM,EAAE,CASnB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAC;IAC7C,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC;IAC1D,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,OAAO,EAAE,WAAW,GACnB,WAAW,CAmBb"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The word list the merge walks, and what walking it comes to.
|
|
3
|
+
*
|
|
4
|
+
* Which spellings get an entry at all, and the loop that settles each of them.
|
|
5
|
+
* `merge.ts` is the order of the passes; this is the pass over the words.
|
|
6
|
+
*/
|
|
7
|
+
import { byCodeUnit } from "./artifact-format.js";
|
|
8
|
+
import { isSpeltTraditionally } from "./cedict-senses.js";
|
|
9
|
+
import { mergeWord } from "./merge-word.js";
|
|
10
|
+
import { addTally, NO_TALLY, } from "./merge-types.js";
|
|
11
|
+
/**
|
|
12
|
+
* Every spelling the merge will try to give an entry.
|
|
13
|
+
*
|
|
14
|
+
* The characters Unihan knows, the phrase corpus's headwords and CC-CEDICT's,
|
|
15
|
+
* less the phrase headwords that are really 繁體 spellings of another word —
|
|
16
|
+
* see {@link isSpeltTraditionally}. jieba is absent on purpose: it carries
|
|
17
|
+
* frequencies and tags rather than readings, so a word only it has would arrive
|
|
18
|
+
* with nothing to read it by.
|
|
19
|
+
*/
|
|
20
|
+
export function wordList(phrase, defaults, cedictByWord, cedictByHant) {
|
|
21
|
+
const words = new Set([
|
|
22
|
+
...defaults.keys(),
|
|
23
|
+
...[...phrase.keys()].filter((word) => !isSpeltTraditionally(word, cedictByWord, cedictByHant)),
|
|
24
|
+
...cedictByWord.keys(),
|
|
25
|
+
]);
|
|
26
|
+
return [...words].toSorted(byCodeUnit);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Settle every word in the list.
|
|
30
|
+
*/
|
|
31
|
+
export function mergeWords(words, sources) {
|
|
32
|
+
const entries = [];
|
|
33
|
+
const rejected = new Map();
|
|
34
|
+
let counts = NO_TALLY;
|
|
35
|
+
for (const word of words) {
|
|
36
|
+
const merged = mergeWord(word, sources);
|
|
37
|
+
counts = addTally(counts, merged.tally);
|
|
38
|
+
if (merged.rejected !== undefined) {
|
|
39
|
+
rejected.set(word, merged.rejected);
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
/* c8 ignore next 3 -- a word is either rejected or gives an entry */
|
|
43
|
+
if (merged.entry !== undefined) {
|
|
44
|
+
entries.push(merged.entry);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return { entries, rejected, counts };
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=merge-walk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-walk.js","sourceRoot":"","sources":["../../src/dictionary/merge-walk.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG1D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACL,QAAQ,EACR,QAAQ,GAGT,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;;GAQG;AACH,MAAM,UAAU,QAAQ,CACtB,MAA8C,EAC9C,QAAsC,EACtC,YAAyD,EACzD,YAAyD;IAEzD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAS;QAC5B,GAAG,QAAQ,CAAC,IAAI,EAAE;QAClB,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAC1B,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,oBAAoB,CAAC,IAAI,EAAE,YAAY,EAAE,YAAY,CAAC,CAClE;QACD,GAAG,YAAY,CAAC,IAAI,EAAE;KACvB,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AACzC,CAAC;AAYD;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,KAAwB,EACxB,OAAoB;IAEpB,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAC;IACtD,IAAI,MAAM,GAAG,QAAQ,CAAC;IAEtB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACxC,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAClC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;YACpC,SAAS;QACX,CAAC;QACD,qEAAqE;QACrE,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AACvC,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { MergeResult, MergeSources } from "./merge-types.js";
|
|
2
2
|
export type { MergeResult, MergeSources, MergeStats } from "./merge-types.js";
|
|
3
3
|
/**
|
|
4
4
|
* Build the merged dictionary from the four parsed sources.
|
|
@@ -6,8 +6,8 @@ export type { MergeResult, MergeSources, MergeStats } from "./merge-types.js";
|
|
|
6
6
|
* The order of operations is the one MERGE.md sets out, and it is not
|
|
7
7
|
* arbitrary — each step depends on the one before. Spelling, tones, sandhi and
|
|
8
8
|
* validation happen in {@link import("./reading.js").readAlignedReading} as each source is read;
|
|
9
|
-
* {@link
|
|
10
|
-
*
|
|
9
|
+
* {@link mergeWords} then settles one word at a time, and the passes after it
|
|
10
|
+
* see every entry at once.
|
|
11
11
|
*/
|
|
12
12
|
export declare function mergeSources(sources: MergeSources): MergeResult;
|
|
13
13
|
//# sourceMappingURL=merge.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/dictionary/merge.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/dictionary/merge.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAe,MAAM,kBAAkB,CAAC;AAE/E,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9E;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,WAAW,CAuD/D"}
|