riksdagsmonitor 0.8.15 → 0.8.17
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/lib/dashboards/coalition-dashboard.d.ts.map +1 -1
- package/dist/lib/dashboards/coalition-dashboard.js +25 -9
- package/dist/lib/dashboards/coalition-dashboard.js.map +1 -1
- package/dist/lib/dashboards/coalition-loader.d.ts.map +1 -1
- package/dist/lib/dashboards/coalition-loader.js +68 -32
- package/dist/lib/dashboards/coalition-loader.js.map +1 -1
- package/dist/lib/shared/chart-factory.d.ts +9 -2
- package/dist/lib/shared/chart-factory.d.ts.map +1 -1
- package/dist/lib/shared/chart-factory.js +9 -2
- package/dist/lib/shared/chart-factory.js.map +1 -1
- package/dist/lib/shared/theme.d.ts +1 -18
- package/dist/lib/shared/theme.d.ts.map +1 -1
- package/dist/lib/shared/theme.js +1 -18
- package/dist/lib/shared/theme.js.map +1 -1
- package/dist/scripts/analysis-reader.d.ts +2 -1
- package/dist/scripts/analysis-reader.d.ts.map +1 -1
- package/dist/scripts/analysis-reader.js.map +1 -1
- package/dist/scripts/data-transformers/content-generators/index.d.ts +32 -4
- package/dist/scripts/data-transformers/content-generators/index.d.ts.map +1 -1
- package/dist/scripts/data-transformers/content-generators/index.js +4 -2
- package/dist/scripts/data-transformers/content-generators/index.js.map +1 -1
- package/dist/scripts/data-transformers/content-generators/shared.d.ts +44 -2
- package/dist/scripts/data-transformers/content-generators/shared.d.ts.map +1 -1
- package/dist/scripts/data-transformers/content-generators/shared.js +9 -3
- package/dist/scripts/data-transformers/content-generators/shared.js.map +1 -1
- package/dist/scripts/generate-news-enhanced/config.d.ts +5 -4
- package/dist/scripts/generate-news-enhanced/config.d.ts.map +1 -1
- package/dist/scripts/generate-news-enhanced/config.js +3 -3
- package/dist/scripts/generate-news-enhanced/config.js.map +1 -1
- package/dist/scripts/generate-news-enhanced/generators.d.ts.map +1 -1
- package/dist/scripts/generate-news-enhanced/generators.js +38 -15
- package/dist/scripts/generate-news-enhanced/generators.js.map +1 -1
- package/dist/scripts/generate-news-enhanced/helpers.d.ts +1 -2
- package/dist/scripts/generate-news-enhanced/helpers.d.ts.map +1 -1
- package/dist/scripts/generate-news-enhanced/helpers.js +31 -1
- package/dist/scripts/generate-news-enhanced/helpers.js.map +1 -1
- package/dist/scripts/generate-news-enhanced/swot-analyzer.d.ts +12 -1
- package/dist/scripts/generate-news-enhanced/swot-analyzer.d.ts.map +1 -1
- package/dist/scripts/generate-news-enhanced/swot-analyzer.js +48 -0
- package/dist/scripts/generate-news-enhanced/swot-analyzer.js.map +1 -1
- package/dist/scripts/news-types/breaking-news.d.ts.map +1 -1
- package/dist/scripts/news-types/breaking-news.js +5 -1
- package/dist/scripts/news-types/breaking-news.js.map +1 -1
- package/dist/scripts/pre-article-analysis/markdown-serializer.d.ts +64 -1
- package/dist/scripts/pre-article-analysis/markdown-serializer.d.ts.map +1 -1
- package/dist/scripts/pre-article-analysis/markdown-serializer.js.map +1 -1
- package/dist/scripts/pre-article-analysis.d.ts.map +1 -1
- package/dist/scripts/pre-article-analysis.js +20 -7
- package/dist/scripts/pre-article-analysis.js.map +1 -1
- package/dist/scripts/types/article.d.ts +33 -3
- package/dist/scripts/types/article.d.ts.map +1 -1
- package/package.json +3 -3
- package/dist/scripts/ai-analysis/coalition-detector.d.ts +0 -28
- package/dist/scripts/ai-analysis/coalition-detector.d.ts.map +0 -1
- package/dist/scripts/ai-analysis/coalition-detector.js +0 -242
- package/dist/scripts/ai-analysis/coalition-detector.js.map +0 -1
- package/dist/scripts/ai-analysis/dashboard-analyzer.d.ts +0 -73
- package/dist/scripts/ai-analysis/dashboard-analyzer.d.ts.map +0 -1
- package/dist/scripts/ai-analysis/dashboard-analyzer.js +0 -511
- package/dist/scripts/ai-analysis/dashboard-analyzer.js.map +0 -1
- package/dist/scripts/ai-analysis/document-analyzer.d.ts +0 -196
- package/dist/scripts/ai-analysis/document-analyzer.d.ts.map +0 -1
- package/dist/scripts/ai-analysis/document-analyzer.js +0 -1001
- package/dist/scripts/ai-analysis/document-analyzer.js.map +0 -1
- package/dist/scripts/ai-analysis/domains/index.d.ts +0 -15
- package/dist/scripts/ai-analysis/domains/index.d.ts.map +0 -1
- package/dist/scripts/ai-analysis/domains/index.js +0 -494
- package/dist/scripts/ai-analysis/domains/index.js.map +0 -1
- package/dist/scripts/ai-analysis/helpers.d.ts +0 -43
- package/dist/scripts/ai-analysis/helpers.d.ts.map +0 -1
- package/dist/scripts/ai-analysis/helpers.js +0 -79
- package/dist/scripts/ai-analysis/helpers.js.map +0 -1
- package/dist/scripts/ai-analysis/index.d.ts +0 -15
- package/dist/scripts/ai-analysis/index.d.ts.map +0 -1
- package/dist/scripts/ai-analysis/index.js +0 -14
- package/dist/scripts/ai-analysis/index.js.map +0 -1
- package/dist/scripts/ai-analysis/pipeline.d.ts +0 -41
- package/dist/scripts/ai-analysis/pipeline.d.ts.map +0 -1
- package/dist/scripts/ai-analysis/pipeline.js +0 -208
- package/dist/scripts/ai-analysis/pipeline.js.map +0 -1
- package/dist/scripts/ai-analysis/political-significance.d.ts +0 -63
- package/dist/scripts/ai-analysis/political-significance.d.ts.map +0 -1
- package/dist/scripts/ai-analysis/political-significance.js +0 -227
- package/dist/scripts/ai-analysis/political-significance.js.map +0 -1
- package/dist/scripts/ai-analysis/quality-assessor.d.ts +0 -104
- package/dist/scripts/ai-analysis/quality-assessor.d.ts.map +0 -1
- package/dist/scripts/ai-analysis/quality-assessor.js +0 -554
- package/dist/scripts/ai-analysis/quality-assessor.js.map +0 -1
- package/dist/scripts/ai-analysis/swot/index.d.ts +0 -56
- package/dist/scripts/ai-analysis/swot/index.d.ts.map +0 -1
- package/dist/scripts/ai-analysis/swot/index.js +0 -360
- package/dist/scripts/ai-analysis/swot/index.js.map +0 -1
- package/dist/scripts/ai-analysis/swot/placeholders.d.ts +0 -30
- package/dist/scripts/ai-analysis/swot/placeholders.d.ts.map +0 -1
- package/dist/scripts/ai-analysis/swot/placeholders.js +0 -381
- package/dist/scripts/ai-analysis/swot/placeholders.js.map +0 -1
- package/dist/scripts/ai-analysis/types.d.ts +0 -333
- package/dist/scripts/ai-analysis/types.d.ts.map +0 -1
- package/dist/scripts/ai-analysis/types.js +0 -19
- package/dist/scripts/ai-analysis/types.js.map +0 -1
- package/dist/scripts/ai-analysis/visualisation/index.d.ts +0 -15
- package/dist/scripts/ai-analysis/visualisation/index.d.ts.map +0 -1
- package/dist/scripts/ai-analysis/visualisation/index.js +0 -179
- package/dist/scripts/ai-analysis/visualisation/index.js.map +0 -1
- package/dist/scripts/analysis-framework/cross-reference.d.ts +0 -35
- package/dist/scripts/analysis-framework/cross-reference.d.ts.map +0 -1
- package/dist/scripts/analysis-framework/cross-reference.js +0 -290
- package/dist/scripts/analysis-framework/cross-reference.js.map +0 -1
- package/dist/scripts/analysis-framework/index.d.ts +0 -79
- package/dist/scripts/analysis-framework/index.d.ts.map +0 -1
- package/dist/scripts/analysis-framework/index.js +0 -133
- package/dist/scripts/analysis-framework/index.js.map +0 -1
- package/dist/scripts/analysis-framework/lenses/citizen.d.ts +0 -29
- package/dist/scripts/analysis-framework/lenses/citizen.d.ts.map +0 -1
- package/dist/scripts/analysis-framework/lenses/citizen.js +0 -220
- package/dist/scripts/analysis-framework/lenses/citizen.js.map +0 -1
- package/dist/scripts/analysis-framework/lenses/economic.d.ts +0 -29
- package/dist/scripts/analysis-framework/lenses/economic.d.ts.map +0 -1
- package/dist/scripts/analysis-framework/lenses/economic.js +0 -227
- package/dist/scripts/analysis-framework/lenses/economic.js.map +0 -1
- package/dist/scripts/analysis-framework/lenses/government.d.ts +0 -32
- package/dist/scripts/analysis-framework/lenses/government.d.ts.map +0 -1
- package/dist/scripts/analysis-framework/lenses/government.js +0 -265
- package/dist/scripts/analysis-framework/lenses/government.js.map +0 -1
- package/dist/scripts/analysis-framework/lenses/international.d.ts +0 -29
- package/dist/scripts/analysis-framework/lenses/international.d.ts.map +0 -1
- package/dist/scripts/analysis-framework/lenses/international.js +0 -248
- package/dist/scripts/analysis-framework/lenses/international.js.map +0 -1
- package/dist/scripts/analysis-framework/lenses/media.d.ts +0 -29
- package/dist/scripts/analysis-framework/lenses/media.d.ts.map +0 -1
- package/dist/scripts/analysis-framework/lenses/media.js +0 -211
- package/dist/scripts/analysis-framework/lenses/media.js.map +0 -1
- package/dist/scripts/analysis-framework/lenses/opposition.d.ts +0 -29
- package/dist/scripts/analysis-framework/lenses/opposition.d.ts.map +0 -1
- package/dist/scripts/analysis-framework/lenses/opposition.js +0 -234
- package/dist/scripts/analysis-framework/lenses/opposition.js.map +0 -1
- package/dist/scripts/analysis-framework/methodology-types.d.ts +0 -309
- package/dist/scripts/analysis-framework/methodology-types.d.ts.map +0 -1
- package/dist/scripts/analysis-framework/methodology-types.js +0 -38
- package/dist/scripts/analysis-framework/methodology-types.js.map +0 -1
- package/dist/scripts/analysis-framework/political-classification.d.ts +0 -58
- package/dist/scripts/analysis-framework/political-classification.d.ts.map +0 -1
- package/dist/scripts/analysis-framework/political-classification.js +0 -414
- package/dist/scripts/analysis-framework/political-classification.js.map +0 -1
- package/dist/scripts/analysis-framework/political-risk-assessment.d.ts +0 -74
- package/dist/scripts/analysis-framework/political-risk-assessment.d.ts.map +0 -1
- package/dist/scripts/analysis-framework/political-risk-assessment.js +0 -656
- package/dist/scripts/analysis-framework/political-risk-assessment.js.map +0 -1
- package/dist/scripts/analysis-framework/political-threat-analysis.d.ts +0 -65
- package/dist/scripts/analysis-framework/political-threat-analysis.d.ts.map +0 -1
- package/dist/scripts/analysis-framework/political-threat-analysis.js +0 -553
- package/dist/scripts/analysis-framework/political-threat-analysis.js.map +0 -1
- package/dist/scripts/analysis-framework/significance-scorer.d.ts +0 -62
- package/dist/scripts/analysis-framework/significance-scorer.d.ts.map +0 -1
- package/dist/scripts/analysis-framework/significance-scorer.js +0 -196
- package/dist/scripts/analysis-framework/significance-scorer.js.map +0 -1
- package/dist/scripts/analysis-framework/types.d.ts +0 -138
- package/dist/scripts/analysis-framework/types.d.ts.map +0 -1
- package/dist/scripts/analysis-framework/types.js +0 -12
- package/dist/scripts/analysis-framework/types.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/ai-swot-analyzer.d.ts +0 -89
- package/dist/scripts/data-transformers/content-generators/ai-swot-analyzer.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/ai-swot-analyzer.js +0 -667
- package/dist/scripts/data-transformers/content-generators/ai-swot-analyzer.js.map +0 -1
- package/dist/scripts/data-transformers/content-generators/stakeholder-swot-section.d.ts +0 -83
- package/dist/scripts/data-transformers/content-generators/stakeholder-swot-section.d.ts.map +0 -1
- package/dist/scripts/data-transformers/content-generators/stakeholder-swot-section.js +0 -219
- package/dist/scripts/data-transformers/content-generators/stakeholder-swot-section.js.map +0 -1
|
@@ -1,211 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module analysis-framework/lenses/media
|
|
3
|
-
* @description Media/public discourse lens for parliamentary document analysis.
|
|
4
|
-
*
|
|
5
|
-
* Evaluates every document from the media and public discourse vantage point:
|
|
6
|
-
* - Newsworthiness scoring
|
|
7
|
-
* - Public sentiment indicators
|
|
8
|
-
* - Narrative framing analysis
|
|
9
|
-
* - Controversy potential
|
|
10
|
-
*
|
|
11
|
-
* @author Hack23 AB
|
|
12
|
-
* @license Apache-2.0
|
|
13
|
-
*/
|
|
14
|
-
import { detectPolicyDomains, detectNarrativeFrames } from '../../data-transformers/policy-analysis.js';
|
|
15
|
-
import { scoreNewsworthiness } from '../../data-transformers/content-generators/newsworthiness.js';
|
|
16
|
-
// ---------------------------------------------------------------------------
|
|
17
|
-
// Controversy keyword banks
|
|
18
|
-
// ---------------------------------------------------------------------------
|
|
19
|
-
/** Topics that reliably generate media controversy */
|
|
20
|
-
const CONTROVERSY_KEYWORDS = [
|
|
21
|
-
'migration', 'invandring', 'kriminalitet', 'gängbrott', 'gang crime',
|
|
22
|
-
'skattehöjning', 'tax rise', 'skattesänkning', 'tax cut',
|
|
23
|
-
'sjukvårdskris', 'healthcare crisis', 'vårdkö', 'healthcare queue',
|
|
24
|
-
'skolresultat', 'school results', 'klimatkris', 'climate crisis',
|
|
25
|
-
'pensionstrygghet', 'pension security', 'bostadskris', 'housing crisis',
|
|
26
|
-
'lön', 'wage', 'pensionsgap', 'pension gap', 'könsgap', 'gender gap',
|
|
27
|
-
'korruption', 'corruption', 'svågerpolitik', 'cronyism', 'lobbying',
|
|
28
|
-
'mutor', 'bribery', 'bedrägeri', 'fraud',
|
|
29
|
-
];
|
|
30
|
-
/** Human-interest / emotive keywords that boost media salience */
|
|
31
|
-
const EMOTIVE_KEYWORDS = [
|
|
32
|
-
'barn', 'children', 'äldre', 'elderly', 'sjuka', 'sick', 'utsatt', 'vulnerable',
|
|
33
|
-
'offer', 'victim', 'kris', 'crisis', 'nödläge', 'emergency', 'katastrof', 'catastrophe',
|
|
34
|
-
'hopp', 'hope', 'framtid', 'future', 'reform', 'förändring', 'change',
|
|
35
|
-
];
|
|
36
|
-
// ---------------------------------------------------------------------------
|
|
37
|
-
// Localised labels
|
|
38
|
-
// ---------------------------------------------------------------------------
|
|
39
|
-
const LENS_LABELS = {
|
|
40
|
-
en: { lensName: 'Media & Public Discourse', stakeholder: 'Media & Public' },
|
|
41
|
-
sv: { lensName: 'Media och offentlig debatt', stakeholder: 'Media och allmänheten' },
|
|
42
|
-
da: { lensName: 'Medier og offentlig debat', stakeholder: 'Medier og offentlighed' },
|
|
43
|
-
no: { lensName: 'Medier og offentlig debatt', stakeholder: 'Medier og offentligheten' },
|
|
44
|
-
fi: { lensName: 'Media ja julkinen diskurssi', stakeholder: 'Media ja yleisö' },
|
|
45
|
-
de: { lensName: 'Medien und öffentlicher Diskurs', stakeholder: 'Medien und Öffentlichkeit' },
|
|
46
|
-
fr: { lensName: 'Médias et discours public', stakeholder: 'Médias et public' },
|
|
47
|
-
es: { lensName: 'Medios y discurso público', stakeholder: 'Medios y público' },
|
|
48
|
-
nl: { lensName: 'Media en publiek discours', stakeholder: 'Media en publiek' },
|
|
49
|
-
ar: { lensName: 'الإعلام والخطاب العام', stakeholder: 'الإعلام والجمهور' },
|
|
50
|
-
he: { lensName: 'תקשורת ושיח ציבורי', stakeholder: 'תקשורת וציבור' },
|
|
51
|
-
ja: { lensName: 'メディア・公論の視点', stakeholder: 'メディア・世論' },
|
|
52
|
-
ko: { lensName: '미디어·공론 관점', stakeholder: '미디어·여론' },
|
|
53
|
-
zh: { lensName: '媒体与公共话语视角', stakeholder: '媒体与公众' },
|
|
54
|
-
};
|
|
55
|
-
function label(lang) {
|
|
56
|
-
return LENS_LABELS[lang] ?? LENS_LABELS['en'];
|
|
57
|
-
}
|
|
58
|
-
function containsAny(text, keywords) {
|
|
59
|
-
const lower = text.toLowerCase();
|
|
60
|
-
return keywords.some(kw => lower.includes(kw.toLowerCase()));
|
|
61
|
-
}
|
|
62
|
-
function countKeywords(text, keywords) {
|
|
63
|
-
const lower = text.toLowerCase();
|
|
64
|
-
return keywords.filter(kw => lower.includes(kw.toLowerCase())).length;
|
|
65
|
-
}
|
|
66
|
-
// ---------------------------------------------------------------------------
|
|
67
|
-
// Scoring helpers
|
|
68
|
-
// ---------------------------------------------------------------------------
|
|
69
|
-
function computeImpact(newsScore) {
|
|
70
|
-
if (newsScore.overall >= 65)
|
|
71
|
-
return 'high';
|
|
72
|
-
if (newsScore.overall >= 35)
|
|
73
|
-
return 'medium';
|
|
74
|
-
return 'low';
|
|
75
|
-
}
|
|
76
|
-
function computeSentiment(doc) {
|
|
77
|
-
const allText = [doc.titel, doc.title, doc.summary, doc.notis].filter(Boolean).join(' ');
|
|
78
|
-
const controversyCount = countKeywords(allText, CONTROVERSY_KEYWORDS);
|
|
79
|
-
const emotiveCount = countKeywords(allText, EMOTIVE_KEYWORDS);
|
|
80
|
-
// High controversy typically generates negative public framing
|
|
81
|
-
if (controversyCount >= 2)
|
|
82
|
-
return 'negative';
|
|
83
|
-
if (emotiveCount >= 2 && controversyCount === 0)
|
|
84
|
-
return 'positive';
|
|
85
|
-
return 'neutral';
|
|
86
|
-
}
|
|
87
|
-
// ---------------------------------------------------------------------------
|
|
88
|
-
// Summary generation
|
|
89
|
-
// ---------------------------------------------------------------------------
|
|
90
|
-
function buildSummary(doc, newsScore, _lang) {
|
|
91
|
-
const docType = doc.doktyp || doc.documentType || 'document';
|
|
92
|
-
const allText = [doc.titel, doc.title, doc.summary, doc.notis].filter(Boolean).join(' ');
|
|
93
|
-
const frames = detectNarrativeFrames(doc);
|
|
94
|
-
const controversyNote = containsAny(allText, CONTROVERSY_KEYWORDS)
|
|
95
|
-
? ' This document touches on topics with high controversy potential and is likely to attract media attention.'
|
|
96
|
-
: '';
|
|
97
|
-
const frameNote = frames.length > 0
|
|
98
|
-
? ` Narrative frames detected: ${frames.slice(0, 2).join(', ')}.`
|
|
99
|
-
: '';
|
|
100
|
-
const newsworthinessLevel = newsScore.overall >= 65 ? 'high' : newsScore.overall >= 35 ? 'moderate' : 'low';
|
|
101
|
-
return `From the media perspective, this ${docType} has ${newsworthinessLevel} newsworthiness (score: ${newsScore.overall}/100).${controversyNote}${frameNote}`.trim();
|
|
102
|
-
}
|
|
103
|
-
// ---------------------------------------------------------------------------
|
|
104
|
-
// SWOT contributions
|
|
105
|
-
// ---------------------------------------------------------------------------
|
|
106
|
-
function buildSwotContributions(doc, newsScore, lang) {
|
|
107
|
-
const { stakeholder } = label(lang);
|
|
108
|
-
const contributions = [];
|
|
109
|
-
const allText = [doc.titel, doc.title, doc.summary, doc.notis].filter(Boolean).join(' ');
|
|
110
|
-
if (newsScore.warrantsDeepInspection) {
|
|
111
|
-
contributions.push({
|
|
112
|
-
quadrant: 'opportunity',
|
|
113
|
-
forStakeholder: stakeholder,
|
|
114
|
-
text: `High newsworthiness score (${newsScore.overall}/100) creates strong public communication opportunity for political actors.`,
|
|
115
|
-
impact: 'high',
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
if (containsAny(allText, CONTROVERSY_KEYWORDS)) {
|
|
119
|
-
contributions.push({
|
|
120
|
-
quadrant: 'threat',
|
|
121
|
-
forStakeholder: stakeholder,
|
|
122
|
-
text: 'Document addresses controversial topics with high potential for negative media framing and public backlash.',
|
|
123
|
-
impact: 'high',
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
if (newsScore.topics.length > 0) {
|
|
127
|
-
contributions.push({
|
|
128
|
-
quadrant: 'strength',
|
|
129
|
-
forStakeholder: stakeholder,
|
|
130
|
-
text: `Strategic topics detected (${newsScore.topics.slice(0, 3).join(', ')}) align with current public agenda.`,
|
|
131
|
-
impact: 'medium',
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
return contributions;
|
|
135
|
-
}
|
|
136
|
-
// ---------------------------------------------------------------------------
|
|
137
|
-
// Dashboard metrics
|
|
138
|
-
// ---------------------------------------------------------------------------
|
|
139
|
-
function buildDashboardMetrics(doc, newsScore) {
|
|
140
|
-
const allText = [doc.titel, doc.title, doc.summary, doc.notis].filter(Boolean).join(' ');
|
|
141
|
-
return [
|
|
142
|
-
{ metricName: 'Newsworthiness Score', value: newsScore.overall, unit: '/100' },
|
|
143
|
-
{ metricName: 'Controversy Signals', value: countKeywords(allText, CONTROVERSY_KEYWORDS), unit: 'hits' },
|
|
144
|
-
{ metricName: 'Emotive Keywords', value: countKeywords(allText, EMOTIVE_KEYWORDS), unit: 'hits' },
|
|
145
|
-
{ metricName: 'Strategic Topics', value: newsScore.topics.length, unit: 'topics' },
|
|
146
|
-
];
|
|
147
|
-
}
|
|
148
|
-
// ---------------------------------------------------------------------------
|
|
149
|
-
// Mindmap nodes
|
|
150
|
-
// ---------------------------------------------------------------------------
|
|
151
|
-
function buildMindmapNodes(doc, _lang) {
|
|
152
|
-
const nodes = [];
|
|
153
|
-
const allText = [doc.titel, doc.title, doc.summary, doc.notis].filter(Boolean).join(' ');
|
|
154
|
-
const frames = detectNarrativeFrames(doc);
|
|
155
|
-
if (containsAny(allText, CONTROVERSY_KEYWORDS)) {
|
|
156
|
-
nodes.push({ branch: 'Controversy Risk', item: 'High Media Salience', weight: 'critical' });
|
|
157
|
-
}
|
|
158
|
-
for (const frame of frames.slice(0, 2)) {
|
|
159
|
-
nodes.push({ branch: 'Narrative Frames', item: frame, weight: 'significant' });
|
|
160
|
-
}
|
|
161
|
-
nodes.push({ branch: 'Public Discourse', item: 'News Agenda Relevance', weight: 'moderate' });
|
|
162
|
-
return nodes;
|
|
163
|
-
}
|
|
164
|
-
// ---------------------------------------------------------------------------
|
|
165
|
-
// Confidence
|
|
166
|
-
// ---------------------------------------------------------------------------
|
|
167
|
-
function computeConfidence(doc, cia) {
|
|
168
|
-
let score = 45;
|
|
169
|
-
if (doc.fullText || doc.fullContent)
|
|
170
|
-
score += 20;
|
|
171
|
-
if (doc.summary || doc.notis)
|
|
172
|
-
score += 10;
|
|
173
|
-
if (cia)
|
|
174
|
-
score += 15;
|
|
175
|
-
if (doc.speeches && doc.speeches.length > 0)
|
|
176
|
-
score += 10;
|
|
177
|
-
return Math.min(100, score);
|
|
178
|
-
}
|
|
179
|
-
// ---------------------------------------------------------------------------
|
|
180
|
-
// Public API
|
|
181
|
-
// ---------------------------------------------------------------------------
|
|
182
|
-
/**
|
|
183
|
-
* Apply the Media/Public Discourse analysis lens to a single parliamentary document.
|
|
184
|
-
*
|
|
185
|
-
* Evaluates newsworthiness, public sentiment, narrative framing, and controversy
|
|
186
|
-
* potential.
|
|
187
|
-
*
|
|
188
|
-
* @param doc - The document to analyse
|
|
189
|
-
* @param cia - Optional CIA context
|
|
190
|
-
* @param lang - Target language
|
|
191
|
-
* @returns A `PerspectiveAnalysis` for the media lens
|
|
192
|
-
*/
|
|
193
|
-
export function analyzeMediaPerspective(doc, cia, lang, precomputedDomains) {
|
|
194
|
-
const keyActors = ['Swedish Media', 'SVT', 'DN', 'Aftonbladet', 'SR'];
|
|
195
|
-
const domains = precomputedDomains ?? detectPolicyDomains(doc, 'en');
|
|
196
|
-
const newsScore = scoreNewsworthiness([doc], cia);
|
|
197
|
-
const relatedPolicies = [...domains, ...newsScore.topics.slice(0, 2)].filter(Boolean);
|
|
198
|
-
return {
|
|
199
|
-
lens: 'media',
|
|
200
|
-
summary: buildSummary(doc, newsScore, lang),
|
|
201
|
-
impact: computeImpact(newsScore),
|
|
202
|
-
sentiment: computeSentiment(doc),
|
|
203
|
-
keyActors: keyActors.slice(0, 5),
|
|
204
|
-
relatedPolicies: relatedPolicies.slice(0, 5),
|
|
205
|
-
swotContribution: buildSwotContributions(doc, newsScore, lang),
|
|
206
|
-
dashboardMetrics: buildDashboardMetrics(doc, newsScore),
|
|
207
|
-
mindmapNodes: buildMindmapNodes(doc, lang),
|
|
208
|
-
confidence: computeConfidence(doc, cia),
|
|
209
|
-
};
|
|
210
|
-
}
|
|
211
|
-
//# sourceMappingURL=media.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../../../scripts/analysis-framework/lenses/media.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module analysis-framework/lenses/opposition
|
|
3
|
-
* @description Opposition perspective lens for parliamentary document analysis.
|
|
4
|
-
*
|
|
5
|
-
* Evaluates every document from the opposition's vantage point:
|
|
6
|
-
* - Scrutiny opportunities
|
|
7
|
-
* - Alternative policy proposals
|
|
8
|
-
* - Electoral positioning impact
|
|
9
|
-
* - Coalition-building potential
|
|
10
|
-
*
|
|
11
|
-
* @author Hack23 AB
|
|
12
|
-
* @license Apache-2.0
|
|
13
|
-
*/
|
|
14
|
-
import type { RawDocument, CIAContext } from '../../data-transformers/types.js';
|
|
15
|
-
import type { Language } from '../../types/language.js';
|
|
16
|
-
import type { PerspectiveAnalysis } from '../types.js';
|
|
17
|
-
/**
|
|
18
|
-
* Apply the Opposition analysis lens to a single parliamentary document.
|
|
19
|
-
*
|
|
20
|
-
* Evaluates scrutiny opportunities, alternative policy proposals, electoral
|
|
21
|
-
* positioning impact, and coalition-building potential.
|
|
22
|
-
*
|
|
23
|
-
* @param doc - The document to analyse
|
|
24
|
-
* @param cia - Optional CIA context
|
|
25
|
-
* @param lang - Target language
|
|
26
|
-
* @returns A `PerspectiveAnalysis` for the opposition lens
|
|
27
|
-
*/
|
|
28
|
-
export declare function analyzeOppositionPerspective(doc: RawDocument, cia: CIAContext | undefined, lang: Language | string, precomputedDomains?: string[]): PerspectiveAnalysis;
|
|
29
|
-
//# sourceMappingURL=opposition.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"opposition.d.ts","sourceRoot":"","sources":["../../../../scripts/analysis-framework/lenses/opposition.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAChF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,mBAAmB,EAA0E,MAAM,aAAa,CAAC;AAsN/H;;;;;;;;;;GAUG;AACH,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,WAAW,EAChB,GAAG,EAAE,UAAU,GAAG,SAAS,EAC3B,IAAI,EAAE,QAAQ,GAAG,MAAM,EACvB,kBAAkB,CAAC,EAAE,MAAM,EAAE,GAC5B,mBAAmB,CAyBrB"}
|
|
@@ -1,234 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module analysis-framework/lenses/opposition
|
|
3
|
-
* @description Opposition perspective lens for parliamentary document analysis.
|
|
4
|
-
*
|
|
5
|
-
* Evaluates every document from the opposition's vantage point:
|
|
6
|
-
* - Scrutiny opportunities
|
|
7
|
-
* - Alternative policy proposals
|
|
8
|
-
* - Electoral positioning impact
|
|
9
|
-
* - Coalition-building potential
|
|
10
|
-
*
|
|
11
|
-
* @author Hack23 AB
|
|
12
|
-
* @license Apache-2.0
|
|
13
|
-
*/
|
|
14
|
-
import { detectPolicyDomains } from '../../data-transformers/policy-analysis.js';
|
|
15
|
-
// ---------------------------------------------------------------------------
|
|
16
|
-
// Scrutiny trigger keywords
|
|
17
|
-
// ---------------------------------------------------------------------------
|
|
18
|
-
/** Topics that typically attract intense opposition scrutiny */
|
|
19
|
-
const SCRUTINY_KEYWORDS = [
|
|
20
|
-
'privatisering', 'privatization', 'avreglering', 'deregulation',
|
|
21
|
-
'skattesänkning', 'tax cut', 'neddragning', 'cut', 'nedskärning',
|
|
22
|
-
'socialbidrag', 'welfare', 'sjukvård', 'healthcare', 'skola', 'school',
|
|
23
|
-
'pension', 'arbetsmarknad', 'labour market', 'integration', 'migration',
|
|
24
|
-
'bostadsbrist', 'housing shortage', 'korruption', 'corruption',
|
|
25
|
-
'granskning', 'scrutiny', 'utredning', 'inquiry',
|
|
26
|
-
];
|
|
27
|
-
// ---------------------------------------------------------------------------
|
|
28
|
-
// Localised labels
|
|
29
|
-
// ---------------------------------------------------------------------------
|
|
30
|
-
const LENS_LABELS = {
|
|
31
|
-
en: { lensName: 'Opposition Perspective', stakeholder: 'Opposition' },
|
|
32
|
-
sv: { lensName: 'Oppositionsperspektiv', stakeholder: 'Oppositionen' },
|
|
33
|
-
da: { lensName: 'Oppositionsperspektiv', stakeholder: 'Oppositionen' },
|
|
34
|
-
no: { lensName: 'Opposisjonsperspektiv', stakeholder: 'Opposisjonen' },
|
|
35
|
-
fi: { lensName: 'Opposition näkökulma', stakeholder: 'Oppositio' },
|
|
36
|
-
de: { lensName: 'Oppositionsperspektive', stakeholder: 'Opposition' },
|
|
37
|
-
fr: { lensName: "Perspective de l'opposition", stakeholder: "Opposition" },
|
|
38
|
-
es: { lensName: 'Perspectiva de la oposición', stakeholder: 'Oposición' },
|
|
39
|
-
nl: { lensName: 'Oppositieperspectief', stakeholder: 'Oppositie' },
|
|
40
|
-
ar: { lensName: 'منظور المعارضة', stakeholder: 'المعارضة' },
|
|
41
|
-
he: { lensName: 'פרספקטיבת האופוזיציה', stakeholder: 'האופוזיציה' },
|
|
42
|
-
ja: { lensName: '野党の視点', stakeholder: '野党' },
|
|
43
|
-
ko: { lensName: '야당 관점', stakeholder: '야당' },
|
|
44
|
-
zh: { lensName: '反对党视角', stakeholder: '反对党' },
|
|
45
|
-
};
|
|
46
|
-
function label(lang) {
|
|
47
|
-
return LENS_LABELS[lang] ?? LENS_LABELS['en'];
|
|
48
|
-
}
|
|
49
|
-
function containsAny(text, keywords) {
|
|
50
|
-
const lower = text.toLowerCase();
|
|
51
|
-
return keywords.some(kw => lower.includes(kw.toLowerCase()));
|
|
52
|
-
}
|
|
53
|
-
// ---------------------------------------------------------------------------
|
|
54
|
-
// Scoring helpers
|
|
55
|
-
// ---------------------------------------------------------------------------
|
|
56
|
-
function computeImpact(doc) {
|
|
57
|
-
const docType = doc.doktyp || doc.documentType || '';
|
|
58
|
-
// Government propositions are prime opposition targets
|
|
59
|
-
if (docType === 'prop')
|
|
60
|
-
return 'high';
|
|
61
|
-
// Committee reports signal a policy decision about to be enacted
|
|
62
|
-
if (docType === 'bet')
|
|
63
|
-
return 'high';
|
|
64
|
-
// Opposition motions: medium self-originated impact
|
|
65
|
-
if (docType === 'mot')
|
|
66
|
-
return 'medium';
|
|
67
|
-
return 'low';
|
|
68
|
-
}
|
|
69
|
-
function computeSentiment(doc) {
|
|
70
|
-
const allText = [doc.titel, doc.title, doc.summary, doc.notis].filter(Boolean).join(' ');
|
|
71
|
-
// Opposition motions are opportunities for the opposition → positive
|
|
72
|
-
if (doc.doktyp === 'mot')
|
|
73
|
-
return 'positive';
|
|
74
|
-
// Scrutiny-triggering content from the government is an opportunity
|
|
75
|
-
if (doc.doktyp === 'prop' && containsAny(allText, SCRUTINY_KEYWORDS))
|
|
76
|
-
return 'positive';
|
|
77
|
-
// Committee reports passing government proposals: negative for opposition
|
|
78
|
-
if (doc.doktyp === 'bet')
|
|
79
|
-
return 'negative';
|
|
80
|
-
return 'neutral';
|
|
81
|
-
}
|
|
82
|
-
// ---------------------------------------------------------------------------
|
|
83
|
-
// Summary generation
|
|
84
|
-
// ---------------------------------------------------------------------------
|
|
85
|
-
function buildSummary(doc, cia, _lang, domains) {
|
|
86
|
-
const title = doc.titel || doc.title || 'Untitled';
|
|
87
|
-
const docType = doc.doktyp || doc.documentType || 'document';
|
|
88
|
-
const domainPhrase = domains.length > 0 ? ` in ${domains.slice(0, 2).join(' and ')}` : '';
|
|
89
|
-
const denialNote = cia
|
|
90
|
-
? ` Note: approximately ${cia.overallMotionDenialRate ?? 99}% of opposition motions are denied.`
|
|
91
|
-
: '';
|
|
92
|
-
if (docType === 'mot') {
|
|
93
|
-
return `From the opposition perspective, this motion${domainPhrase} signals a policy alternative and positions the party electorally.${denialNote} Success in passage is unlikely, but the motion builds party profile and accountability record.`;
|
|
94
|
-
}
|
|
95
|
-
const scrutiny = containsAny(title, SCRUTINY_KEYWORDS);
|
|
96
|
-
const scrutinyNote = scrutiny ? ' This document creates scrutiny opportunities the opposition should exploit in debates and committee hearings.' : '';
|
|
97
|
-
return `From the opposition perspective, this ${docType}${domainPhrase} warrants scrutiny for alignment with citizen welfare and democratic accountability.${scrutinyNote}`.trim();
|
|
98
|
-
}
|
|
99
|
-
// ---------------------------------------------------------------------------
|
|
100
|
-
// SWOT contributions
|
|
101
|
-
// ---------------------------------------------------------------------------
|
|
102
|
-
function buildSwotContributions(doc, cia, lang) {
|
|
103
|
-
const { stakeholder } = label(lang);
|
|
104
|
-
const contributions = [];
|
|
105
|
-
const docType = doc.doktyp || doc.documentType || '';
|
|
106
|
-
const allText = [doc.titel, doc.title, doc.summary, doc.notis].filter(Boolean).join(' ');
|
|
107
|
-
if (docType === 'prop' && containsAny(allText, SCRUTINY_KEYWORDS)) {
|
|
108
|
-
contributions.push({
|
|
109
|
-
quadrant: 'opportunity',
|
|
110
|
-
forStakeholder: stakeholder,
|
|
111
|
-
text: 'Government proposal touches politically sensitive topics, creating scrutiny and differentiation opportunities.',
|
|
112
|
-
impact: 'high',
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
if (docType === 'mot') {
|
|
116
|
-
contributions.push({
|
|
117
|
-
quadrant: 'strength',
|
|
118
|
-
forStakeholder: stakeholder,
|
|
119
|
-
text: 'Opposition motion on record, building electoral positioning and demonstrating policy alternative.',
|
|
120
|
-
impact: 'medium',
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
if (cia && cia.coalitionStability.stabilityScore < 50) {
|
|
124
|
-
contributions.push({
|
|
125
|
-
quadrant: 'opportunity',
|
|
126
|
-
forStakeholder: stakeholder,
|
|
127
|
-
text: `Coalition fragility (stability: ${cia.coalitionStability.stabilityScore}) creates defection recruitment opportunities.`,
|
|
128
|
-
impact: 'high',
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
if (cia && cia.overallMotionDenialRate && cia.overallMotionDenialRate > 95) {
|
|
132
|
-
contributions.push({
|
|
133
|
-
quadrant: 'threat',
|
|
134
|
-
forStakeholder: stakeholder,
|
|
135
|
-
text: `High motion denial rate (${cia.overallMotionDenialRate}%) limits legislative impact of opposition proposals.`,
|
|
136
|
-
impact: 'medium',
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
return contributions;
|
|
140
|
-
}
|
|
141
|
-
// ---------------------------------------------------------------------------
|
|
142
|
-
// Dashboard metrics
|
|
143
|
-
// ---------------------------------------------------------------------------
|
|
144
|
-
function buildDashboardMetrics(_doc, cia) {
|
|
145
|
-
const metrics = [];
|
|
146
|
-
if (cia) {
|
|
147
|
-
metrics.push({
|
|
148
|
-
metricName: 'Motion Denial Rate',
|
|
149
|
-
value: cia.overallMotionDenialRate ?? 99,
|
|
150
|
-
unit: '%',
|
|
151
|
-
});
|
|
152
|
-
metrics.push({
|
|
153
|
-
metricName: 'Coalition Stability',
|
|
154
|
-
value: cia.coalitionStability.stabilityScore,
|
|
155
|
-
unit: 'score',
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
return metrics;
|
|
159
|
-
}
|
|
160
|
-
// ---------------------------------------------------------------------------
|
|
161
|
-
// Mindmap nodes
|
|
162
|
-
// ---------------------------------------------------------------------------
|
|
163
|
-
function buildMindmapNodes(doc, _lang, domains) {
|
|
164
|
-
const nodes = [];
|
|
165
|
-
const docType = doc.doktyp || doc.documentType || '';
|
|
166
|
-
nodes.push({
|
|
167
|
-
branch: 'Scrutiny Targets',
|
|
168
|
-
item: docType === 'prop' ? 'Government Bill Accountability' : 'Legislative Oversight',
|
|
169
|
-
weight: docType === 'prop' ? 'critical' : 'significant',
|
|
170
|
-
});
|
|
171
|
-
for (const domain of domains.slice(0, 2)) {
|
|
172
|
-
nodes.push({
|
|
173
|
-
branch: 'Electoral Positioning',
|
|
174
|
-
item: domain,
|
|
175
|
-
weight: 'moderate',
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
return nodes;
|
|
179
|
-
}
|
|
180
|
-
// ---------------------------------------------------------------------------
|
|
181
|
-
// Confidence
|
|
182
|
-
// ---------------------------------------------------------------------------
|
|
183
|
-
function computeConfidence(doc, cia) {
|
|
184
|
-
let score = 40;
|
|
185
|
-
if (doc.fullText || doc.fullContent)
|
|
186
|
-
score += 20;
|
|
187
|
-
if (doc.summary || doc.notis)
|
|
188
|
-
score += 10;
|
|
189
|
-
if (cia)
|
|
190
|
-
score += 20;
|
|
191
|
-
if (doc.speeches && doc.speeches.length > 0)
|
|
192
|
-
score += 10;
|
|
193
|
-
return Math.min(100, score);
|
|
194
|
-
}
|
|
195
|
-
// ---------------------------------------------------------------------------
|
|
196
|
-
// Public API
|
|
197
|
-
// ---------------------------------------------------------------------------
|
|
198
|
-
/**
|
|
199
|
-
* Apply the Opposition analysis lens to a single parliamentary document.
|
|
200
|
-
*
|
|
201
|
-
* Evaluates scrutiny opportunities, alternative policy proposals, electoral
|
|
202
|
-
* positioning impact, and coalition-building potential.
|
|
203
|
-
*
|
|
204
|
-
* @param doc - The document to analyse
|
|
205
|
-
* @param cia - Optional CIA context
|
|
206
|
-
* @param lang - Target language
|
|
207
|
-
* @returns A `PerspectiveAnalysis` for the opposition lens
|
|
208
|
-
*/
|
|
209
|
-
export function analyzeOppositionPerspective(doc, cia, lang, precomputedDomains) {
|
|
210
|
-
// Key actors: opposition parties in parliament
|
|
211
|
-
const keyActors = ['Opposition Leader', 'Shadow Cabinet'];
|
|
212
|
-
if (cia) {
|
|
213
|
-
// Include parties that are not the largest governing bloc
|
|
214
|
-
const parties = (cia.partyPerformance ?? []).slice(0, 4).map(p => p.partyName);
|
|
215
|
-
keyActors.push(...parties);
|
|
216
|
-
}
|
|
217
|
-
if (doc.parti)
|
|
218
|
-
keyActors.unshift(doc.parti);
|
|
219
|
-
const domains = precomputedDomains ?? detectPolicyDomains(doc, 'en');
|
|
220
|
-
const relatedPolicies = [...domains, 'Electoral Programme', 'Parliamentary Scrutiny'].filter(Boolean);
|
|
221
|
-
return {
|
|
222
|
-
lens: 'opposition',
|
|
223
|
-
summary: buildSummary(doc, cia, lang, domains),
|
|
224
|
-
impact: computeImpact(doc),
|
|
225
|
-
sentiment: computeSentiment(doc),
|
|
226
|
-
keyActors: [...new Set(keyActors)].slice(0, 5),
|
|
227
|
-
relatedPolicies: relatedPolicies.slice(0, 5),
|
|
228
|
-
swotContribution: buildSwotContributions(doc, cia, lang),
|
|
229
|
-
dashboardMetrics: buildDashboardMetrics(doc, cia),
|
|
230
|
-
mindmapNodes: buildMindmapNodes(doc, lang, domains),
|
|
231
|
-
confidence: computeConfidence(doc, cia),
|
|
232
|
-
};
|
|
233
|
-
}
|
|
234
|
-
//# sourceMappingURL=opposition.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"opposition.js","sourceRoot":"","sources":["../../../../scripts/analysis-framework/lenses/opposition.ts"],"names":[],"mappings":"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"}
|