Skip to main content

Moroccan Darija (Arabic) phrase analyzer — classify each word by source language (French/English/Darija), detect semantic entities (money, time, date, phone...) and strip morphological prefixes. Built in Rust for O(1) lookup.

Project description

darija-router

Moroccan Darija language router — O(1) phrase analysis with morphological stripping, semantic tagging, NER, and code-switching detection. Built in Rust, wrapped for Python.

Classifies Arabic-script Darija words by source language (fr, en, darija), Latin spelling, category, probability, semantic role, and confidence score.

Install

pip install darija-router

Quick Start

import darija_router

result = darija_router.analyze(
    "خويا باغي نلقاك غدوة الساعة 3 صباح فالساحة، "
    "واش باغي نشريو شي تيليفون جديد ب 500 درهم؟"
)

API Reference

darija_router.analyze(phrase, mode=None, fields=None)

Tokenizes a phrase and classifies each token.

Parameters:

  • phrase (str): Input text in Arabic script
  • mode (str, optional): Output preset — "full" (default), "compact", "ner", "codeswitch"
  • fields (list[str], optional): Custom field selection — e.g. ["token", "lang", "confidence"]

Returns: list[dict] with per-token results.

darija_router.run_ner(phrase)

Named Entity Recognition. Returns span-based entities and per-token NER tags.

Returns:

{
  "entities": [
    {"text": "500 درهم", "entity_type": "MONEY", "start": 0, "end": 8, "token_indices": [0, 1]}
  ],
  "tokens": [
    {"token": "500", "ner_tag": "MONEY"},
    {"token": "درهم", "ner_tag": "MONEY"}
  ]
}

Entity types: MONEY, MEASURE, TIME, DATE, PHONE, EMAIL, URL, CARDINAL, DECIMAL, ORDINAL, FRACTION, PERCENT, PERSON, LOC

darija_router.run_codeswitch(phrase)

Code-switching detection with language spans and statistics.

Returns:

{
  "spans": [
    {"text": "خويا واش", "lang": "darija", "start": 0, "end": 9}
  ],
  "tokens": [
    {"token": "خويا", "lang": "darija", "latin": null, "confidence": 1.0}
  ],
  "stats": {
    "darija": 50.0, "fr": 25.0, "en": 0.0, "num": 12.5, "punct": 0.0, "other": 0.0, "unknown": 12.5
  }
}

darija_router.lookup(word)

Single word lookup. Same format as one element from analyze().

darija_router.__version__

Package version string.

Semantic Tags

Tag Detection Example
PUNCT Punctuation characters ؟ ، . !
CARDINAL Digits or Arabic number words 50 عشرين مية
DECIMAL Decimal numbers 3.5 ١٢.٥
MONEY Cardinal + currency word 50 درهم → both tokens tagged
MEASURE Cardinal + unit word 2 كيلو → both tokens tagged
TIME الساعة + cardinal, or time words الساعة 3 صباح مساء
DATE Date words or cardinal + month غدوة 15 مارس
ORDINAL Arabic ordinal words تاني تالت أول
FRACTION Arabic fraction words نص ربع تلت
PERCENT % suffix or بالمئة 20%
PHONE Phone number patterns +212661234567
EMAIL Contains @ and . user@gmail.com
URL Starts with http or www. http://google.com
ADDRESS Address keyword + following word زنقة الحسن

Output Modes

Mode Description
"full" (default) All fields: token, index, lang, entries, stem, semantic, confidence
"compact" token + lang only (no entries/stem)
"ner" NER preset: entities + tokens with ner_tag
"codeswitch" Code-switching preset: spans + tokens + stats

Confidence Scoring

Match Type Score
Exact match 1.0
Normalized (ة→ه) 0.95
Single prefix/suffix strip 0.85
Double strip (prefix + suffix) 0.70
Semantic tag only (no lexicon match) 0.60
Unknown 0.0

How It Works

  1. Embedded lexicon — 1,926 Arabic-script keys (2,226 entries) compiled into the binary via include_str!(). Zero file I/O, zero startup cost.

  2. O(1) HashMap lookup — exact match against a HashMap<String, Vec<Entry>>.

  3. Morphological fallback — when an exact match fails, the engine strips prefixes and suffixes:

    Prefixes: ال و ف ب ل م ك

    Suffixes: هم ها ش ك ي

    Normalization: ةه

    Tries: exact → normalize → single strip → double strip. Minimum stem length of 2 prevents over-stripping.

  4. Semantic tagger — rule-based second pass detects 14 semantic categories via regex patterns and context-aware grouping (e.g. cardinal + currency word → MONEY).

  5. NER engine — extracts span-based entities with context rules for PERSON (سيدي/لالة + next word) and LOC (شارع/زنقة/حي + next words).

  6. Code-switching detector — assigns per-token language labels, groups consecutive same-language tokens into spans, and computes aggregate statistics.

  7. 23 thematic categories — technology, food, transportation, health, administration, clothing, home, education, sports, work, money, adjectives, family, colors, time, nature, slang, functional grammar, common verbs, common descriptions, time expressions, numbers.

Build from Source

git clone https://github.com/LaamiriOuail/darija-router.git
cd darija-router
pip install maturin
maturin develop --release

License

MIT

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.

darija_router-0.13.0-cp312-cp312-win_amd64.whl (258.5 kB view details)

Uploaded CPython 3.12Windows x86-64

darija_router-0.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (338.4 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

darija_router-0.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (323.9 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

darija_router-0.13.0-cp312-cp312-macosx_11_0_arm64.whl (314.5 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

darija_router-0.13.0-cp312-cp312-macosx_10_12_x86_64.whl (329.5 kB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

File details

Details for the file darija_router-0.13.0-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for darija_router-0.13.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 82af01497b332823f7961166e4b7bee031b74bf4458031dacc86a94bb2e0ac99
MD5 32cde35f7cbc33a5764e8240f65a94ca
BLAKE2b-256 165ea48532f76371384b2355133a4d7b42df8b50a9441548f0c8924dc7af215d

See more details on using hashes here.

File details

Details for the file darija_router-0.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for darija_router-0.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2d5fdbed6f98660476482971802093d6d7034034b5ae1b33abb42a4bafde311b
MD5 7abf80a510bc59be01757420a39b4127
BLAKE2b-256 59eed32734945775bfd5f859f28b213a48b004e188b681795079f5029318e156

See more details on using hashes here.

File details

Details for the file darija_router-0.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for darija_router-0.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d845ea78818c0bd31b1c99c2fa3c7a6c7a8162e8a78ab6296bdd6d42afed3dcb
MD5 0aca835bc74daa80a2f70a478a5c42d8
BLAKE2b-256 9151baa1e94fa1a24baf362983b3d485aacd0d7cebf6d9569eff627f3c30800e

See more details on using hashes here.

File details

Details for the file darija_router-0.13.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for darija_router-0.13.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 548670dacbdafa1bf35461a0bb3f12eeff6affd3e92a75749ba04ad9f6555cca
MD5 1e58cd9a819f81eb82c1b487f114c6b3
BLAKE2b-256 9770c7101df8e3ca315928f3c84d2b0180c069ed06a956c78c61eb00a6e19788

See more details on using hashes here.

File details

Details for the file darija_router-0.13.0-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for darija_router-0.13.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 c1d89ebefdb1da62404c63c9b1c9ff830b8786ad91292bedbf2dc16fdb380665
MD5 a25ee0c706d123798b87ea3d62923205
BLAKE2b-256 dda70d1b88eb51eff53dde706aa9a18dee11594870a13fb93ca17da0cde17812

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