Nirnay v3.1 is the new default: request routing 0.40 -> 0.88, SMS spam, emotion, toxicity, RAG up; previous default moved to v2/
61ffaac verified Download code/bench/suites_multi.py from nandukmelath/nirnay: direct link, hf CLI and curl.
- Browser
- Download file 3.97 kB
-
https://huggingface.co/nandukmelath/nirnay/resolve/main/code/bench/suites_multi.py
- Command line
-
hf download hf://nandukmelath/nirnay/code/bench/suites_multi.py
-
curl -L -o suites_multi.py https://huggingface.co/nandukmelath/nirnay/resolve/main/code/bench/suites_multi.py
3.97 kB
| """Multilingual benchmark suites, built once and frozen to bench/data/suites_multi.jsonl. | |
| massive.<lang> MASSIVE intent detection (mteb/amazon_massive_intent, test split): 51 languages, the 60 intents | |
| as options, an English question over a request written in that language. 80 cases per language. | |
| sib200.<lang> SIB-200 topic classification (Davlan/sib200, test split): 205 languages and scripts, 7 topics. | |
| The same 24 FLORES sentences in every language, so languages are compared on identical content. | |
| Both datasets are held out of every Nirnay training build (as MASSIVE is for Laya). | |
| python bench\\suites_multi.py | |
| """ | |
| import json | |
| import os | |
| import random | |
| from datasets import get_dataset_config_names, load_dataset | |
| HERE = os.path.dirname(os.path.abspath(__file__)) | |
| OUT = os.path.join(HERE, "data", "suites_multi.jsonl") | |
| SEED = 13 | |
| N_MASSIVE = int(os.environ.get("BENCH_N_MASSIVE", "80")) | |
| N_SIB = int(os.environ.get("BENCH_N_SIB", "24")) | |
| SUITES = [] | |
| def register(name, cases, gold, **meta): | |
| for i, ((state, qs), g) in enumerate(zip(cases, gold)): | |
| SUITES.append({"suite": name, "i": i, "state": state, "questions": qs, "gold": g, "meta": meta}) | |
| def build_massive(): | |
| langs = [c for c in get_dataset_config_names("mteb/amazon_massive_intent") if c not in ("default", "all")] | |
| intents = sorted(set(load_dataset("mteb/amazon_massive_intent", "en", split="train")["label"])) | |
| labels = [x.replace("_", " ") for x in intents] | |
| crit = {k: None for k in labels} | |
| for lang in langs: | |
| rows = list(load_dataset("mteb/amazon_massive_intent", lang, split="test")) | |
| random.Random("%s-%s" % (SEED, lang)).shuffle(rows) | |
| cases, gold = [], [] | |
| for r in rows[:N_MASSIVE]: | |
| cases.append(({"utterance": r["text"]}, | |
| {"intent": {"type": "choice", "instructions": "Which intent does `utterance` express?", | |
| "criteria": dict(crit)}})) | |
| gold.append(labels.index(r["label"].replace("_", " "))) | |
| register("massive." + lang, cases, gold, note="MASSIVE %s, %d intents (held out)" % (lang, len(labels)), | |
| lang=lang, laya_in_training=False, n_labels=len(labels)) | |
| print("massive: %d languages x %d cases, %d intents" % (len(langs), N_MASSIVE, len(labels)), flush=True) | |
| def build_sib200(): | |
| langs = get_dataset_config_names("Davlan/sib200") | |
| topics = None | |
| broken = [] | |
| for lang in langs: | |
| try: | |
| d = load_dataset("Davlan/sib200", lang, split="test") | |
| except Exception: # a few configs point at files missing from the Hub repo (e.g. nqo_Nkoo) | |
| broken.append(lang) | |
| continue | |
| rows = sorted(d, key=lambda r: int(r["index_id"]))[:N_SIB] | |
| if topics is None: | |
| topics = sorted(set(load_dataset("Davlan/sib200", lang, split="train")["category"])) | |
| cases, gold = [], [] | |
| for r in rows: | |
| cases.append(({"text": r["text"]}, | |
| {"topic": {"type": "choice", "instructions": "What is the topic of `text`?", | |
| "criteria": {t: None for t in topics}}})) | |
| gold.append(topics.index(r["category"])) | |
| register("sib200." + lang, cases, gold, note="SIB-200 %s, %d topics (held out)" % (lang, len(topics)), | |
| lang=lang, laya_in_training=False) | |
| print("sib200: %d languages x %d cases, topics %s | skipped (broken on the Hub): %s" % ( | |
| len(langs) - len(broken), N_SIB, topics, broken or "none"), flush=True) | |
| def main(): | |
| build_massive() | |
| build_sib200() | |
| os.makedirs(os.path.dirname(OUT), exist_ok=True) | |
| with open(OUT, "w", encoding="utf-8") as f: | |
| for r in SUITES: | |
| f.write(json.dumps(r, ensure_ascii=False) + "\n") | |
| print("wrote %d cases in %d suites -> %s" % (len(SUITES), len({r["suite"] for r in SUITES}), OUT)) | |
| if __name__ == "__main__": | |
| main() | |