nanochat-ar / scripts /07_make_arabic_sft.py
Babajaan's picture
Upload nanochat-ar Aziz HPC proof-run checkpoints
b6839ad verified
Raw
History Blame Contribute Delete
2.1 kB
#!/usr/bin/env python3
"""Build a compact Arabic SFT JSONL from the downloaded Arabic corpus."""
from __future__ import annotations
import argparse
import json
from pathlib import Path
def clean_line(line: str) -> str:
return " ".join(line.strip().split())
def main() -> int:
parser = argparse.ArgumentParser()
parser.add_argument("--input", required=True)
parser.add_argument("--output", required=True)
parser.add_argument("--max-examples", type=int, default=2000)
parser.add_argument("--min-chars", type=int, default=180)
parser.add_argument("--max-chars", type=int, default=900)
args = parser.parse_args()
input_path = Path(args.input)
output_path = Path(args.output)
output_path.parent.mkdir(parents=True, exist_ok=True)
prompts = [
"لخص النص العربي التالي في فقرة قصيرة وواضحة.",
"استخرج الفكرة الرئيسية من النص التالي.",
"اكتب جوابا تعليميا مختصرا اعتمادا على النص التالي.",
"حول النص التالي إلى نقاط معرفية واضحة.",
]
count = 0
with input_path.open("r", encoding="utf-8", errors="ignore") as src, output_path.open(
"w", encoding="utf-8"
) as dst:
for raw in src:
text = clean_line(raw)
if len(text) < args.min_chars:
continue
text = text[: args.max_chars]
prompt = prompts[count % len(prompts)]
messages = [
{"role": "user", "content": f"{prompt}\n\n{text}"},
{"role": "assistant", "content": text[: min(len(text), 420)]},
]
dst.write(json.dumps(messages, ensure_ascii=False) + "\n")
count += 1
if count >= args.max_examples:
break
if count == 0:
raise SystemExit(f"No examples written from {input_path}")
print(f"Wrote {count} Arabic SFT examples to {output_path}")
return 0
if __name__ == "__main__":
raise SystemExit(main())