--- license: apache-2.0 base_model: openlm-research/open_llama_3b_v2 library_name: transformers pipeline_tag: text-generation model_type: peft adapter_type: lora language: [en, ms] tags: [peft, lora, qlora, address-normalization, address-correction, malaysia] --- # Malaysian Address Corrector LoRA This is a **LoRA adapter** for [`openlm-research/open_llama_3b_v2`](https://huggingface.co/openlm-research/open_llama_3b_v2) fine-tuned to **normalize and standardize Malaysian postal addresses**. It expands common abbreviations, enforces consistent comma-separated formatting, and outputs **uppercase** standardized addresses. ⚠️ **Important:** This repo contains **adapters only** — you must load them on top of the base model. The Hosted Inference widget will not run adapters directly. --- # Model Card for Model ID This model is a LoRA-fine-tuned adapter built on top of OpenLLaMA 3B v2, specialized for Malaysian address correction. It: Expands common local abbreviations (e.g., JLN → JALAN, TMN → TAMAN, WPKL → KUALA LUMPUR) Normalizes spacing and adds commas, outputting addresses in a consistent, one-line, uppercase format Formats addresses as [Address/Unit], [Street], [Locality/Area], [City], [Postcode], [State] Runs efficiently on modest GPUs thanks to 4-bit quantization + LoRA, and supports easy batch or interactive usage Ideal for developers needing clean, standardized Malaysian postal addresses for shipping labels, geocoding, or databases. ## Model Details Base model: openlm-research/open_llama_3b_v2 (Apache-2.0). Technique: QLoRA-style PEFT (LoRA on 4-bit base) Intended users: Developers standardizing Malaysian postal addresses ## Uses Correct and standardize Malaysian addresses in free-form text Expand common abbreviations (e.g., JLN, TMN, LRG, WPKL) Produce a single uppercase line suitable for label printing or geocoding prep ## Out-of-Scope Use Non-Malaysian address formats Entity verification/validation against authoritative sources Geocoding / latitude-longitude lookup ## Bias, Risks & Limitations Formatting assumptions: The model favors Malaysian conventions and may incorrectly reorder non-MY addresses. Ambiguity: Abbreviations like HSN may map to multiple names; defaults are rule-based and may not match all cases. Hallucination: The model can invent locality/state if the input is severely incomplete; keep a human in the loop for critical mailings. ## Recommendations Keep a deterministic rule layer (abbrev expansion + uppercasing + simple postcode/state checks). If you have authoritative reference lists (states, cities, postcodes), validate the final line before use. ## Training Details Base model: openlm-research/open_llama_3b_v2 Method: LoRA fine-tuning with QLoRA (4-bit quantization) Dataset: Synthetic + manually curated Malaysian address pairs (JSONL format: instruction, input, output) Task: Causal LM, few-shot prompting with output delimiters ... Epochs: 2 Batch size: 2 (gradient accumulation 8) LR: 2e-4 (cosine schedule, warmup 5%) ## How to use (LoRA adapter) from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig from peft import PeftModel import torch, re BASE = "openlm-research/open_llama_3b_v2" ADAPTER = "ramshafirdous/malaysian-address-corrector-lora" bnb = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_use_double_quant=True, bnb_4bit_compute_dtype=torch.float16, ) tok = AutoTokenizer.from_pretrained(BASE, use_fast=False) if tok.pad_token_id is None: tok.pad_token = tok.eos_token base = AutoModelForCausalLM.from_pretrained(BASE, quantization_config=bnb, device_map="auto", trust_remote_code=True) model = PeftModel.from_pretrained(base, ADAPTER).eval() def tidy_commas_upper(s): s = re.sub(r"[\t|]+", ", ", s) s = re.sub(r"\s*,\s*", ", ", s) s = re.sub(r"\s{2,}", " ", s).strip() return s.upper() OUT_S, OUT_E = "", "" FEWSHOT = ( "MALAYSIAN ADDRESS NORMALIZER.\n" "EXPAND ABBREVIATIONS. ONE LINE. ALL CAPS.\n" "FORMAT: [ADDRESS], [STREET], [LOCALITY], [CITY], [POSTCODE], [STATE]\n\n" f"Input: 8 LRG ZAINAL ABIDIN 13 KAMPUNG PENDAMAR KLANG 41200 Selangor\n" f"Output: {OUT_S}8, LORONG ZAINAL ABIDIN 13, KAMPUNG PENDAMAR, KLANG, 41200, SELANGOR{OUT_E}\n" ) def correct_address(raw, max_new_tokens=128): prompt = f"{FEWSHOT}\nInput: {raw}\nOutput: {OUT_S}" enc = tok(prompt, return_tensors="pt", truncation=True, max_length=1024).to(model.device) with torch.no_grad(): out = model.generate(**enc, max_new_tokens=max_new_tokens, do_sample=False, repetition_penalty=1.05, eos_token_id=tok.eos_token_id, pad_token_id=tok.pad_token_id) txt = tok.decode(out[0], skip_special_tokens=True) seg = txt.split(OUT_S, 1)[-1] seg = seg.split(OUT_E, 1)[0] if OUT_E in seg else seg.split("\n", 1)[0] return tidy_commas_upper(seg) print(correct_address("11A, JALAN BU 11/14, BANDAR UTAMA PETALING JAYA 47800 Selangor")) ## Evaluation Qualitative validation on held-out messy inputs: | Input | Output | | ------------------------------------------------------------------------ | ------------------------------------------------------------------------- | | `11A, JALAN BU 11/14, BANDAR UTAMA PETALING JAYA 47800 Selangor` | `11A, JALAN BU 11/14, BANDAR UTAMA, PETALING JAYA, 47800, SELANGOR` | | `LEVEL 30 THE GARDENS NORTH TOWER MID VALLEY CITY 59200 WP Kuala Lumpur` | `LEVEL 30, THE GARDENS NORTH TOWER, MID VALLEY CITY, 59200, KUALA LUMPUR` | | `8 LRG ZAINAL ABIDIN 13 KAMPUNG PENDAMAR KLANG 41200 Selangor` | `8, LORONG ZAINAL ABIDIN 13, KAMPUNG PENDAMAR, KLANG, 41200, SELANGOR` | ## Abbreviation coverage | Abbreviation | Expansion | | ----------------------- | --------------------- | | JLN | JALAN | | TMN | TAMAN | | LRG | LORONG | | BDR | BANDAR | | PJS | PETALING JAYA SELATAN | | WPKL | KUALA LUMPUR | | KPG | KAMPUNG | | PLG | PULAU | | BLK | BLOK | | LEBUH RAYA / HWY / HWAY | LEBUH RAYA | | ... | ... | ## Known Limitations The model relies on prompt patterns — inconsistent prompting may reduce accuracy. Does not validate postcode vs. state matches. May occasionally insert or omit commas if input spacing is irregular (use a rule-based post-processor like tidy_commas_upper). Trained for Malaysian addresses only. Not for parsing addresses into structured fields. Not a geocoder — it does not verify location existence. ## Model Card Authors Author: Ramsha Firdous