--- language: en license: mit library_name: transformers tags: - finance - banking - indian - upi - transaction-classification - qwen - fine-tuned base_model: Qwen/Qwen2.5-0.5B widget: - text: "### System:\nYou are a bank transaction classifier for Indian bank statements. Given a raw transaction description, infer both its category and the actual company when evidence exists. Respond with ONLY a JSON object: {\"category\": \"\", \"company_name\": \"\", \"is_income\": false, \"confidence\": 0.0}.\n\n### Input:\nUPI/zerodhabroking@/HDFC BANK LTD\n\n### Output:\n" example_title: "UPI — Zerodha" - text: "### System:\nYou are a bank transaction classifier for Indian bank statements. Given a raw transaction description, infer both its category and the actual company when evidence exists. Respond with ONLY a JSON object: {\"category\": \"\", \"company_name\": \"\", \"is_income\": false, \"confidence\": 0.0}.\n\n### Input:\nNEFT/SALARY/ACME CORP\n\n### Output:\n" example_title: "NEFT — Salary" --- # Indian Transaction Classifier Fine-tuned Qwen2.5-0.5B for classifying Indian bank transactions (UPI, NEFT, IMPS, RTGS) into 30+ categories with merchant identification. ## ⚡ Try it now (Inference API — free, no setup) Use the **Inference API** widget on the right side of this page. Type a transaction description in the text box and click Compute. Or call it programmatically: ```python from huggingface_hub import InferenceClient client = InferenceClient(model="SahilGoel/indian-txn-classifier") system_prompt = 'You are a bank transaction classifier for Indian bank statements. Given a raw transaction description, infer both its category and the actual company when evidence exists. Respond with ONLY a JSON object: {"category": "", "company_name": "", "is_income": false, "confidence": 0.0}.' tx = "UPI/zerodhabroking@/HDFC BANK LTD" prompt = f"### System:\n{system_prompt}\n\n### Input:\n{tx}\n\n### Output:\n" result = client.text_generation(prompt, max_new_tokens=100, temperature=0.1) print(result) # {"category": "trading_deposit", "company_name": "Zerodha", "is_income": false, "confidence": 0.95} ``` ## Categories **Income:** salary, dividend, interest, rental, capital_gains, other_income **Expenses:** food, grocery, shopping, bills, medical, insurance, tax_payment, credit_card, personal_transfer, investment, trading_deposit, trading_credit, education, travel, entertainment, donation, loan_emi, loan_repayment, cash_withdrawal **Special:** friends, family, flat_deposit, trading_fees, vehicle_purchase, staff_salary, health_fitness, transfer, unclassified ## Pipeline Architecture 1. **Rule engine** (70-80% coverage) — regex patterns for known merchants and UPI handles 2. **Recurring pattern detector** (10% more) — identifies repeating transactions 3. **Fine-tuned Qwen 0.5B** (remaining) — LLM fallback for uncertain transactions ## Run locally ```bash pip install transformers torch ``` ```python from transformers import AutoModelForCausalLM, AutoTokenizer model = AutoModelForCausalLM.from_pretrained("SahilGoel/indian-txn-classifier") tokenizer = AutoTokenizer.from_pretrained("SahilGoel/indian-txn-classifier") system_prompt = "You are a bank transaction classifier for Indian bank statements..." input_text = "UPI/swiggybengaluru@/HDFC BANK LTD" prompt = f"### System:\n{system_prompt}\n\n### Input:\n{input_text}\n\n### Output:\n" inputs = tokenizer(prompt, return_tensors="pt") outputs = model.generate(**inputs, max_new_tokens=100, temperature=0.1, do_sample=False) print(tokenizer.decode(outputs[0], skip_special_tokens=True)) ``` ## Run on Google Colab (free GPU) Open `app.py` from the GitHub repo in a Colab notebook — it works as a Gradio app with a public share link. ## Supported Banks ICICI, HDFC, SBI, Axis, Kotak, Yes Bank, Federal Bank, IDFC First, IndusInd, Bank of Baroda, Punjab National, Canara, Union Bank, Unity SFB ## GitHub Code and training pipeline: [the-great-one/indian-txn-classifier](https://github.com/The-Great-One/indian-txn-classifier)