Sync model from GitHub repository
Browse filesAutomated sync via GitHub Action / script
- .gitattributes +35 -35
- README.md +27 -22
- config.json +26 -26
- predict.py +6 -14
.gitattributes
CHANGED
|
@@ -1,35 +1,35 @@
|
|
| 1 |
-
*.7z filter=lfs diff=lfs merge=lfs -text
|
| 2 |
-
*.arrow filter=lfs diff=lfs merge=lfs -text
|
| 3 |
-
*.bin filter=lfs diff=lfs merge=lfs -text
|
| 4 |
-
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
| 5 |
-
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
| 6 |
-
*.ftz filter=lfs diff=lfs merge=lfs -text
|
| 7 |
-
*.gz filter=lfs diff=lfs merge=lfs -text
|
| 8 |
-
*.h5 filter=lfs diff=lfs merge=lfs -text
|
| 9 |
-
*.joblib filter=lfs diff=lfs merge=lfs -text
|
| 10 |
-
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
| 11 |
-
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
| 12 |
-
*.model filter=lfs diff=lfs merge=lfs -text
|
| 13 |
-
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
| 14 |
-
*.npy filter=lfs diff=lfs merge=lfs -text
|
| 15 |
-
*.npz filter=lfs diff=lfs merge=lfs -text
|
| 16 |
-
*.onnx filter=lfs diff=lfs merge=lfs -text
|
| 17 |
-
*.ot filter=lfs diff=lfs merge=lfs -text
|
| 18 |
-
*.parquet filter=lfs diff=lfs merge=lfs -text
|
| 19 |
-
*.pb filter=lfs diff=lfs merge=lfs -text
|
| 20 |
-
*.pickle filter=lfs diff=lfs merge=lfs -text
|
| 21 |
-
*.pkl filter=lfs diff=lfs merge=lfs -text
|
| 22 |
-
*.pt filter=lfs diff=lfs merge=lfs -text
|
| 23 |
-
*.pth filter=lfs diff=lfs merge=lfs -text
|
| 24 |
-
*.rar filter=lfs diff=lfs merge=lfs -text
|
| 25 |
-
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
| 26 |
-
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
| 27 |
-
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
| 28 |
-
*.tar filter=lfs diff=lfs merge=lfs -text
|
| 29 |
-
*.tflite filter=lfs diff=lfs merge=lfs -text
|
| 30 |
-
*.tgz filter=lfs diff=lfs merge=lfs -text
|
| 31 |
-
*.wasm filter=lfs diff=lfs merge=lfs -text
|
| 32 |
-
*.xz filter=lfs diff=lfs merge=lfs -text
|
| 33 |
-
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
-
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
-
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
| 1 |
+
*.7z filter=lfs diff=lfs merge=lfs -text
|
| 2 |
+
*.arrow filter=lfs diff=lfs merge=lfs -text
|
| 3 |
+
*.bin filter=lfs diff=lfs merge=lfs -text
|
| 4 |
+
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
| 5 |
+
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
| 6 |
+
*.ftz filter=lfs diff=lfs merge=lfs -text
|
| 7 |
+
*.gz filter=lfs diff=lfs merge=lfs -text
|
| 8 |
+
*.h5 filter=lfs diff=lfs merge=lfs -text
|
| 9 |
+
*.joblib filter=lfs diff=lfs merge=lfs -text
|
| 10 |
+
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
| 11 |
+
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
| 12 |
+
*.model filter=lfs diff=lfs merge=lfs -text
|
| 13 |
+
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
| 14 |
+
*.npy filter=lfs diff=lfs merge=lfs -text
|
| 15 |
+
*.npz filter=lfs diff=lfs merge=lfs -text
|
| 16 |
+
*.onnx filter=lfs diff=lfs merge=lfs -text
|
| 17 |
+
*.ot filter=lfs diff=lfs merge=lfs -text
|
| 18 |
+
*.parquet filter=lfs diff=lfs merge=lfs -text
|
| 19 |
+
*.pb filter=lfs diff=lfs merge=lfs -text
|
| 20 |
+
*.pickle filter=lfs diff=lfs merge=lfs -text
|
| 21 |
+
*.pkl filter=lfs diff=lfs merge=lfs -text
|
| 22 |
+
*.pt filter=lfs diff=lfs merge=lfs -text
|
| 23 |
+
*.pth filter=lfs diff=lfs merge=lfs -text
|
| 24 |
+
*.rar filter=lfs diff=lfs merge=lfs -text
|
| 25 |
+
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
| 26 |
+
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
| 27 |
+
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
| 28 |
+
*.tar filter=lfs diff=lfs merge=lfs -text
|
| 29 |
+
*.tflite filter=lfs diff=lfs merge=lfs -text
|
| 30 |
+
*.tgz filter=lfs diff=lfs merge=lfs -text
|
| 31 |
+
*.wasm filter=lfs diff=lfs merge=lfs -text
|
| 32 |
+
*.xz filter=lfs diff=lfs merge=lfs -text
|
| 33 |
+
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
+
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
+
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
README.md
CHANGED
|
@@ -48,6 +48,17 @@ widget:
|
|
| 48 |
|
| 49 |
# CompactNameClassifier: Ultra-Efficient Name Classifier Trained From Scratch
|
| 50 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 51 |
`CompactNameClassifier` is a state-of-the-art, ultra-lightweight neural text classifier trained **from scratch** on a curated dataset of **455,669 records** (245.7k real human names across global cultures + 210.0k non-names, usernames, gamer tags, and alphanumeric codes).
|
| 52 |
|
| 53 |
Unlike generic large language models or pretrained BERT variants, `CompactNameClassifier` has **zero external pretrained dependencies**, weighs just **~647 KB** (INT8 ONNX), and delivers sub-millisecond CPU inference (**< 0.25 ms per query**).
|
|
@@ -164,28 +175,22 @@ CSE3048 => NON_NAME (99.9%)
|
|
| 164 |
|
| 165 |
---
|
| 166 |
|
| 167 |
-
### 3. Node.js Inference (onnxruntime-node)
|
| 168 |
|
| 169 |
```javascript
|
| 170 |
-
import
|
| 171 |
-
|
| 172 |
-
|
| 173 |
-
|
| 174 |
-
|
| 175 |
-
|
| 176 |
-
|
| 177 |
-
|
| 178 |
-
|
| 179 |
-
|
| 180 |
-
|
| 181 |
-
|
| 182 |
-
|
| 183 |
-
input_ids: new ort.Tensor('int32', inputIds, [1, 20]),
|
| 184 |
-
attention_mask: new ort.Tensor('int32', attentionMask, [1, 20])
|
| 185 |
-
};
|
| 186 |
-
|
| 187 |
-
const results = await session.run(feeds);
|
| 188 |
-
console.log(results);
|
| 189 |
```
|
| 190 |
|
| 191 |
---
|
|
@@ -194,7 +199,7 @@ console.log(results);
|
|
| 194 |
|
| 195 |
```python
|
| 196 |
import torch
|
| 197 |
-
from model import CompactNameClassifier
|
| 198 |
|
| 199 |
model = CompactNameClassifier(
|
| 200 |
vocab_size=4000,
|
|
@@ -205,7 +210,7 @@ model = CompactNameClassifier(
|
|
| 205 |
max_len=20,
|
| 206 |
dropout=0.0
|
| 207 |
)
|
| 208 |
-
model.load_state_dict(torch.load("model_weights.pt", weights_only=True))
|
| 209 |
model.eval()
|
| 210 |
```
|
| 211 |
|
|
|
|
| 48 |
|
| 49 |
# CompactNameClassifier: Ultra-Efficient Name Classifier Trained From Scratch
|
| 50 |
|
| 51 |
+
<div align="center">
|
| 52 |
+
|
| 53 |
+
[](https://huggingface.co/SupratimRK/compact-name-classifier)
|
| 54 |
+
[](https://github.com/SupratimRK/compact-name-classifier)
|
| 55 |
+
[](LICENSE)
|
| 56 |
+
[](https://onnxruntime.ai/)
|
| 57 |
+
|
| 58 |
+
**[🤗 Hugging Face Model Hub](https://huggingface.co/SupratimRK/compact-name-classifier)** | **[🐙 GitHub Repository](https://github.com/SupratimRK/compact-name-classifier)**
|
| 59 |
+
|
| 60 |
+
</div>
|
| 61 |
+
|
| 62 |
`CompactNameClassifier` is a state-of-the-art, ultra-lightweight neural text classifier trained **from scratch** on a curated dataset of **455,669 records** (245.7k real human names across global cultures + 210.0k non-names, usernames, gamer tags, and alphanumeric codes).
|
| 63 |
|
| 64 |
Unlike generic large language models or pretrained BERT variants, `CompactNameClassifier` has **zero external pretrained dependencies**, weighs just **~647 KB** (INT8 ONNX), and delivers sub-millisecond CPU inference (**< 0.25 ms per query**).
|
|
|
|
| 175 |
|
| 176 |
---
|
| 177 |
|
| 178 |
+
### 3. Node.js Native Inference (onnxruntime-node)
|
| 179 |
|
| 180 |
```javascript
|
| 181 |
+
import { CompactNameClassifier } from './scripts/classifier.mjs';
|
| 182 |
+
|
| 183 |
+
const classifier = new CompactNameClassifier();
|
| 184 |
+
await classifier.init();
|
| 185 |
+
|
| 186 |
+
const result = await classifier.predict('Sayantika Biswas');
|
| 187 |
+
console.log(result);
|
| 188 |
+
// {
|
| 189 |
+
// text: 'Sayantika Biswas',
|
| 190 |
+
// classification: 'REAL_NAME',
|
| 191 |
+
// confidence: 0.998,
|
| 192 |
+
// raw_probs: { non_name: 0.002, real_name: 0.998 }
|
| 193 |
+
// }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 194 |
```
|
| 195 |
|
| 196 |
---
|
|
|
|
| 199 |
|
| 200 |
```python
|
| 201 |
import torch
|
| 202 |
+
from scripts.model import CompactNameClassifier
|
| 203 |
|
| 204 |
model = CompactNameClassifier(
|
| 205 |
vocab_size=4000,
|
|
|
|
| 210 |
max_len=20,
|
| 211 |
dropout=0.0
|
| 212 |
)
|
| 213 |
+
model.load_state_dict(torch.load("models/model_weights.pt", weights_only=True))
|
| 214 |
model.eval()
|
| 215 |
```
|
| 216 |
|
config.json
CHANGED
|
@@ -1,26 +1,26 @@
|
|
| 1 |
-
{
|
| 2 |
-
"model_type": "CompactNameClassifier",
|
| 3 |
-
"architectures": [
|
| 4 |
-
"CompactNameClassifier"
|
| 5 |
-
],
|
| 6 |
-
"vocab_size": 4000,
|
| 7 |
-
"emb_dim": 64,
|
| 8 |
-
"hidden_dim": 128,
|
| 9 |
-
"num_layers": 2,
|
| 10 |
-
"num_heads": 4,
|
| 11 |
-
"dim_feedforward": 256,
|
| 12 |
-
"max_length": 20,
|
| 13 |
-
"dropout": 0.1,
|
| 14 |
-
"id2label": {
|
| 15 |
-
"0": "NON_NAME",
|
| 16 |
-
"1": "REAL_NAME"
|
| 17 |
-
},
|
| 18 |
-
"label2id": {
|
| 19 |
-
"NON_NAME": 0,
|
| 20 |
-
"REAL_NAME": 1
|
| 21 |
-
},
|
| 22 |
-
"metrics": {
|
| 23 |
-
"best_val_accuracy": 0.9547553093259464,
|
| 24 |
-
"best_val_f1": 0.9586647384912027
|
| 25 |
-
}
|
| 26 |
-
}
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"model_type": "CompactNameClassifier",
|
| 3 |
+
"architectures": [
|
| 4 |
+
"CompactNameClassifier"
|
| 5 |
+
],
|
| 6 |
+
"vocab_size": 4000,
|
| 7 |
+
"emb_dim": 64,
|
| 8 |
+
"hidden_dim": 128,
|
| 9 |
+
"num_layers": 2,
|
| 10 |
+
"num_heads": 4,
|
| 11 |
+
"dim_feedforward": 256,
|
| 12 |
+
"max_length": 20,
|
| 13 |
+
"dropout": 0.1,
|
| 14 |
+
"id2label": {
|
| 15 |
+
"0": "NON_NAME",
|
| 16 |
+
"1": "REAL_NAME"
|
| 17 |
+
},
|
| 18 |
+
"label2id": {
|
| 19 |
+
"NON_NAME": 0,
|
| 20 |
+
"REAL_NAME": 1
|
| 21 |
+
},
|
| 22 |
+
"metrics": {
|
| 23 |
+
"best_val_accuracy": 0.9547553093259464,
|
| 24 |
+
"best_val_f1": 0.9586647384912027
|
| 25 |
+
}
|
| 26 |
+
}
|
predict.py
CHANGED
|
@@ -10,20 +10,12 @@ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
|
| 10 |
from model import CompactNameClassifier
|
| 11 |
|
| 12 |
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
WEIGHTS_PATH = os.path.join(SCRIPT_DIR, "model_weights.pt")
|
| 20 |
-
else:
|
| 21 |
-
PROJECT_ROOT = os.path.abspath(os.path.join(SCRIPT_DIR, ".."))
|
| 22 |
-
MODELS_DIR = os.path.join(PROJECT_ROOT, "models")
|
| 23 |
-
CONFIG_PATH = os.path.join(PROJECT_ROOT, "config", "model_config.json")
|
| 24 |
-
TOKENIZER_DIR = os.path.join(MODELS_DIR, "tokenizer")
|
| 25 |
-
ONNX_PATH = os.path.join(MODELS_DIR, "model_int8.onnx")
|
| 26 |
-
WEIGHTS_PATH = os.path.join(MODELS_DIR, "model_weights.pt")
|
| 27 |
|
| 28 |
class NameClassifier:
|
| 29 |
"""
|
|
|
|
| 10 |
from model import CompactNameClassifier
|
| 11 |
|
| 12 |
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
|
| 13 |
+
PROJECT_ROOT = os.path.abspath(os.path.join(SCRIPT_DIR, ".."))
|
| 14 |
+
MODELS_DIR = os.path.join(PROJECT_ROOT, "models")
|
| 15 |
+
CONFIG_PATH = os.path.join(PROJECT_ROOT, "config", "model_config.json")
|
| 16 |
+
TOKENIZER_DIR = os.path.join(MODELS_DIR, "tokenizer")
|
| 17 |
+
ONNX_PATH = os.path.join(MODELS_DIR, "model_int8.onnx")
|
| 18 |
+
WEIGHTS_PATH = os.path.join(MODELS_DIR, "model_weights.pt")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
|
| 20 |
class NameClassifier:
|
| 21 |
"""
|