A semantic search and topic exploration dashboard for Bulgarian parliamentary speeches, built with Dash and designed for stateless deployment on Fly.io.
- 🔍 Semantic Search: Search 370k+ parliamentary speeches using AI-powered multilingual embeddings
- 📊 Interactive Topic Explorer: Explore topics with UMAP visualization, temporal distribution, and representative speeches
- ⚡ Fast: Pre-computed embeddings in LanceDB for instant search
- 🐳 Git LFS: Large data files tracked with Git LFS for simple deployment
- Python 3.9+
- CUDA-capable GPU (for preprocessing)
- Kaggle API credentials
- Git LFS installed (
git lfs install)
git clone <repo-url>
cd bg-parliament-dashboard
# Ensure LFS files are pulled
git lfs pullRun this locally with your GPU to generate the data files:
# Install GPU dependencies
pip install -r requirements-gpu.txt
# Configure Kaggle credentials
mkdir -p ~/.kaggle
echo '{"username": "YOUR_USERNAME", "key": "YOUR_KEY"}' > ~/.kaggle/kaggle.json
chmod 600 ~/.kaggle/kaggle.json
# Run preprocessing
python preprocess.pyThis creates:
parliament_data/- LanceDB vector database (~500MB)model_cache/- Sentence-transformers model (~1.3GB)assets/topic_data.json- Topic data with 2D embeddings
# Track large files with LFS
git lfs track "parliament_data/**"
git lfs track "model_cache/**/*.bin"
git lfs track "model_cache/**/*.safetensors"
git lfs track "assets/topic_data.json"
# Commit everything
git add .
git commit -m "Add preprocessed data via LFS"
git pushpip install -r requirements.txt
python app.pycurl -L https://fly.io/install.sh | sh
fly auth loginfly launch
# Follow prompts, select region close to Bulgaria (e.g., fra)
fly deployNote: Fly.io automatically pulls Git LFS files during build.
| Component | Technology |
|---|---|
| Frontend | Dash, Plotly, Bootstrap |
| Vector DB | LanceDB (embedded) |
| Embeddings | intfloat/multilingual-e5-large |
| Topic Modeling | BERTopic |
| Server | Gunicorn |
- Dataset: Bulgarian Parliament Transcripts
- UMAP/Clustering: UMAP & HDBSCAN Notebook
MIT