Skip to main content

Canonicalization and Darija Representation - Bidirectional transliteration for Darija

Project description

CaDaR: Canonicalization and Darija Representation

PyPI version Python 3.8+ License: MIT

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 script
  • bizi2ara(text, darija="Ma") - Convert Latin to Arabic script
  • ara2ara(text, darija="Ma") - Standardize Arabic text
  • bizi2bizi(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:

  1. Script Detection: Identify Arabic, Latin, or mixed scripts
  2. Normalization: Clean and standardize input
  3. Tokenization: Darija-aware word segmentation
  4. ICR Generation: Convert to Intermediate Canonical Representation
  5. Script Generation: Produce target script output
  6. 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

License

MIT License - see LICENSE file for details.

Citation

If you use CaDaR in your research, please cite:

@software{cadar2024,
  title={CaDaR: Canonicalization and Darija Representation},
  author={Oit Technologies},
  year={2024},
  url={https://github.com/Oit-Technologies/CaDaR}
}

Support


Made with ❤️ for the Darija community by Oit Technologies

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

cadar-0.1.2-cp312-cp312-win_amd64.whl (837.0 kB view details)

Uploaded CPython 3.12Windows x86-64

cadar-0.1.2-cp312-cp312-macosx_11_0_arm64.whl (829.3 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

cadar-0.1.2-cp311-cp311-win_amd64.whl (836.9 kB view details)

Uploaded CPython 3.11Windows x86-64

cadar-0.1.2-cp311-cp311-macosx_11_0_arm64.whl (831.3 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

cadar-0.1.2-cp310-cp310-win_amd64.whl (836.7 kB view details)

Uploaded CPython 3.10Windows x86-64

cadar-0.1.2-cp310-cp310-macosx_11_0_arm64.whl (831.8 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

cadar-0.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (968.3 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

File details

Details for the file cadar-0.1.2-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: cadar-0.1.2-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 837.0 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

Hashes for cadar-0.1.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 83bcfa9e9d083a416f50cf28676451b345c897acf6667da115aee784a3a8e92a
MD5 d87ece5be33c8b3c287f9762b3b53152
BLAKE2b-256 8044d439efb2f14dbb2a1b15d122ea694176665a1b3f002d8bff93886ed544fe

See more details on using hashes here.

File details

Details for the file cadar-0.1.2-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cadar-0.1.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bca49e96b4e4ae0b8934f6bcdfbfd3c293395afcf914509d14dc565410c02955
MD5 5ed9a233ea551f4aff46a0029d33ce93
BLAKE2b-256 b566fb18c553bd673a8a0e83380e0ff4457da84308f16f7db9d7f889f90aed5a

See more details on using hashes here.

File details

Details for the file cadar-0.1.2-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: cadar-0.1.2-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 836.9 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

Hashes for cadar-0.1.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 00cbde1e3128db2e951d8aedb9378d3ea335b86f85b2fd517f595b23cc181ee1
MD5 8d3b55f8de5db717ce2505901ee3bbed
BLAKE2b-256 7496bea33d0d4bd11499caa7d5553da96b1cd8a04e56ae7273938af2bffa1ea3

See more details on using hashes here.

File details

Details for the file cadar-0.1.2-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cadar-0.1.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1a8d9f968b672738af94809eb991fee8668b4c935baa15fe1188774f673c3c58
MD5 c3ccb95255460978655646bbfef64a26
BLAKE2b-256 cdec15c024fc064d090c0ac1ce706240dce99a47489df02e6e43a14af63ba31a

See more details on using hashes here.

File details

Details for the file cadar-0.1.2-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: cadar-0.1.2-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 836.7 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

Hashes for cadar-0.1.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 27951f803d7d1177368fe116ac31f78da33224921c6ad479e10dbdf0a238c364
MD5 09b992d715d46f7082e61cf42f0dfeb0
BLAKE2b-256 121acce128e01e8f1f18e565f69935abf256c9f0a7ab6f8b9300878356284d7b

See more details on using hashes here.

File details

Details for the file cadar-0.1.2-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cadar-0.1.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b75a2846f8db57eb49b2180e7158ef8bd88208240abcdee8a7cf4e0b61a9395b
MD5 3e014056506a72a11225aea6898f4878
BLAKE2b-256 ff5b30c884c789923ca7b028aa9f00657a793b966cfa2a6db323fb357ca92a10

See more details on using hashes here.

File details

Details for the file cadar-0.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cadar-0.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 698cdafe33588971992cb325862acd813faf1e73e0da462722350d6a248aade2
MD5 47bbf7c4903c4f3924a5067e657f8ac0
BLAKE2b-256 ecf526c4fd314dc78c9acf7c28f9da693160ed7b9254ee50fcbae0f164e58ae4

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page