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,134 @@
1
+ // semantics.ts — Prominence signals mined from the dependency parse + POS.
2
+ //
3
+ // Dependency roles ARE the semantic layer: NSUBJ=agent, DOBJ/IOBJ=patient/
4
+ // recipient, OBL/ADVMOD/ADVCL=peripheral, PRP$=possessor, INTJ/DISCOURSE=
5
+ // address. A flat POS floor crushes function words that these configurations
6
+ // reveal to be prominent — a STRANDED preposition ("what are you waiting FOR"),
7
+ // a CONTRASTIVE possessive ("thy choice, not mine"), a VOCATIVE. These
8
+ // detectors recover that prominence from observable structure only (no semantic
9
+ // guessing, no cross-poem givenness). They are consumed by the relativiser
10
+ // (stress.ts) as targeted floor RAISES, and by the nuclear pass (Phase 4).
11
+
12
+ import { ClsWord } from '../types.js';
13
+ import { isPunctuation } from './parser.js';
14
+
15
+ /** True if some other token has `word` as its dependency governor (i.e. word
16
+ * has a complement/dependent of its own). */
17
+ function hasDependent(word: ClsWord, words: ClsWord[]): boolean {
18
+ for (const w of words) {
19
+ if (w !== word && w.dependency && w.dependency.governor === word) return true;
20
+ }
21
+ return false;
22
+ }
23
+
24
+ /** Last non-punctuation token index in the sentence at/after `from`? */
25
+ function isClauseFinal(word: ClsWord, words: ClsWord[]): boolean {
26
+ const idx = words.indexOf(word);
27
+ if (idx < 0) return false;
28
+ for (let k = idx + 1; k < words.length; k++) {
29
+ if (!isPunctuation(words[k].lexicalClass)) return false;
30
+ }
31
+ return true;
32
+ }
33
+
34
+ /**
35
+ * A STRANDED preposition: an IN preposition whose complement has been extracted
36
+ * (wh-movement / relativisation / topicalisation), so it governs no object and
37
+ * sits clause-finally — "what are you waiting FOR", "…what you stare AT". Such
38
+ * a preposition bears stress (it is not the reducible proclitic of "in the
39
+ * house"). Conservative: IN only (infinitival TO is excluded — "I want to go"
40
+ * is not stranding), no dependent, and clause-final (the canonical strand site).
41
+ */
42
+ export function isStrandedPreposition(word: ClsWord, words: ClsWord[]): boolean {
43
+ if (word.lexicalClass !== 'IN') return false;
44
+ if (hasDependent(word, words)) return false; // has a complement → ordinary preposition
45
+ return isClauseFinal(word, words);
46
+ }
47
+
48
+ /** Absolute / elliptical possessive pronouns used as the contrasted element. */
49
+ const ABSOLUTE_POSSESSIVES = new Set([
50
+ 'mine', 'thine', 'yours', 'hers', 'ours', 'theirs', 'his',
51
+ ]);
52
+ const CONTRAST_MARKERS = new Set(['not', 'but', 'nor']);
53
+
54
+ /**
55
+ * A CONTRASTIVE possessive: a possessive determiner (PRP$: thy/my/your/her…)
56
+ * in the elliptical contrast frame "X's … not/but MINE" — the contrast lifts
57
+ * the possessor out of reduction ("it was THY choice, not mine"). Tight by
58
+ * construction: requires a contrast marker (not/but/nor) adjacent to an
59
+ * absolute possessive somewhere in the clause, so an ordinary unfocused
60
+ * possessive ("I lost my way") is left alone.
61
+ */
62
+ export function isContrastivePossessive(word: ClsWord, words: ClsWord[]): boolean {
63
+ if (word.lexicalClass !== 'PRP$') return false;
64
+ for (let i = 0; i + 1 < words.length; i++) {
65
+ const a = words[i].word.toLowerCase();
66
+ const b = words[i + 1].word.toLowerCase().replace(/['’]/g, '');
67
+ if (CONTRAST_MARKERS.has(a) && ABSOLUTE_POSSESSIVES.has(b)) return true;
68
+ }
69
+ return false;
70
+ }
71
+
72
+ /** Finite auxiliaries / modals whose appearance before a subject pronoun marks
73
+ * subject-aux inversion. */
74
+ const INVERSION_AUX = new Set(['MD', 'VBP', 'VBZ', 'VBD']);
75
+
76
+ /**
77
+ * A fronted DEICTIC LOCATIVE "there"/"here" in locative inversion — "THERE
78
+ * could I marvel", "HERE could I rest". FinNLP mis-tags the fronted locative
79
+ * as existential (EX / expl) or reduces it as a discourse adverb, flattening it
80
+ * to 'w'; but a fronted locative that triggers subject-aux inversion (an
81
+ * aux/modal immediately followed by a subject pronoun) is a stressed deictic
82
+ * focus, NOT the reduced existential of "there IS a house" (no inversion) or
83
+ * the presentational "there LIVED a king" (verb + NP, no inversion).
84
+ */
85
+ export function isDeicticLocative(word: ClsWord, words: ClsWord[]): boolean {
86
+ const lemma = word.word.toLowerCase().replace(/['’]/g, '');
87
+ if (lemma !== 'there' && lemma !== 'here') return false;
88
+ const idx = words.indexOf(word);
89
+ // must be the first non-punctuation token (fronted)
90
+ let first = -1;
91
+ for (let i = 0; i < words.length; i++) {
92
+ if (!isPunctuation(words[i].lexicalClass)) { first = i; break; }
93
+ }
94
+ if (idx !== first) return false;
95
+ // subject-aux inversion: <there/here> <aux|modal> <subject pronoun>
96
+ const aux = words[idx + 1];
97
+ const subj = words[idx + 2];
98
+ return !!(aux && subj && INVERSION_AUX.has(aux.lexicalClass) && subj.lexicalClass === 'PRP');
99
+ }
100
+
101
+ /**
102
+ * Imperative clause: the ROOT is a base-form verb (VB) with no overt subject
103
+ * (no NSUBJ dependent) — "Tell me…", "Do not go…". Used by the nuclear pass:
104
+ * the accent falls on the verb / its object, not on a (dropped) subject, and an
105
+ * imperative-clause vocative is a direct address.
106
+ */
107
+ export function isImperativeClause(words: ClsWord[]): boolean {
108
+ const root = words.find(w => w.dependency && w.dependency.dependentType === 'root');
109
+ if (!root) return false;
110
+ if (root.lexicalClass !== 'VB' && root.lexicalClass !== 'VBP') return false;
111
+ for (const w of words) {
112
+ if (w.dependency && w.dependency.governor === root
113
+ && /nsubj/i.test(w.dependency.dependentType)) return false;
114
+ }
115
+ return true;
116
+ }
117
+
118
+ /**
119
+ * A VOCATIVE (direct address): a noun tagged DISCOURSE/INTJ/DEP and set off by
120
+ * adjacent punctuation (a comma or "!"), in a clause that is imperative or
121
+ * subject-less — "Sing, O GODDESS…", "blow, BUGLE, blow". Conservative: the
122
+ * noun must be comma/!-adjacent so an ordinary argument noun is not swept in.
123
+ */
124
+ export function isVocative(word: ClsWord, words: ClsWord[]): boolean {
125
+ if (!/^(NN|NNS|NNP|NNPS)$/.test(word.lexicalClass)) return false;
126
+ const role = word.dependency?.dependentType ?? '';
127
+ if (!/discourse|intj|dep|vocative/i.test(role)) return false;
128
+ const idx = words.indexOf(word);
129
+ const prev = idx > 0 ? words[idx - 1] : null;
130
+ const next = idx + 1 < words.length ? words[idx + 1] : null;
131
+ const commaAdjacent =
132
+ (prev && /^[,!]$/.test(prev.word)) || (next && /^[,!]$/.test(next.word));
133
+ return !!commaAdjacent && isImperativeClause(words);
134
+ }