Instructions to use judicialmind/NIC-Coder-0.6B with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use judicialmind/NIC-Coder-0.6B with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-classification", model="judicialmind/NIC-Coder-0.6B")# pip install -U transformers accelerate # Load model directly from transformers import AutoModel model = AutoModel.from_pretrained("judicialmind/NIC-Coder-0.6B", device_map="auto") - Notebooks
- Google Colab
- Kaggle
You need to agree to share your contact information to access this model
This repository is publicly accessible, but you have to accept the conditions to access its files and content.
This model is released under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 licence (CC BY-NC-SA 4.0): research, academic, personal and other non-commercial use is permitted with attribution; adaptations must be shared under the same licence; commercial use is not permitted. The original public source data remains under the Government Open Data License - India (GODL-India). Commercial use: contact surya@judicialmind.ai or hello@judicialmind.ai.
Log in or Sign Up to review the conditions and access this model content.
NIC-Coder-0.6B
Licence: CC BY-NC-SA 4.0 — research and non-commercial use only; derivatives must be shared under the same licence. Commercial use: contact surya@judicialmind.ai or hello@judicialmind.ai
Access is approved automatically when the email you enter matches your Hugging Face account email and belongs to the organisation you name; other requests are reviewed manually.
NIC-Coder-0.6B assigns an Indian business name, optionally with a short description of what the business does, to a NIC-2008 (National Industrial Classification 2008) code. It returns ranked 5-digit sub-classes with their official titles, plus 4-digit class, 3-digit group and 2-digit division predictions that are always consistent with the 5-digit ranking. It covers 1,177 NIC-2008 sub-classes in 82 divisions and was fine-tuned from Qwen/Qwen3-Embedding-0.6B on UDYAM MSME registrations.
From the name alone, on business names it never saw, it gets the exact 5-digit code right 16.4% of the time, against 7.2% for a TF-IDF + linear classifier trained on the same data and 5.7% for zero-shot matching of names to NIC titles with the base embedding model. In three states held out of training altogether (Kerala, Odisha, Uttarakhand) the gap holds: 13.8% vs 5.7% and 5.1%.
Name only, unseen names: accuracy (%)
| Test set | NIC-Coder-0.6B | TF-IDF + linear | Zero-shot embedding |
|---|---|---|---|
| Random states, NIC5 top-1 | 16.4 | 7.2 | 5.7 |
| Random states, NIC5 top-5 | 38.1 | 17.1 | 14.5 |
| Random states, NIC2 top-1 | 29.5 | 18.6 | 15.4 |
| Held-out states, NIC5 top-1 | 13.8 | 5.7 | 5.1 |
| Held-out states, NIC5 top-5 | 33.4 | 13.8 | 12.9 |
| Held-out states, NIC2 top-1 | 27.2 | 16.1 | 14.6 |
Quickstart
pip install -r requirements.txt # or: torch transformers safetensors huggingface_hub
from huggingface_hub import snapshot_download
import sys
path = snapshot_download("judicialmind/NIC-Coder-0.6B")
sys.path.insert(0, path)
from model import NICCoder
m = NICCoder.load(path) # GPU if available, else CPU
res = m.predict(
["Kaveri Rice Mill", "Sai Krupa Medical Stores", "Kavya Tailoring Works"],
activities=[None, None, "custom tailoring"],
k=3,
)
for r in res:
print(r["nic5"][0], r["nic2"][0])
Top prediction for the three made-up names above (CPU run)
| Input | NIC5 | Title | Probability | NIC2 | Probability |
|---|---|---|---|---|---|
| Kaveri Rice Mill | 10612 | Rice milling | 0.545 | 10 | 0.749 |
| Sai Krupa Medical Stores | 47721 | Retail sale of pharmaceuticals, medical and orthopaedic goods and toilet articles | 0.434 | 47 | 0.479 |
| Kavya Tailoring Works + "custom tailoring" | 14105 | Custom tailoring | 0.996 | 14 | 0.996 |
predict(names, activities=None, k=5, adjust=True) takes a list of business names and an optional list of activity descriptions (same length, None where there is none). It returns one dict per input:
| Key | Content |
|---|---|
nic5 |
top-k (code, NIC-2008 title, probability) for 5-digit sub-classes |
nic4, nic3, nic2 |
top-k (code, probability) for the 4-digit class, 3-digit group and 2-digit division |
Command line (one JSON line per input; reads name or name<TAB>activity lines from stdin when no name is given):
python predict.py "Kaveri Rice Mill" -k 3
printf 'Kavya Tailoring Works\tcustom tailoring\n' | python predict.py -k 3
Input format
The model sees business: <normalised name> or business: <normalised name> | activity: <activity text>. Normalisation is done for you (text.normalize_name): lower-casing, & to and, punctuation to spaces, a leading M/s or Messrs removed, and trailing legal suffixes (Pvt, Private, Ltd, Limited, LLP, OPC) removed. Activity text is lower-cased. Inputs are truncated at 64 tokens.
Prior adjustment
adjust=True (default) adds a log-prior correction to the scores so predictions follow how often each code occurs among UDYAM registrations. This maximises accuracy on registrations drawn the way UDYAM is. adjust=False (CLI --balanced) gives class-balanced scores: lower overall accuracy, less pull toward the most common codes, useful when you rank rare industries or apply your own prior.
Label hierarchy
NIC-2008 codes are nested by prefix: 10501 (sub-class) is in class 1050, group 105 and division 10 (Manufacture of food products). The 4/3/2-digit probabilities are sums of the 5-digit probabilities under each prefix. label_map.json holds the 1,177 sub-class codes and their official titles.
Files
| File | Content |
|---|---|
backbone/ |
fine-tuned Qwen3-Embedding-0.6B weights and tokenizer (Transformers format) |
head.safetensors |
classifier weights over the 1,177 NIC5 sub-classes, logit scale and prior correction |
label_map.json |
NIC5 codes (head order), NIC-2008 titles, maximum input length |
model.py |
NICCoder.load(path_or_repo_id) and NICCoder.predict(...) |
text.py |
input normalisation and model-input formatting |
predict.py |
command-line interface |
metrics.json |
all evaluation results (NIC-Coder, zero-shot embedding, baselines; per state) |
label_stats.json |
aggregate registration counts by NIC5 code, division and state |
requirements.txt |
pinned runtime dependencies |
Results
Test names are held out: no normalised business name in the test sets appears in training. Each test set keeps the natural mix of codes. Random states: 50,000 registrations from the states used in training. Held-out states: 46,712 registrations from Kerala, Odisha and Uttarakhand, none of which were used in training. Accuracy is top-1 / top-5 at each NIC level. Macro-F1 is NIC5 top-1 averaged over the codes present in the test set. Any-of counts a top-1 NIC5 that matches any of the activities the enterprise listed. For scale, the single most common sub-class (96098, household maintenance services) accounts for 4.0% of registrations.
Random states, unseen names, name only (%)
| Method | NIC5 top-1 | NIC5 top-5 | NIC4 top-1 | NIC2 top-1 | NIC2 top-5 | NIC5 macro-F1 | NIC5 any-of top-1 |
|---|---|---|---|---|---|---|---|
| NIC-Coder-0.6B (default) | 16.4 | 38.1 | 20.0 | 29.5 | 65.0 | 7.3 | 18.4 |
NIC-Coder-0.6B, adjust=False |
9.7 | 25.1 | 13.8 | 23.6 | 55.3 | 6.6 | 11.4 |
| TF-IDF (char + word) + linear | 7.2 | 17.1 | 10.6 | 18.6 | 45.0 | 4.6 | 8.5 |
| Nearest NIC title, TF-IDF | 5.1 | 11.9 | 7.3 | 12.4 | 30.8 | 2.9 | 5.9 |
| Nearest NIC title, Qwen3-Embedding-0.6B zero-shot | 5.7 | 14.5 | 8.3 | 15.4 | 39.4 | 3.5 | 6.6 |
Held-out states, unseen names, name only (%)
| Method | NIC5 top-1 | NIC5 top-5 | NIC4 top-1 | NIC2 top-1 | NIC2 top-5 | NIC5 macro-F1 | NIC5 any-of top-1 |
|---|---|---|---|---|---|---|---|
| NIC-Coder-0.6B (default) | 13.8 | 33.4 | 16.7 | 27.2 | 62.0 | 5.8 | 15.3 |
NIC-Coder-0.6B, adjust=False |
8.0 | 20.1 | 11.3 | 21.5 | 50.0 | 5.1 | 9.1 |
| TF-IDF (char + word) + linear | 5.7 | 13.8 | 8.5 | 16.1 | 40.2 | 3.5 | 6.5 |
| Nearest NIC title, TF-IDF | 4.5 | 10.2 | 6.5 | 11.8 | 28.8 | 2.5 | 5.2 |
| Nearest NIC title, Qwen3-Embedding-0.6B zero-shot | 5.1 | 12.9 | 7.5 | 14.6 | 37.6 | 3.5 | 5.7 |
Held-out states, name only, by state (%)
| State | Test registrations | NIC5 top-1 | NIC2 top-1 |
|---|---|---|---|
| Kerala | 17,203 | 15.2 | 30.9 |
| Odisha | 22,645 | 11.5 | 22.7 |
| Uttarakhand | 6,864 | 18.3 | 32.5 |
Name + activity text
In these tests the activity text was a lower-cased span of 40–100% of the words of the correct code's official NIC-2008 title, so they measure how well a model maps a near-verbatim NIC description to its code, not free-form business descriptions.
Random states, unseen names, name + activity text (%)
| Method | NIC5 top-1 | NIC5 top-5 | NIC4 top-1 | NIC2 top-1 | NIC2 top-5 | NIC5 macro-F1 | NIC5 any-of top-1 |
|---|---|---|---|---|---|---|---|
| NIC-Coder-0.6B (default) | 98.4 | 99.8 | 98.8 | 99.2 | 99.9 | 96.6 | 98.5 |
NIC-Coder-0.6B, adjust=False |
97.8 | 99.5 | 98.4 | 98.8 | 99.8 | 95.4 | 97.8 |
| TF-IDF (char + word) + linear | 96.8 | 99.3 | 98.0 | 98.6 | 99.6 | 94.5 | 96.8 |
| Nearest NIC title, TF-IDF | 96.4 | 99.1 | 97.0 | 98.0 | 99.5 | 92.9 | 96.4 |
| Nearest NIC title, Qwen3-Embedding-0.6B zero-shot | 72.9 | 88.5 | 76.0 | 81.4 | 94.7 | 70.6 | 73.3 |
Held-out states, unseen names, name + activity text (%)
| Method | NIC5 top-1 | NIC5 top-5 | NIC4 top-1 | NIC2 top-1 | NIC2 top-5 | NIC5 macro-F1 | NIC5 any-of top-1 |
|---|---|---|---|---|---|---|---|
| NIC-Coder-0.6B (default) | 98.2 | 99.7 | 98.6 | 99.1 | 99.8 | 95.7 | 98.2 |
NIC-Coder-0.6B, adjust=False |
97.4 | 99.4 | 98.1 | 98.7 | 99.7 | 94.3 | 97.4 |
| TF-IDF (char + word) + linear | 96.6 | 99.2 | 97.8 | 98.4 | 99.6 | 93.9 | 96.6 |
| Nearest NIC title, TF-IDF | 96.1 | 99.0 | 96.8 | 97.9 | 99.5 | 92.4 | 96.2 |
| Nearest NIC title, Qwen3-Embedding-0.6B zero-shot | 73.9 | 88.7 | 76.8 | 82.3 | 94.8 | 69.5 | 74.2 |
With a NIC-title-like description every trained method is near the ceiling; NIC-Coder stays ahead at every level and lifts NIC5 macro-F1 to 96.6 (random states) and 95.7 (held-out states). The name-only setting is where the model's learned knowledge of Indian business names matters: many names ("Shree Ganesh Enterprises") carry no industry signal at all, while others ("... Dairy Farm", "... Auto Spares") do.
Coverage
- Source: 39,648,419 UDYAM MSME registrations from 35 states and union territories (data.gov.in snapshot, May 2026); 21,199,026 distinct normalised business names. Only aggregate counts are included in this repository (
label_stats.json); there are no registration rows, enterprise names or addresses. - Labels: 1,177 NIC-2008 5-digit sub-classes, 379 classes, 221 groups and 82 divisions. The label is the first activity listed on the registration.
- Held-out states: Kerala, Odisha and Uttarakhand were excluded from training and are used only for testing.
Source data
- Ministry of Micro, Small and Medium Enterprises. "List of MSME Registered Units under UDYAM". data.gov.in resource 8b68ae56-84cf-4728-a0a6-1be11028dea7, https://api.data.gov.in/resource/8b68ae56-84cf-4728-a0a6-1be11028dea7. Snapshot: May 2026.
- National Industrial Classification 2008 (NIC-2008) codes and titles: Central Statistics Office (CSO), Ministry of Statistics and Programme Implementation (MoSPI), Government of India.
Original data: published by Ministry of Micro, Small and Medium Enterprises (UDYAM registration) on the Open Government Data Platform India (data.gov.in) and, where marked, NITI Aayog's National Data and Analytics Platform (NDAP), under the Government Open Data License - India (GODL-India). The original public data remains under GODL-India; the CC BY-NC-SA 4.0 licence of this repository covers JudicialMind's compilation, derived fields, annotations, benchmarks and models.
Citation
@misc{judicialmind2026niccoder,
title={NIC-Coder-0.6B: NIC-2008 industry codes from Indian business names},
author={JudicialMind},
year={2026},
publisher={Hugging Face},
howpublished={\url{https://huggingface.co/judicialmind/NIC-Coder-0.6B}}
}
License
CC BY-NC-SA 4.0 (see LICENSE): research, academic, personal and other non-commercial use, with attribution to JudicialMind and to the original data publishers; adaptations must be shared under the same licence. Commercial use requires a separate licence.
Commercial use: contact surya@judicialmind.ai or hello@judicialmind.ai.
Base model(s): Qwen/Qwen3-Embedding-0.6B (apache-2.0). Their licence terms and notices continue to apply to the upstream components; see THIRD_PARTY_NOTICES.md and NOTICE.