Canonicalization and Darija Representation - Bidirectional transliteration for Darija
Project description
CaDaR: Canonicalization and Darija Representation
High-performance bidirectional transliteration for Darija (Moroccan Arabic)
CaDaR is a robust, FST-style (Finite State Transducer) transliteration library that provides seamless conversion between Arabic script and Latin (Romanized/Bizi) script for Darija, with text standardization capabilities.
Features
- 🔄 Bidirectional transliteration: Arabic ↔ Latin
- 🎯 Darija-aware processing: Moroccan Arabic linguistic patterns
- 🚀 High performance: Rust core with Python bindings
- ✨ Text standardization: Normalize both Arabic and Latin text
- 🧪 Well tested: 41 passing unit tests
Installation
pip install cadar
Quick Start
Arabic to Latin (Bizi)
import cadar
result = cadar.ara2bizi("كيفاش داير؟", darija="Ma")
print(result) # Output: "kifash dayer?"
Latin to Arabic
import cadar
result = cadar.bizi2ara("salam 3likom", darija="Ma")
print(result) # Output: "سلام عليكم"
Text Standardization
import cadar
# Standardize Arabic (remove diacritics, normalize)
result = cadar.ara2ara("أنَا مِنْ المَغْرِب", darija="Ma")
print(result) # Output: "انا من المغرب"
# Standardize Latin (fix repeated chars)
result = cadar.bizi2bizi("salaaaam", darija="Ma")
print(result) # Output: "salam"
Using the CaDaR Class
import cadar
# Create a reusable processor
processor = cadar.CaDaR(darija="Ma")
# Convert between scripts
arabic = processor.bizi2ara("wakha ghir shwiya")
latin = processor.ara2bizi("واخا غير شوية")
print(f"Dialect: {processor.get_dialect()}")
API Reference
Main Functions
ara2bizi(text, darija="Ma")- Convert Arabic to Latin scriptbizi2ara(text, darija="Ma")- Convert Latin to Arabic scriptara2ara(text, darija="Ma")- Standardize Arabic textbizi2bizi(text, darija="Ma")- Standardize Latin text
CaDaR Class
processor = cadar.CaDaR(darija="Ma")
processor.ara2bizi(text) # Arabic to Latin
processor.bizi2ara(text) # Latin to Arabic
processor.ara2ara(text) # Standardize Arabic
processor.bizi2bizi(text) # Standardize Latin
processor.get_dialect() # Get current dialect
Convenience Functions
# Auto-detect and transliterate
cadar.transliterate(text, target="latin", darija="Ma")
# Auto-detect and standardize
cadar.standardize(text, script="auto", darija="Ma")
Use Cases
- Chat Applications: Support users writing in both scripts
- Search Engines: Match queries regardless of script
- Data Processing: Standardize mixed-script datasets
- NLP Pipelines: Normalize Darija text for machine learning
- Language Learning: See connections between scripts
How It Works
CaDaR uses a 6-stage FST-style pipeline:
- Script Detection: Identify Arabic, Latin, or mixed scripts
- Normalization: Clean and standardize input
- Tokenization: Darija-aware word segmentation
- ICR Generation: Convert to Intermediate Canonical Representation
- Script Generation: Produce target script output
- Validation: Apply final fixes and quality checks
The Intermediate Canonical Representation (ICR) is the core innovation - a script-independent phonological representation that enables accurate bidirectional conversion.
Supported Dialects
- Ma (Moroccan Darija) - Default
Support for Algerian, Tunisian, Libyan, and Egyptian dialects planned for future releases.
Examples
Chat Normalization
import cadar
def normalize_message(text):
"""Normalize user input regardless of script"""
has_arabic = any('\u0600' <= c <= '\u06FF' for c in text)
if has_arabic:
return cadar.ara2ara(text, darija="Ma")
else:
return cadar.bizi2bizi(text, darija="Ma")
# Usage
user_input = "salaaaam 3likooom"
normalized = normalize_message(user_input)
print(normalized) # "salam 3likom"
Search Variants
import cadar
def generate_search_variants(query):
"""Generate search terms in both scripts"""
processor = cadar.CaDaR(darija="Ma")
has_arabic = any('\u0600' <= c <= '\u06FF' for c in query)
if has_arabic:
return [
query,
processor.ara2bizi(query),
processor.ara2ara(query)
]
else:
return [
query,
processor.bizi2ara(query),
processor.bizi2bizi(query)
]
# Usage
variants = generate_search_variants("سلام")
print(variants) # ['سلام', 'slam', 'سلام']
Batch Processing
import cadar
processor = cadar.CaDaR(darija="Ma")
texts = ["سلام", "بسلامة", "شكرا", "بزاف"]
results = [processor.ara2bizi(text) for text in texts]
print(results) # ['slam', 'bslama', 'shokran', 'bzaf']
Performance
- Fast: ~1-2ms per sentence
- Efficient: Rust core with minimal overhead
- Scalable: Linear scaling for batch processing
Documentation
- Full Documentation: https://oit-technologies.github.io/CaDaR/
- GitHub Repository: https://github.com/Oit-Technologies/CaDaR
- API Reference: https://oit-technologies.github.io/CaDaR/api/python/
License
MIT License - see LICENSE file for details.
Citation
If you use CaDaR in your research, please cite:
@software{cadar2026,
title={CaDaR: Canonicalization and Darija Representation},
author={Oit Technologies},
year={2026},
url={https://github.com/Oit-Technologies/CaDaR}
}
Support
- Issues: GitHub Issues
- Documentation: https://oit-technologies.github.io/CaDaR/
Made with ❤️ for the Darija community by Oit Technologies
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cadar-0.1.3.tar.gz.
File metadata
- Download URL: cadar-0.1.3.tar.gz
- Upload date:
- Size: 58.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fffc091be0e1c2ca70f85e16c5d1eec22c7a81f6db00beceb34eab0c6301bdf2
|
|
| MD5 |
5eaa8cc6856b1fda8bca2033185e1b13
|
|
| BLAKE2b-256 |
1b50993c5c02e8e519911d881699f8e12abf83bd83ae4a4200e77e6bb305eae9
|
File details
Details for the file cadar-0.1.3-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: cadar-0.1.3-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 836.3 kB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
23c96569d7b32258fc9eec90cf3ef986535ef05b17712e57567b913beb14f286
|
|
| MD5 |
cdc114ea050650aa57ab954e758e29f1
|
|
| BLAKE2b-256 |
bc9f84c7440e1a978a942a70dc2e8095b46e21f3b0ad5f87dbc33df288572e83
|
File details
Details for the file cadar-0.1.3-cp312-cp312-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: cadar-0.1.3-cp312-cp312-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 946.7 kB
- Tags: CPython 3.12, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9f5f46dccda27378cd2de5e300eb6473401a6c9aa02428c0ecd6a0a40fd5fdee
|
|
| MD5 |
63b3c935609c491a0bf5b15efa5debf8
|
|
| BLAKE2b-256 |
70dc8ac7a8ced2dee1f59a8916c95254396a227ea224e2b82d0bf7cef28cfee5
|
File details
Details for the file cadar-0.1.3-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: cadar-0.1.3-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 829.3 kB
- Tags: CPython 3.12, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
22fde5a7a3a1d09ab284383b67262b13ccf0392f3136e1b216a7402cdc6c487a
|
|
| MD5 |
8e8fefe73844aece1dbb40983260dfe6
|
|
| BLAKE2b-256 |
88de12bd8166d8a9d2479a34b37d665a8e1f0a14364e41673b460ad7e6a4f92b
|
File details
Details for the file cadar-0.1.3-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: cadar-0.1.3-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 836.0 kB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
65b1d61098254bad4112d427fd1cb454249a722391748ead86b2899411ebd8df
|
|
| MD5 |
c99077ccf4e6616553bcb1dff1912076
|
|
| BLAKE2b-256 |
86ea9cb204c271c2510a002bf54a44293a79b0fe793babfb545d127ebe5e83fc
|
File details
Details for the file cadar-0.1.3-cp311-cp311-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: cadar-0.1.3-cp311-cp311-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 946.5 kB
- Tags: CPython 3.11, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e29f0698c305104d52d520683bb1b1029bddbe73bb3eb206718fa9803de5d64c
|
|
| MD5 |
932e576e832a36495db516e81ca32554
|
|
| BLAKE2b-256 |
7ef6ea0fd3a10efac95aab413749912ce95551c73510ecd2a158ce65cc59d8c4
|
File details
Details for the file cadar-0.1.3-cp311-cp311-macosx_11_0_arm64.whl.
File metadata
- Download URL: cadar-0.1.3-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 831.3 kB
- Tags: CPython 3.11, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
107e31423127cf8f97ac219cdf3e3bf00777d629a9b2eb50e173c40108ad944b
|
|
| MD5 |
5e061ebb1cff39748c274aebaf14bb62
|
|
| BLAKE2b-256 |
ac8b02ebd66f8972cc699e8799b35ea49b3e4f7d9e226ff82227b0fea16db538
|
File details
Details for the file cadar-0.1.3-cp310-cp310-win_amd64.whl.
File metadata
- Download URL: cadar-0.1.3-cp310-cp310-win_amd64.whl
- Upload date:
- Size: 836.0 kB
- Tags: CPython 3.10, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
663a84e98b1d98c71ebbb36fda3f8ad4df90e15bd95c48604776d3429a011c26
|
|
| MD5 |
5282abc10ffce620dfb79de2ee9666ca
|
|
| BLAKE2b-256 |
187d7c136b1dc3bc6451835816116ecc7e0516fc038fb6260d1fb69dd9aa1b88
|
File details
Details for the file cadar-0.1.3-cp310-cp310-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: cadar-0.1.3-cp310-cp310-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 946.3 kB
- Tags: CPython 3.10, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4831eb53fad373f578c58820e64dd9bec01acbc0ba7590fe9668bf4e145b4acc
|
|
| MD5 |
6ad9b9888d188acedd406223fe936738
|
|
| BLAKE2b-256 |
691f9d5295aa4f4dafe9d9f5447f255c56932731984918cf950c6aa68b9e3557
|
File details
Details for the file cadar-0.1.3-cp310-cp310-macosx_11_0_arm64.whl.
File metadata
- Download URL: cadar-0.1.3-cp310-cp310-macosx_11_0_arm64.whl
- Upload date:
- Size: 831.9 kB
- Tags: CPython 3.10, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7e6055bcb322ce63f1bba83c24bdd496d317adb6eafe811b7d5e2703a910d2fd
|
|
| MD5 |
932a8afa736c175430313d0dfa691113
|
|
| BLAKE2b-256 |
15cba871d331758e88d45c8d49988029869aa7656d168ac2a7f020a22c02ed32
|
File details
Details for the file cadar-0.1.3-cp39-cp39-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: cadar-0.1.3-cp39-cp39-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 946.9 kB
- Tags: CPython 3.9, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3bba8d5be23a353a63074e56c1194b923c3010b2b0e12ed4650c073bbca3d3cb
|
|
| MD5 |
3eb0d22c2a8a4279ef92aedd0278e1fe
|
|
| BLAKE2b-256 |
ff5efe932c69b80e00e0416b4ccb50c6df80cd0017118c473d080f2da2bab8f3
|
File details
Details for the file cadar-0.1.3-cp38-cp38-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: cadar-0.1.3-cp38-cp38-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 946.5 kB
- Tags: CPython 3.8, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dab47476dd15209402b7d8dda52e5446a6165a65db8763357dccc401cf395e73
|
|
| MD5 |
6357ccfc1662eb153521d4a895d3fedc
|
|
| BLAKE2b-256 |
5a277ad323f2e0feadf5cea157c682fcb9608d49c7d9d86d2732da564cd2b8ea
|