File size: 4,154 Bytes
f90fc03
 
 
 
 
 
 
 
 
 
 
 
 
4bf4772
 
 
 
 
f90fc03
 
 
 
 
 
4bf4772
f90fc03
4bf4772
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f90fc03
 
 
 
 
 
 
 
 
4bf4772
 
 
 
 
 
 
 
 
 
 
f90fc03
 
 
 
 
 
 
 
4bf4772
f90fc03
 
 
4bf4772
f90fc03
 
 
4bf4772
f90fc03
4bf4772
f90fc03
 
 
 
 
 
 
 
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
---
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\": \"<category>\", \"company_name\": \"<company_or_null>\", \"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\": \"<category>\", \"company_name\": \"<company_or_null>\", \"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": "<category>", "company_name": "<company_or_null>", "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)