Spaces:
Running
Running
| """ | |
| fintext-extractor: Transaction Extraction from Bank SMS | |
| Gradio demo for the two-stage NER pipeline that extracts structured | |
| transaction data from bank SMS/notifications using ONNX Runtime. | |
| """ | |
| import json | |
| import time | |
| import gradio as gr | |
| from fintext import FintextExtractor | |
| # Load model at startup (downloads ~1.8GB on first run) | |
| print("Loading fintext-extractor model...") | |
| extractor = FintextExtractor.from_pretrained("Sowrabhm/fintext-extractor", precision="fp16") | |
| print("Model loaded!") | |
| def extract_transaction(sms_text: str) -> str: | |
| """Run two-stage extraction and return formatted JSON.""" | |
| if not sms_text or not sms_text.strip(): | |
| return json.dumps({"error": "Please enter SMS text"}, indent=2) | |
| start = time.time() | |
| # Stage 1: Classification | |
| cls_result = extractor.classify(sms_text) | |
| # Stage 2: Full extraction | |
| result = extractor.extract(sms_text) | |
| elapsed_ms = (time.time() - start) * 1000 | |
| # Build rich output | |
| output = { | |
| "is_transaction": result["is_transaction"], | |
| "confidence": round(cls_result["confidence"], 3), | |
| } | |
| if result["is_transaction"]: | |
| output["transaction_amount"] = result["transaction_amount"] | |
| output["transaction_type"] = result["transaction_type"] | |
| output["transaction_date"] = result["transaction_date"] | |
| output["transaction_description"] = result["transaction_description"] | |
| output["masked_account_digits"] = result["masked_account_digits"] | |
| output["inference_time_ms"] = round(elapsed_ms, 1) | |
| return json.dumps(output, indent=2, default=str) | |
| # Example SMS messages (all synthetic) | |
| examples = [ | |
| ["Rs.5,000 debited from a/c XX1234 for Amazon Pay on 08-Mar-26"], | |
| ["Credit Alert: INR 25,000 credited to a/c XX5678 on 15-Jan-2026"], | |
| ["INR 3,499.00 paid to Netflix via card ending 9876 on 01-Feb-2026"], | |
| ["Dear Customer, Rs.850.50 has been credited to your a/c XX2468 on 05-Mar-2026. UPI Ref: 678912345"], | |
| ["Transaction of Rs.15,750 at Flipkart on 28-Feb-2026 from card XX3579. Avl bal: Rs.42,300"], | |
| ["OTP 483921 for transaction of Rs.1,200. Do not share with anyone."], | |
| ["Your FD of Rs.50,000 matures on 20-Apr-2026. Visit branch."], | |
| ["Reminder: EMI of Rs.12,500 due on 10-Mar-2026 for loan XX4321"], | |
| ] | |
| # Build Gradio interface | |
| demo = gr.Interface( | |
| fn=extract_transaction, | |
| inputs=gr.Textbox( | |
| label="SMS / Notification Text", | |
| placeholder="Paste a bank SMS here...", | |
| lines=3, | |
| ), | |
| outputs=gr.Code( | |
| label="Extracted Transaction Data", | |
| language="json", | |
| ), | |
| title="fintext-extractor", | |
| description=( | |
| "Extract structured transaction data from bank SMS using on-device NER. " | |
| "Two-stage pipeline: DeBERTa classifier filters non-transactions, " | |
| "then GLiNER2 extracts amount, date, type, description, and account digits.\n\n" | |
| "**Try the examples below or paste your own SMS text.**" | |
| ), | |
| article=( | |
| "**Links:** " | |
| "[Model](https://huggingface.co/Sowrabhm/fintext-extractor) | " | |
| "[GitHub](https://github.com/sowrabhmv/fintext-extractor) | " | |
| "License: CC-BY-4.0" | |
| ), | |
| examples=examples, | |
| cache_examples=False, | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch() | |