PurePolyglot / src /dialect_rules.py
github-actions[bot]
Automated deployment to Hugging Face
a2b450c
Raw
History Blame Contribute Delete
4.06 kB
import re
PIDGIN_MARKER_PATTERN = re.compile(
r"\b(wetin|dey|una|abi|sabi|chop|waka|pikin|dem|wey|na)\b"
r"|make we|no dey|no be|e go|i no|you no",
re.IGNORECASE,
)
STANDARD_ENGLISH_PATTERN = re.compile(
r"\b(what|why|where|when|how|please|because|cannot|can't|don't|doesn't|should|would|could|will|are|is|am|have|has)\b",
re.IGNORECASE,
)
def _normalize_label(label):
return str(label or "").strip().lower()
def is_nigerian_pidgin_label(label):
value = _normalize_label(label)
return "naija" in value or ("nigerian" in value and "pidgin" in value)
def is_nigerian_english_label(label):
value = _normalize_label(label)
return "nigerian english" in value and not is_nigerian_pidgin_label(value)
def nigerian_variety_instruction(source_dialect="", target_dialect=""):
source_is_relevant = is_nigerian_pidgin_label(source_dialect) or is_nigerian_english_label(source_dialect)
target_is_relevant = is_nigerian_pidgin_label(target_dialect) or is_nigerian_english_label(target_dialect)
if not source_is_relevant and not target_is_relevant:
return ""
return (
"NIGERIAN VARIETY BOUNDARY:\n"
"- Nigerian English and Nigerian Pidgin English / Naija Pidgin are separate varieties, not interchangeable labels.\n"
"- Nigerian English is a recognized World English variety. Use Nigerian English lexical, pragmatic, and cultural flavor while keeping English grammar; do not use core Naija Pidgin grammar markers such as 'wetin', 'dey', 'una', 'abi', 'na', 'abeg', or 'make we' unless the source is quoting them.\n"
"- Nigerian Pidgin English / Naija Pidgin is an English-lexifier pidgin/creole continuum. Use Naija Pidgin grammar and discourse markers naturally; do not normalize it into Nigerian English or Standard English.\n"
"- If the target is Nigerian English, avoid Naija Pidgin grammar. If the target is Nigerian Pidgin English, do not output polished Nigerian English."
)
def nigerian_variety_retry_reason(translated, target_dialect):
text = str(translated or "").strip()
if not text:
return ""
if is_nigerian_english_label(target_dialect) and PIDGIN_MARKER_PATTERN.search(text):
return "Target is Nigerian English, but the output contains Naija Pidgin markers."
word_count = len(re.findall(r"[A-Za-z']+", text))
if (
is_nigerian_pidgin_label(target_dialect)
and word_count >= 4
and not PIDGIN_MARKER_PATTERN.search(text)
and STANDARD_ENGLISH_PATTERN.search(text)
):
return "Target is Nigerian Pidgin English, but the output looks like Nigerian/Standard English without Naija Pidgin grammar."
return ""
def nigerian_variety_retry_prompt(text, source_dialect, target_dialect, translated, reason):
return f"""
The previous output crossed a Nigerian variety boundary.
Reason: {reason}
Source variety: {source_dialect}
Target variety: {target_dialect}
Source utterance: "{text}"
Previous output: "{translated}"
Rewrite the output ONLY in the requested target variety.
{nigerian_variety_instruction(source_dialect, target_dialect)}
"""
def hausa_variety_instruction(source_dialect="", target_dialect=""):
labels = f"{source_dialect} {target_dialect}".lower()
if not any(token in labels for token in ("hausa", "kano", "katsina", "sokoto", "zaria")):
return ""
return (
"HAUSA LEXICAL AND HONORIFIC GUARDRAIL:\n"
"- Preserve Hausa honorific gender and social role carefully.\n"
"- 'malama' or 'mallama' means ma'am, madam, or female teacher; never translate it as sir, friend, bro, or guy.\n"
"- 'malam' means sir, male teacher, or learned man; do not confuse it with 'malama'.\n"
"- 'ina kwana?' is a morning greeting close to 'good morning' or 'how did you wake/sleep?'; keep the greeting natural for the target dialect.\n"
"- When translating into English or Nigerian English, prefer respectful forms such as 'Good morning, ma'am' when the source says 'ina kwana, malama?'."
)