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.12.0-cp312-cp312-win_amd64.whl (256.9 kB view details)

Uploaded CPython 3.12Windows x86-64

darija_router-0.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (336.5 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

darija_router-0.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (322.3 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

darija_router-0.12.0-cp312-cp312-macosx_11_0_arm64.whl (312.6 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

darija_router-0.12.0-cp312-cp312-macosx_10_12_x86_64.whl (327.9 kB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

File details

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

File metadata

File hashes

Hashes for darija_router-0.12.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 f66ece02774e0166e040132e91ec06e08edaaf1bcfbc754831da8c99bda67e5a
MD5 2070c61d231cb89d9a622f3d73c6830d
BLAKE2b-256 31a57eb34037790a08d8ef531299116d30095b10aff196e2bdb6ead8f2a3a23c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for darija_router-0.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8fc026f58f4fb44353de02dc8a2969dd1d72e52f06ae608aa0e025cbd66c3af2
MD5 d831c621e43ff2f853e666ff0918c156
BLAKE2b-256 bfb18227ba42b8f6fd98f9276761acc11da3c067ba3ef34667e9e78531b1bab6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for darija_router-0.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 8740816ce2e394c2d7370ebdfe00c8048b0d0f110dd02c61777da072b340be1f
MD5 7dd89225cf256868a392d8e4f23715af
BLAKE2b-256 a3837ef718f2796a95a189e9657d8ab4ef3c95836c9ddaf29d9df11a4281f8ad

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for darija_router-0.12.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d76a30cede1129929ab6545bd7ded6376d80ead2cdca0a81cccfa5795048ea1b
MD5 b5f893d0a91dc7f66074c7acda857aa1
BLAKE2b-256 546f5f602f646e278784378102977f46f2a59b529f037473a87b6f82547c9a24

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for darija_router-0.12.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 989a5f06a034794430c46d6f897f9da7d9c7c235db40c851f6c96273903f8f8c
MD5 38d7a89130cf963135fc0b2530554ca8
BLAKE2b-256 12ca1b6461d658613d026de3823394994aa85fe36fdf1973162c42d136b0662d

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