calliope-ts 0.0.2 → 0.0.3

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.
Files changed (159) hide show
  1. package/README.md +3 -13
  2. package/dist/caesura.d.ts +33 -0
  3. package/dist/caesura.d.ts.map +1 -0
  4. package/dist/caesura.js +202 -0
  5. package/dist/calliope/boundaries.d.ts +19 -0
  6. package/dist/calliope/boundaries.d.ts.map +1 -0
  7. package/dist/calliope/boundaries.js +182 -0
  8. package/dist/calliope/bracketing.d.ts +11 -0
  9. package/dist/calliope/bracketing.d.ts.map +1 -0
  10. package/dist/calliope/bracketing.js +416 -0
  11. package/dist/calliope/deps.d.ts +4 -0
  12. package/dist/calliope/deps.d.ts.map +1 -0
  13. package/dist/calliope/deps.js +181 -0
  14. package/dist/calliope/engine.d.ts +3 -0
  15. package/dist/calliope/engine.d.ts.map +1 -0
  16. package/dist/calliope/engine.js +71 -0
  17. package/dist/calliope/feats.d.ts +9 -0
  18. package/dist/calliope/feats.d.ts.map +1 -0
  19. package/dist/calliope/feats.js +45 -0
  20. package/dist/calliope/names.d.ts +7 -0
  21. package/dist/calliope/names.d.ts.map +1 -0
  22. package/dist/calliope/names.js +42 -0
  23. package/dist/calliope/postag.d.ts +8 -0
  24. package/dist/calliope/postag.d.ts.map +1 -0
  25. package/dist/calliope/postag.js +250 -0
  26. package/dist/calliope/prosodic.d.ts +3 -0
  27. package/dist/calliope/prosodic.d.ts.map +1 -0
  28. package/dist/calliope/prosodic.js +275 -0
  29. package/dist/calliope/relstress.d.ts +4 -0
  30. package/dist/calliope/relstress.d.ts.map +1 -0
  31. package/dist/calliope/relstress.js +688 -0
  32. package/dist/calliope/stressrules.d.ts +28 -0
  33. package/dist/calliope/stressrules.d.ts.map +1 -0
  34. package/dist/calliope/stressrules.js +147 -0
  35. package/dist/calliope/syntax.d.ts +38 -0
  36. package/dist/calliope/syntax.d.ts.map +1 -0
  37. package/dist/calliope/syntax.js +234 -0
  38. package/dist/calliope/udpos.d.ts +13 -0
  39. package/dist/calliope/udpos.d.ts.map +1 -0
  40. package/dist/calliope/udpos.js +156 -0
  41. package/dist/clio/caesura.d.ts +27 -0
  42. package/dist/clio/caesura.d.ts.map +1 -0
  43. package/dist/clio/caesura.js +148 -0
  44. package/dist/clio/depfix.d.ts +13 -0
  45. package/dist/clio/depfix.d.ts.map +1 -0
  46. package/dist/clio/depfix.js +84 -0
  47. package/dist/clio/display.d.ts +32 -0
  48. package/dist/clio/display.d.ts.map +1 -0
  49. package/dist/clio/display.js +976 -0
  50. package/dist/clio/engine.d.ts +3 -0
  51. package/dist/clio/engine.d.ts.map +1 -0
  52. package/dist/clio/engine.js +28 -0
  53. package/dist/clio/parser.d.ts +10 -0
  54. package/dist/clio/parser.d.ts.map +1 -0
  55. package/dist/clio/parser.js +696 -0
  56. package/dist/clio/phonological.d.ts +41 -0
  57. package/dist/clio/phonological.d.ts.map +1 -0
  58. package/dist/clio/phonological.js +788 -0
  59. package/dist/clio/phrasestress.d.ts +6 -0
  60. package/dist/clio/phrasestress.d.ts.map +1 -0
  61. package/dist/clio/phrasestress.js +106 -0
  62. package/dist/clio/pipeline.d.ts +11 -0
  63. package/dist/clio/pipeline.d.ts.map +1 -0
  64. package/dist/clio/pipeline.js +147 -0
  65. package/dist/clio/rhyme.d.ts +65 -0
  66. package/dist/clio/rhyme.d.ts.map +1 -0
  67. package/dist/clio/rhyme.js +761 -0
  68. package/dist/clio/scandroid.d.ts +17 -0
  69. package/dist/clio/scandroid.d.ts.map +1 -0
  70. package/dist/clio/scandroid.js +435 -0
  71. package/dist/clio/scansion.d.ts +46 -0
  72. package/dist/clio/scansion.d.ts.map +1 -0
  73. package/dist/clio/scansion.js +1086 -0
  74. package/dist/clio/semantics.d.ts +44 -0
  75. package/dist/clio/semantics.d.ts.map +1 -0
  76. package/dist/clio/semantics.js +139 -0
  77. package/dist/clio/stress.d.ts +83 -0
  78. package/dist/clio/stress.d.ts.map +1 -0
  79. package/dist/clio/stress.js +1737 -0
  80. package/dist/clio/tagfix.d.ts +6 -0
  81. package/dist/clio/tagfix.d.ts.map +1 -0
  82. package/dist/clio/tagfix.js +101 -0
  83. package/dist/display.d.ts +0 -6
  84. package/dist/display.d.ts.map +1 -1
  85. package/dist/display.js +322 -141
  86. package/dist/engine.d.ts +9 -0
  87. package/dist/engine.d.ts.map +1 -0
  88. package/dist/engine.js +12 -0
  89. package/dist/index.d.ts +4 -3
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +169 -26
  92. package/dist/parser.d.ts +3 -3
  93. package/dist/parser.d.ts.map +1 -1
  94. package/dist/parser.js +320 -563
  95. package/dist/phonological.d.ts +1 -1
  96. package/dist/phonological.d.ts.map +1 -1
  97. package/dist/phonological.js +73 -4
  98. package/dist/phrasestress.d.ts +6 -0
  99. package/dist/phrasestress.d.ts.map +1 -0
  100. package/dist/phrasestress.js +106 -0
  101. package/dist/rhyme.d.ts +40 -1
  102. package/dist/rhyme.d.ts.map +1 -1
  103. package/dist/rhyme.js +435 -7
  104. package/dist/scansion.d.ts +9 -0
  105. package/dist/scansion.d.ts.map +1 -1
  106. package/dist/scansion.js +145 -18
  107. package/dist/semantics.d.ts +44 -0
  108. package/dist/semantics.d.ts.map +1 -0
  109. package/dist/semantics.js +139 -0
  110. package/dist/stress.d.ts +127 -4
  111. package/dist/stress.d.ts.map +1 -1
  112. package/dist/stress.js +834 -61
  113. package/dist/types.d.ts +15 -0
  114. package/dist/types.d.ts.map +1 -1
  115. package/package.json +5 -3
  116. package/src/caesura.ts +201 -0
  117. package/src/calliope/boundaries.ts +190 -0
  118. package/src/calliope/bracketing.ts +390 -0
  119. package/src/calliope/deps.ts +160 -0
  120. package/src/calliope/engine.ts +77 -0
  121. package/src/calliope/feats.ts +46 -0
  122. package/src/calliope/names.ts +44 -0
  123. package/src/calliope/postag.ts +253 -0
  124. package/src/calliope/prosodic.ts +262 -0
  125. package/src/calliope/relstress.ts +645 -0
  126. package/src/calliope/stressrules.ts +147 -0
  127. package/src/calliope/syntax.ts +218 -0
  128. package/src/calliope/udpos.ts +152 -0
  129. package/src/clio/caesura.ts +145 -0
  130. package/src/clio/depfix.ts +88 -0
  131. package/src/clio/display.ts +1042 -0
  132. package/src/clio/engine.ts +38 -0
  133. package/src/clio/parser.ts +845 -0
  134. package/src/clio/phonological.ts +849 -0
  135. package/src/clio/phrasestress.ts +108 -0
  136. package/src/clio/pipeline.ts +154 -0
  137. package/src/clio/rhyme.ts +740 -0
  138. package/src/clio/scandroid.ts +434 -0
  139. package/src/clio/scansion.ts +1130 -0
  140. package/src/clio/semantics.ts +134 -0
  141. package/src/clio/stress.ts +1731 -0
  142. package/src/clio/tagfix.ts +104 -0
  143. package/src/display.ts +321 -137
  144. package/src/engine.ts +22 -0
  145. package/src/index.ts +176 -32
  146. package/src/parser.ts +346 -682
  147. package/src/phonological.ts +72 -4
  148. package/src/phrasestress.ts +108 -0
  149. package/src/rhyme.ts +428 -8
  150. package/src/scansion.ts +136 -15
  151. package/src/semantics.ts +134 -0
  152. package/src/stress.ts +794 -64
  153. package/src/types.ts +39 -4
  154. package/tests/DataForHayesLinesOnly.txt +364 -0
  155. package/tests/DataForHayesStressSymbolsRevised.txt +728 -0
  156. package/tests/basic.test.ts +443 -37
  157. package/tests/bench-hayes.mjs +72 -0
  158. package/tests/wagner-stress.test.ts +188 -0
  159. package/vitest.config.ts +0 -15
