File size: 6,629 Bytes
e33977d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
"""Nigerian style layer β€” bonus marks via cultural contextualization.

The challenge brief awards extra credit for systems that *behave and sound
like Nigerians*. We treat this as a toggleable rendering layer, not as a
core dependency, for two reasons:

    1. Eval datasets are English Amazon reviews. Rendering everything in
       Nigerian register would hurt our ROUGE / BERTScore against the
       ground truth.
    2. Keeping it as a flag means we can showcase the capability without
       sacrificing benchmark scores. Best of both rubric worlds.

Two functions:

    naija_style_review(text)  β†’ rewrites a generated review in Nigerian
                                English register, preserving sentiment,
                                rating intent, and key entities.

    naija_persona_examples()  β†’ returns hand-crafted Nigerian personas the
                                judges can demo Task B against. These show
                                the system handling local taste profiles
                                (afrobeats, jollof, Nollywood, etc.) even
                                when the underlying catalog is Amazon-global.

Design note: the style layer renders output in rich, expressive Nigerian
Pidgin β€” confident and fluent across the whole text, the way a Nigerian
genuinely talks when giving a strong opinion. Sentiment, rating intent and
factual content are always preserved; only the register changes.
"""
from __future__ import annotations

from core.llm import LLMClient

NAIJA_STYLE_SYSTEM = """You are a stylist who rewrites text in rich, expressive Nigerian Pidgin English β€” the way a Nigerian would genuinely talk when sharing strong opinions. Rules:

- Keep the sentiment, rating intent, and all factual content unchanged. A positive review stays positive; a 2-star pan stays a pan; named items, authors, and plot facts stay accurate.
- Write FULLY in Nigerian Pidgin register β€” not standard English with a sprinkle. Lean into it confidently across the whole text.
- Use natural Pidgin grammar and vocabulary throughout. Examples of the texture wanted:
  Β· "This book sweet me die, I no fit drop am at all."
  Β· "Abeg, the storyline just dey drag, e tire me well well."
  Β· "Na correct work be this β€” the writer sabi wetin e dey do."
  Β· "I no go lie, the ending shock me, I no see am coming."
  Β· "The characters dey alive, you go feel like say you sabi them."
  Β· "E no make sense, I vex small as I read am finish."
  Β· "This one na better book, e make sense gan-gan."
- Common markers to use freely: "abeg", "sha", "na", "dey", "wetin", "e be like say", "no be small thing", "gan-gan", "well well", "I no go lie", "comot", "sabi", "vex", "sweet me", "make sense".
- Keep it authentic, not caricature β€” write like a real Nigerian sharing a genuine opinion, not a parody. It should read as natural Pidgin, fluent and confident.
- Do NOT add cultural references that weren't in the original (no jollof, Lagos traffic, etc. unless the source mentioned them).
- Length should stay roughly the same.
- Return ONLY the rewritten text. No preamble, no explanation."""


def naija_style_review(text: str, llm: LLMClient | None = None) -> str:
    """Rewrite an English review in Nigerian English register.

    Idempotent on already-Naija text in practice (the model leaves natural
    phrasings alone).
    """
    llm = llm or LLMClient()
    return llm.complete(
        prompt=f"Rewrite this review in Nigerian English register:\n\n{text}",
        system=NAIJA_STYLE_SYSTEM,
        model="bulk",
    ).strip()


# ──────────────────────────────────────────────────────────────────────────────
# Demo personas β€” used in the Streamlit UI to showcase cold-start handling
# ──────────────────────────────────────────────────────────────────────────────

NAIJA_DEMO_PERSONAS: list[dict] = [
    {
        "name": "Tunde β€” Lagos software engineer",
        "description": (
            "A 28-year-old software engineer in Lagos who reads mostly non-fiction "
            "(business biographies, productivity, AI/tech), watches African and "
            "international thrillers, and complains when books are padded or movies "
            "are too slow. Prefers concise, practical writing. Gives 5 stars only "
            "when something genuinely changed his thinking; defaults to 4. "
            "Frequently mentions 'value for time' and 'execution'."
        ),
        "stated_preferences": ["business biographies", "AI and tech books",
                               "fast-paced thrillers", "Nollywood crime dramas",
                               "concise practical writing"],
        "deal_breakers": ["padded chapters", "slow pacing", "academic jargon"],
    },
    {
        "name": "Ngozi β€” Abuja public health doctor",
        "description": (
            "A 35-year-old doctor in Abuja who reads literary fiction and African "
            "memoirs, watches character-driven dramas (West African and global), "
            "and dislikes anything that handles women's lives shallowly. Writes "
            "thoughtful, longer-than-average reviews. Rates with a tough 3.5 average. "
            "Often references 'emotional truth' and 'craft'."
        ),
        "stated_preferences": ["literary fiction", "African memoirs",
                               "character-driven dramas", "Adichie-adjacent voice"],
        "deal_breakers": ["shallow female characters", "trauma porn",
                          "lazy plotting"],
    },
    {
        "name": "Bayo β€” Ibadan undergraduate",
        "description": (
            "A 21-year-old student in Ibadan who reads YA fantasy, plays a lot of "
            "Afrobeats during study sessions, watches anime and Nollywood comedies, "
            "and writes short bursty reviews. Quick to give 5 stars when entertained. "
            "Mentions vibes, pacing, and whether something 'hits'."
        ),
        "stated_preferences": ["YA fantasy", "anime", "Nollywood comedies",
                               "fast-paced action"],
        "deal_breakers": ["long descriptive passages", "overly serious tone"],
    },
]


def naija_persona_examples() -> list[dict]:
    """Return demo personas for the Task B UI's cold-start showcase."""
    return [dict(p) for p in NAIJA_DEMO_PERSONAS]