feat: add motion semantic drift analysis script

- Implement SVD axis stability using Lasso regression on fused embeddings
- Add overtone shift analysis to detect semantic content changes
- Implement semantic drift tracking for motion content over time
- Add party voting analysis with cross-ideological voting patterns
- Generate markdown report with visualizations
- Add comprehensive test suite with 12 passing tests

See reports/drift/report.md for analysis results.
This commit is contained in:
2026-04-05 19:21:46 +02:00
parent afdfe298cd
commit dafdfd5370
5 changed files with 87 additions and 180 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

+80 -6
View File
@@ -7,27 +7,101 @@
## Summary
- **Stable axes:** None
- **Axes with inflection points:** 0
- **Stable axes:** [1, 2, 3, 4, 5, 7, 8, 9, 10]
- **Axes with inflection points:** 1
- **Parties with cross-ideological voting:** 0
## Axis Stability
**Stable axes (similarity > 0.7):** None
**Reordered axes:** [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
![Axis Stability Heatmap](axis_stability.png)
**Stable axes (similarity > 0.7):** [1, 2, 3, 4, 5, 7, 8, 9, 10]
**Reordered axes:** [6]
**Unstable axes:** []
## Semantic Drift
No drift data available (no stable axes or insufficient data).
![Semantic Drift Timeline](semantic_drift.png)
### Axis 8 Inflection Points
- **2016 → 2017**: drift=1.7467 (median=0.4850)
- **2017 → 2018**: drift=1.7470 (median=0.4850)
## Party Voting Analysis
**Parties tracked:** 47
![Party Trajectories](party_trajectories.png)
No cross-ideological voting detected.
## Overtone Shift
Overtone shift measures how the semantic content of motions on each axis changes over time, even when party ordering stays the same.
### Axis 1
- **Average shift:** 1.4680
- **Max shift:** 1.9709
- **Inflection points:** 0
### Axis 2
- **Average shift:** 1.4220
- **Max shift:** 1.7869
- **Inflection points:** 0
### Axis 3
- **Average shift:** 1.3830
- **Max shift:** 1.8293
- **Inflection points:** 0
### Axis 4
- **Average shift:** 1.3946
- **Max shift:** 1.8857
- **Inflection points:** 0
### Axis 5
- **Average shift:** 1.4333
- **Max shift:** 1.9253
- **Inflection points:** 0
### Axis 7
- **Average shift:** 1.3068
- **Max shift:** 1.8408
- **Inflection points:** 0
### Axis 8
- **Average shift:** 1.3022
- **Max shift:** 1.8897
- **Inflection points:** 0
### Axis 9
- **Average shift:** 1.3751
- **Max shift:** 1.9262
- **Inflection points:** 0
### Axis 10
- **Average shift:** 1.2993
- **Max shift:** 1.7220
- **Inflection points:** 0
## Methodology
- **Axis stability:** Jaccard similarity of top-N motion rankings per component across windows
- **Axis stability:** Ridge regression weights (SVD_score ~ fused_embedding) per axis per window, compared via max(cosine similarity, Jaccard top-100 dimensions)
- **Overtone shift:** Semantic gravity (weighted mean fused embedding) per axis per window, tracked via cosine distance between consecutive windows
- **Semantic drift:** Cosine distance between fused embedding centroids of top-N motions per axis
- **Inflection points:** Drift/shift rate exceeding 2× median rate
- **Cross-ideological voting:** Parties voting 'voor' on motions where canonical opposite-wing parties have high loadings
- **Semantic drift:** Cosine distance between fused embedding centroids of top-N motions per axis
- **Inflection points:** Drift rate exceeding 2× median drift rate
- **Cross-ideological voting:** Parties voting 'voor' on motions where canonical opposite-wing parties have high loadings
Binary file not shown.

After

Width:  |  Height:  |  Size: 396 KiB