google/muril-base-cased as the base encoder.| Rank | Model | Gap | Params |
|---|---|---|---|
| 🥇 | nepali-embedder-v1 (this model) | 0.4277 | 238M |
| 🥈 | jangedoo/all-MiniLM-L6-v2-nepali | 0.3382 | 66M |
| 🥉 | universalml/Nepali_Embedding_Model | 0.2784 | 560M |
| 4 | Yunika/sentence-transformer-nepali | 0.2581 | 238M |
| 5 | qwen3-embedding:0.6b | 0.2186 | 600M |
| 6 | bge-m3 | 0.2092 | 567M |
| 7 | embeddinggemma | 0.1924 | 300M |
| 8 | nomic-embed-text-v2-moe | 0.1834 | MoE |
| 9 | paraphrase-multilingual | 0.1779 | 278M |
| 10 | snowflake-arctic-embed2 | 0.1509 | 568M |
| 11 | granite-embedding:278m | 0.1437 | 278M |
| 12 | mxbai-embed-large | 0.0560 | 335M |
| Category | nepali-v1 | bge-m3 | qwen3-0.6b | Yunika | universalml |
|---|---|---|---|---|---|
| Code-Switching (Roman↔Devanagari) | 0.490 | 0.101 | 0.333 | 0.263 | 0.289 |
| Entity Sensitivity | 0.605 | 0.240 | 0.275 | 0.256 | 0.239 |
| Length Robustness | 0.674 | 0.136 | 0.239 | 0.313 | 0.260 |
| Negation | -0.083 | -0.022 | -0.190 | -0.159 | -0.093 |
Key findings: This model is the only one that correctly handles Romanized Nepali ↔ Devanagari code-switching with a positive delta of 0.490 — all other models score below 0.35 on this task. Entity discrimination (0.605) and long-document robustness (0.674) are both best-in-class across all 12 models tested. Negation is a known limitation shared across all Nepali and multilingual embedding models.
1from sentence_transformers import SentenceTransformer
2
3model = SentenceTransformer("premmm/nepali-embedder-v1")
4
5# Single sentence
6embedding = model.encode("नेपालको राजधानी काठमाडौं हो।", normalize_embeddings=True)
7
8# Semantic similarity
9sentences = [
10 "नेपालको राजधानी काठमाडौं हो।",
11 "काठमाडौं नेपालको सबैभन्दा ठूलो शहर हो।",
12]
13embeddings = model.encode(sentences, normalize_embeddings=True)
14
15# Retrieval (query vs passages)
16from sentence_transformers import util
17
18query = "नेपालको राजधानी कहाँ छ?"
19passages = [
20 "काठमाडौं नेपालको राजधानी तथा सबैभन्दा ठूलो शहर हो।",
21 "पोखरा नेपालको दोस्रो ठूलो शहर हो।",
22 "लुम्बिनी गौतम बुद्धको जन्मस्थल हो।",
23]
24
25q_emb = model.encode(query, normalize_embeddings=True)
26p_emb = model.encode(passages, normalize_embeddings=True)
27scores = util.cos_sim(q_emb, p_emb)
28print(scores) # tensor([[0.7139, 0.4821, 0.3102]])1from langchain_huggingface import HuggingFaceEmbeddings
2
3embeddings = HuggingFaceEmbeddings(
4 model_name="premmm/nepali-embedder-v1",
5 encode_kwargs={"normalize_embeddings": True}
6)sentence-transformers documentation for ONNX export if needed for production inference.| Property | Value |
|---|---|
| Base model | google/muril-base-cased |
| Architecture | BERT (transformer encoder + mean pooling) |
| Parameters | 238M |
| Embedding dimension | 768 |
| Max sequence length | 256 tokens |
| Language | Nepali (ne) |
| License | Apache 2.0 |
wikimedia/wikipedia (config: 20231101.ne)MultipleNegativesRankingLoss (in-batch negatives)InformationRetrievalEvaluator:| Metric | Final Value |
|---|---|
| NDCG@10 | 0.9621 |
| MRR@10 | 0.9520 |
| Accuracy@1 | 0.9270 |
| Recall@10 | 0.9929 |
| Version | Planned Additions |
|---|---|
| v2 | Romanized Nepali ↔ Devanagari training pairs (code-switching) |
| v2 | Negation-aware hard negative pairs |
| v2 | Synthetic query augmentation (~2k LLM-generated triplets) |
| v2 | Legal domain fine-tuning (10k Nepali court ruling pairs) |
| v3 | Hard negative mining using v2 model |
| v3 | MatryoshkaLoss for variable-dimension embeddings |
1@misc{pathak2026nepaliembedder,
2 author = {Premanand Pathak},
3 title = {nepali-embedder-v1: A Native Nepali Sentence Embedding Model},
4 year = {2026},
5 publisher = {HuggingFace},
6 howpublished = {\url{https://huggingface.co/premmm/nepali-embedder-v1}},
7}