| --- |
| title: Bayan API |
| emoji: ✍️ |
| colorFrom: green |
| colorTo: blue |
| sdk: docker |
| app_port: 7860 |
| --- |
| |
| # BAYAN (بَيان) — AI-Powered Arabic Writing Assistant ✍️ |
|
|
| **BAYAN** is a full-stack Arabic writing assistant — a Grammarly-style platform for Modern |
| Standard Arabic that combines fine-tuned Transformer models with handcrafted linguistic |
| rules. It corrects **spelling, grammar, and punctuation** in real time, and adds |
| **summarization, autocomplete, dialect→MSA translation, and Quran verification** — delivered |
| through a modern web app and a Chrome extension. |
|
|
| > Graduation Project — Cairo University, Faculty of Computers & Artificial Intelligence. |
|
|
| --- |
|
|
| ## 🌟 Overview |
|
|
| Production Arabic NLP is roughly 20% model training and 80% engineering safety scaffolding. |
| BAYAN reflects that: multiple fine-tuned models wrapped in a **deterministic, collision-free |
| correction engine** that guarantees stable, non-overlapping edits, plus religious-text |
| protection so sacred text is never altered. |
|
|
| The core `/api/analyze` endpoint runs a sequential pipeline: |
|
|
| ``` |
| Input → Spelling → Grammar → Punctuation → Diff |
| ``` |
|
|
| --- |
|
|
| ## 🧠 Core Features |
|
|
| | Feature | Model / Method | |
| |--------|-----------------| |
| | **Spelling** | Seq2Seq (BERT-based) beam candidates + Norvig-style edit distance, reranked by MLM fluency, Damerau-Levenshtein similarity, and in-/out-of-vocabulary acceptance; CAMeL Tools morphological reranking | |
| | **Grammar** | Gemma causal LM via chat-template prompting, with rule-based guards that reject generic/instructional output | |
| | **Punctuation** | Seq2Seq model inserting Arabic marks (`،` `؛` `؟` `.` `« »`) into continuous text | |
| | **Summarization** | mBART conditional generation with short/medium/long thresholds and a **safe extractive fallback** when abstractive output drifts too far from the source | |
| | **Autocomplete** | Local GPT-2 next-word prediction, surfaced as ghost text (accept with `Tab`) | |
| | **Dialect → MSA** | Dialect-to-Modern-Standard-Arabic translation (`src/nlp/dialect`) | |
| | **Quran Verification** | Dual-stage normalization + cascading anchor search + RapidFuzz fuzzy matching against an Uthmani-script database (`quran.py`) | |
|
|
| ### Evaluation highlights |
| - **Grammar:** GLEU 75% · ChrF++ 88% — exceeding published SOTA (62–68% / 72–78%); ~60% hallucination reduction via LoRA |
| - **Spelling:** 95.63% word accuracy · 1.40% CER — outperforming Google Docs (~90%) |
|
|
| --- |
|
|
| ## 🏗️ Architecture |
|
|
| **Client–Server**, model-agnostic and modular: |
|
|
| ``` |
| Web UI / Chrome Extension ⇄ Flask API (src/app.py) ⇄ model_loader.py ⇄ NLP models |
| ``` |
|
|
| - **Multi-stage correction engine** (`src/nlp/`) with `pipeline_context.py` and |
| `stage_locker.py` ensuring collision-free, deterministic corrections across stages. |
| - **Backend:** Flask API — loads summarization on startup, lazily loads the rest; validates |
| input length (10–5,000 chars). Endpoints: `/api/health`, `/api/analyze`, `/api/spelling`, |
| `/api/summarize`, `/api/autocomplete`. |
| - **Frontend (`src/index.html`):** TailwindCSS + Vanilla JS, glassmorphism UI, a live |
| `contenteditable` canvas with wavy underlines (red = spelling, yellow = grammar/punctuation), |
| click-to-apply suggestion tooltips, a 0–100 document-score gauge, and a summarization panel. |
| - **Chrome Extension (Manifest V3, `extension/`):** popup, side panel, and inline |
| content overlay — works on any webpage, with localization (`_locales`). |
|
|
| --- |
|
|
| ## 📁 Repository Layout |
|
|
| ``` |
| src/ |
| app.py Flask API + endpoints |
| model_loader.py Loaders for all models |
| nlp/ Correction engine: spelling, grammar, punctuation, |
| autocomplete, dialect + pipeline_context / stage_locker |
| index.html, css/, js/, services/, middleware/, routes/ |
| extension/ Chrome extension (MV3): popup, side panel, inline overlay |
| quran.py Quran verification + quran_master.db |
| models/ Model checkpoints (not committed — see .gitignore) |
| Dockerfile Container build (HF Spaces / any host, port 7860) |
| Procfile gunicorn entrypoint |
| requirements.txt Python dependencies |
| ``` |
|
|
| --- |
|
|
| ## 🚀 How to Run |
|
|
| ### Option A — Docker (matches deployment) |
| ```bash |
| docker build -t bayan . |
| docker run -p 7860:7860 bayan |
| ``` |
|
|
| ### Option B — Local Python |
| ```bash |
| pip install -r requirements.txt |
| |
| # place model checkpoints under models/ (Spelling, Grammrar, Punctuation, |
| # Summarization, Autocomplete) |
| |
| cd src && gunicorn app:app --bind 0.0.0.0:7860 --timeout 120 --workers 1 |
| ``` |
|
|
| Then open **http://localhost:7860**. |
|
|
| ### Chrome Extension |
| `chrome://extensions` → enable **Developer mode** → **Load unpacked** → select `extension/`. |
|
|
| --- |
|
|
| ## 🔌 API Quick Reference |
|
|
| | Endpoint | Method | Purpose | |
| |----------|--------|---------| |
| | `/api/health` | GET | Model load status | |
| | `/api/analyze` | POST | Full pipeline (spelling → grammar → punctuation) + suggestions diff | |
| | `/api/spelling` | POST | Spelling correction only | |
| | `/api/summarize` | POST | Summarize (`length`: 1 short / 2 medium / 3 long) | |
| | `/api/autocomplete` | POST | Next-word suggestions | |
|
|
| Example — `POST /api/analyze`: |
| ```json |
| { "text": "الطلاب ذهبو الى المدرسة" } |
| ``` |
| ```json |
| { |
| "original": "الطلاب ذهبو الى المدرسة", |
| "corrected": "ذهب الطلاب إلى المدرسة.", |
| "suggestions": [ |
| { "original": "ذهبو", "correction": "ذهبوا", "type": "spelling" }, |
| { "original": "المدرسة", "correction": "المدرسة.", "type": "punctuation" } |
| ], |
| "status": "success" |
| } |
| ``` |
|
|
| --- |
|
|
| ## ⚙️ Tech Stack |
|
|
| Python · PyTorch · Hugging Face Transformers · Gemma · mBART · GPT-2 · BERT · LoRA · |
| CAMeL Tools · RapidFuzz · Flask · Gunicorn · TailwindCSS · Vanilla JS · Chrome Extension |
| (MV3) · Docker · Hugging Face Spaces. |
|
|
| --- |
|
|
| ## 📄 License |
|
|
| MIT — see [`LICENSE`](LICENSE). |
|
|
| *Model weights and datasets are kept out of Git; checkpoints are hosted on the Hugging Face Hub.* |
|
|