File size: 2,450 Bytes
0a46c43
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
---
language:
  - en
  - vi
tags:
  - translation
  - opus-mt
  - marian
  - novel
  - literature
license: apache-2.0
datasets:
  - custom-novel-parallel-corpus
metrics:
  - bleu
  - chrf
model-index:
  - name: opus-mt-en-vi-novel-finetuned
    results:
      - task:
          type: translation
          name: EN to VI Novel Translation
        dataset:
          name: Custom novel EN-VI parallel validation set (17,272 samples)
          type: novel-literature
        metrics:
          - type: bleu
            value: 29.29
            name: BLEU
          - type: chrf
            value: 49.13
            name: ChrF++
---

# opus-mt-en-vi-novel-finetuned

Fine-tuned English → Vietnamese translation model optimized for **novels, literature, and narrative text**.

Fine-tuned from `Helsinki-NLP/opus-mt-en-vi` (MarianMT) for 1 epoch on ~328K parallel EN-VI novel sentence pairs.

## Results Summary

### Full Validation Set (17,272 samples)

| Model | BLEU | ChrF++ |
|-------|------|--------|
| **Fine-tuned** | **29.29** | **49.13** |
| Baseline (Helsinki-NLP/opus-mt-en-vi) | 3.73 | 20.87 |

### Improvement over baseline

- **BLEU:** 8.2x (3.53 → 29.01 on sanity set)
- **ChrF++:** 2.4x (20.50 → 49.07 on sanity set)

## Usage

```python
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer

model = AutoModelForSeq2SeqLM.from_pretrained("richardadam/opus-mt-en-vi-novel-finetuned")
tokenizer = AutoTokenizer.from_pretrained("richardadam/opus-mt-en-vi-novel-finetuned")

text = "He looked at the door but did not dare to open it."
inputs = tokenizer(text, return_tensors="pt")
outputs = model.generate(**inputs, max_new_tokens=256, num_beams=4)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
# Hắn nhìn cánh cửa, nhưng không dám mở ra.
```

## Training

- **Base:** Helsinki-NLP/opus-mt-en-vi
- **Epochs:** 1
- **Batch size:** 16
- **GPU:** NVIDIA L4 (22.5 GB)
- **Runtime:** ~3h15m

## Limitations

- Single-epoch fine-tune — may benefit from more training
- Novel domain only — may underperform on technical/formal text
- Baseline model performs very poorly on novels (BLEU 3.53), confirming domain-specific fine-tuning is essential

## Citation

```bibtex
@misc{opus-mt-en-vi-novel-finetuned,
  author = {richardadam},
  title = {opus-mt-en-vi-novel-finetuned},
  year = 2026,
  publisher = {Hugging Face},
  howpublished = {huggingface.co/richardadam/opus-mt-en-vi-novel-finetuned},
}
```