Aranda-v1 / README.md
rekabytes's picture
Upload README.md with huggingface_hub
75c6892 verified
|
Raw
History Blame Contribute Delete
4.9 kB
---
language:
- en
- ms
tags:
- sentence-transformers
- embedding
- retrieval
- rag
- malaysian
- manglish
- multilingual
license: mit
model_type: sentence-transformers
base_model: paraphrase-multilingual-mpnet-base-v2
---
# Aranda-v1
Aranda-v1 is a sentence embedding model specialized for **Malaysian text retrieval**, including Bahasa Malaysia, Manglish (Malaysian English code-switching), and cross-lingual BM↔English matching. It outperforms all tested baselines on overall retrieval Recall@1, Recall@5, Recall@10, and MRR, and is the best model on every individual language category (BM, Manglish, English, Cross-lingual).
## Training
Two-phase contrastive curriculum:
**Phase 1 — Breadth:** MultipleNegativesRankingLoss on 1M Malaysian positive pairs (paraphrases, social media, news, QA). LR=1e-5, 1000 steps.
**Phase 2 — Discrimination:** Fine-tuned on 58K diverse hard-negative triplets (Lowyat, Twitter, Facebook, formal BM QA, English anchors, cross-lingual pairs) with explicit mined hard negatives. LR=2e-6, 2000 steps.
Base model: `paraphrase-multilingual-mpnet-base-v2`
## Evaluation
Tested on 4,149 retrieval queries (BM, Manglish, English, Cross-lingual) with ~25 candidates per query, plus 4 additional eval sets (heuristic similarity, mined holdout, Mesolitica reranker, English STS).
### Overall Retrieval (4,149 queries)
| Model | Recall@1 | Recall@5 | Recall@10 | MRR | Precision@10 |
|---|---:|---:|---:|---:|---:|
| mpnet-base | 0.8631 | 0.9937 | 0.9973 | 0.9200 | 0.1785 |
| multilingual-e5-base | 0.8470 | 0.9940 | **0.9988** | 0.9091 | 0.1792 |
| labse | 0.8009 | 0.9882 | 0.9986 | 0.8821 | 0.1780 |
| distilbert-multilingual-quora | 0.7973 | 0.9636 | 0.9858 | 0.8719 | 0.1728 |
| **Aranda-v1** | **0.8891** | **0.9961** | **0.9998** | **0.9364** | **0.1788** |
### Per-Language Recall@1
| Model | BM | Manglish | English | Cross-lingual |
|---|---:|---:|---:|---:|
| mpnet-base | 0.8200 | 0.8988 | 0.8577 | 0.8267 |
| multilingual-e5-base | 0.7938 | 0.9104 | 0.8658 | 0.6167 |
| labse | 0.7354 | 0.8993 | 0.6872 | 0.7300 |
| distilbert-multilingual-quora | 0.7584 | 0.8320 | 0.7866 | 0.7633 |
| **Aranda-v1** | **0.8431** | **0.9290** | **0.8792** | **0.8500** |
### Heuristic Similarity 2K (per-language Spearman)
| Model | Overall | BM | Manglish |
|---|---:|---:|---:|
| mpnet-base | **0.4799** | **0.5535** | 0.3937 |
| multilingual-e5-base | 0.3582 | 0.2714 | 0.4680 |
| labse | 0.3249 | 0.2866 | 0.4397 |
| distilbert-multilingual-quora | 0.4585 | 0.4857 | 0.4682 |
| Aranda-v1 | 0.4532 | 0.4915 | **0.4536** |
### Mined Holdout 2K (positive vs negative margins)
| Model | pos>neg % | mean margin | mean pos sim | mean neg sim |
|---|---:|---:|---:|---:|
| mpnet-base | 98.1% | **0.4880** | 0.6576 | **0.1696** |
| multilingual-e5-base | 98.15% | 0.1129 | **0.8805** | 0.7676 |
| labse | **98.3%** | 0.4193 | 0.5960 | 0.1768 |
| distilbert-multilingual-quora | 94.6% | 0.1041 | 0.9336 | 0.8295 |
| Aranda-v1 | 98.2% | 0.4318 | 0.7334 | 0.3016 |
### Mesolitica Reranker Test (NDCG@10)
| Model | Overall NDCG@10 |
|---|---:|
| mpnet-base | 0.4699 |
| multilingual-e5-base | 0.4705 |
| labse | 0.4695 |
| distilbert-multilingual-quora | 0.4690 |
| **Aranda-v1** | **0.4706** |
### English STS (mteb/stsbenchmark-sts)
| Model | Spearman |
|---|---:|
| mpnet-base | **0.8682** |
| multilingual-e5-base | 0.8420 |
| labse | 0.7225 |
| distilbert-multilingual-quora | 0.7866 |
| Aranda-v1 | 0.8369 |
## Usage
```python
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("rekabytes/Aranda-v1")
# Encode texts
embeddings = model.encode([
"macam mana nak renew lesen memandu",
"how to renew driving license",
"saya nak makan nasi lemak"
], normalize_embeddings=True)
# Cosine similarity
similarities = embeddings @ embeddings.T
print(similarities)
```
### With RAG / vector search
```python
# Encode your document corpus (do this once)
doc_embeddings = model.encode(documents, normalize_embeddings=True)
# At query time
query_embedding = model.encode([query], normalize_embeddings=True)
scores = query_embedding @ doc_embeddings.T
top_k = scores.argsort()[0][-5:][::-1]
```
## Intended Use
- **RAG context retrieval** for Malaysian applications
- **Semantic search** over BM/Manglish/English document corpora
- **Cross-lingual matching** (BM ↔ English)
- **Dense retrieval** in hybrid search pipelines (paired with BM25)
## Limitations
- English STS performance is below the base mpnet model (0.8369 vs 0.8682) — the model specialized for Malaysian text
- Not a reranker — use a cross-encoder for second-stage reranking
- Tested on Malaysian web data; performance may vary on other Southeast Asian languages
## Model Details
- **Architecture:** XLM-RoBERTa (base)
- **Embedding dimension:** 768
- **Max sequence length:** 128
- **Pooling:** Mean
- **Normalization:** L2