@@ -0,0 +1,88 @@
1
+ // depfix.ts — Post-parse dependency repair via DepEdit rules (the `depedits`
2
+ // npm package, the maintainer's TypeScript port of DepEdit).
3
+ //
4
+ // Runs AFTER en-parse, complementing the pre-parse tag corrections in
5
+ // tagfix.ts: tagfix repairs what the tagger got wrong before the tree is
6
+ // built; this pass repairs systematic attachment errors en-parse makes even
7
+ // with correct tags. Rules are written in DepEdit's declarative format
8
+ // (definitions ⟶ relations ⟶ actions, tab-separated) over en-parse's own
9
+ // label space (DOBJ/NSUBJ/DEP/…), so the round-trip is lossless and every
10
+ // rule is independently testable.
11
+ //
12
+ // The rule set is deliberately small and evidence-based — each rule cites the
13
+ // observed failure it corrects. `depedits` is ESM-only; it is loaded lazily
14
+ // and failures degrade gracefully (the unrepaired parse is still a parse).
15
+
16
+ import { createRequire } from 'module';
17
+
18
+ interface FinDepNode {
19
+ label: string; // dependency label, e.g. "NSUBJ", "ROOT"
20
+ type: string; // phrase type, e.g. "NP", "VP"
21
+ parent: number; // 0-based index of governor token; -1 for root
22
+ }
23
+
24
+ // Observed failure (probe: "I had quit the programming paradigm"): en-parse
25
+ // attaches BOTH nouns of a noun compound to the verb as parallel objects
26
+ // ("programming ←DOBJ← quit", "paradigm ←DOBJ← quit"), and leaves the
27
+ // determiner dangling on the first noun as generic DEP. The repairs:
28
+ // 1. Two adjacent common nouns sharing a governor with the same object
29
+ // relation → the first is a compound modifier (AMOD) of the second.
30
+ // 2. A determiner left as DEP on a noun that has become a modifier →
31
+ // re-attach it as DET to that noun's head (the true NP head).
32
+ const CALLIOPE_DEP_FIXES = [
33
+ 'xpos=/NNS?/&func=/DOBJ|IOBJ/;xpos=/NNS?/&func=/DOBJ|IOBJ/;xpos=/VB.*/\t#3>#1;#3>#2;#1.#2\t#2>#1;#1:func=AMOD',
34
+ 'xpos=/DT/&func=/DEP|EXT/;xpos=/NNS?/&func=/AMOD/;xpos=/NNS?.*/\t#2>#1;#3>#2\t#3>#1;#1:func=DET',
35
+ ].join('\n');
36
+
37
+ let engine: { process(conllu: string): string } | null | undefined;
38
+
39
+ function loadEngine(): typeof engine {
40
+ if (engine !== undefined) return engine;
41
+ try {
42
+ // This package compiles to ESM, where bare `require` does not exist, and
43
+ // the parse path is synchronous, so dynamic import() is not an option:
44
+ // createRequire gives a sync loader, and since `depedits` is itself
45
+ // ESM-only this resolves via Node's require(esm) (≥20.17 / ≥22.12). On
46
+ // older runtimes it throws and the repair pass degrades to a no-op (the
47
+ // unrepaired parse is still a parse).
48
+ const req = createRequire(import.meta.url);
49
+ const { DepEditEngine } = req('depedits');
50
+ const e = new DepEditEngine();
51
+ e.loadIniString(CALLIOPE_DEP_FIXES);
52
+ engine = e;
53
+ } catch {
54
+ engine = null;
55
+ }
56
+ return engine;
57
+ }
58
+
59
+ /**
60
+ * Repair systematic en-parse attachment errors. Returns a new deps array
61
+ * (same shape as en-parse's `toArray` output); on any failure returns the
62
+ * input unchanged.
63
+ */
64
+ export function applyDepFixes(tokens: string[], tags: string[], deps: FinDepNode[]): FinDepNode[] {
65
+ const e = loadEngine();
66
+ if (!e || tokens.length === 0 || deps.length !== tokens.length) return deps;
67
+ try {
68
+ const conllu = tokens.map((tok, i) => {
69
+ const head = deps[i].parent >= 0 ? deps[i].parent + 1 : 0;
70
+ const safe = tok.replace(/\s/g, '_') || '_';
71
+ return `${i + 1}\t${safe}\t${safe}\t_\t${tags[i] || '_'}\t_\t${head}\t${deps[i].label || 'DEP'}\t_\t_`;
72
+ }).join('\n') + '\n\n';
73
+ const out = e.process(conllu);
74
+ const fixed: FinDepNode[] = deps.map(d => ({ ...d }));
75
+ for (const row of out.split('\n')) {
76
+ const cols = row.split('\t');
77
+ if (cols.length < 10) continue;
78
+ const idx = parseInt(cols[0], 10) - 1;
79
+ if (!(idx >= 0 && idx < fixed.length)) continue;
80
+ const head = parseInt(cols[6], 10);
81
+ fixed[idx].parent = Number.isFinite(head) ? head - 1 : fixed[idx].parent;
82
+ if (cols[7] && cols[7] !== '_') fixed[idx].label = cols[7];
83
+ }
84
+ return fixed;
85
+ } catch {
86
+ return deps;
87
+ }
88
+ }