A project story / Low-resource NLP

Building SamLingo: A Small Step for a Language Close to Home

How an idea became an English-to-Sambalpuri translation experiment—and what I learned from the data, the setbacks, and the people who helped.

In 2024, I kept thinking about a problem that felt both ordinary and surprisingly difficult: people use their local languages every day, but the digital tools available to them do not always make that easy. Sambalpuri is a language close to home for me. I wanted to explore whether I could build a tool that translates English into Sambalpuri, written in Odia script.

I didn’t have a polished plan or a large research lab. I had a question, curiosity, and a lot to learn. That question eventually became SamLingo.

The journeyFrom a question to an experimentMilestones from my project notes
  1. 2024The questionCould digital tools better support a language close to home?
  2. 2025Starting smallLearning the basics, collecting examples, then pausing for other commitments.
  3. 2026Returning togetherShivangi helped collect data while I continued the research.
  4. Oct 2026V2 experimentContinue training from V1 and compare the checkpoints.

Starting with what I had

In June 2025, I decided to begin. I didn’t have a GPU or the resources to start with a large training run, so I went back to the basics: learning how translation models work and gathering examples. Over about a month, I collected around 6,000 data examples. Each one was a small piece of a much bigger puzzle.

Working with a low-resource language changes the shape of the problem. Before a model can learn a useful translation, someone has to find or create examples, align the languages, and think carefully about spelling, meaning, and grammar. The dataset isn’t just preparation for the project. It is a major part of the project.

The pause nobody puts in a graph

From June to November 2025, other commitments pulled my attention away, and the project largely paused. I still cared about the idea, but I couldn’t give it the time it needed. Coming back to a project after a gap can feel like starting again: you have to recover the context as well as the momentum.

That pause is part of the story too. The path from an idea to a result was not a straight line.

Shivangi made the work possible to take further

In 2026, my friend Shivangi Dwivedi helped with dataset collection while I focused on the research and model work. She collected around 20,000 examples for the broader effort. What makes that contribution especially meaningful to me is that she is not a native Sambalpuri speaker, yet she put care into collecting high-quality data for a language she wanted to help support.

That collection and the specific V2 training update are different things. The V2 experiment documented in the report uses a 6,400-record update; I cannot claim that all 20,000 collected examples were used in that run. I’m grateful to Shivangi for the work that helped move the project forward. You can find her on LinkedIn.

From a first model to a better question

After two to three months of research, I returned to the saved first version of the model. Rather than start over, I used it as the foundation for V2. The question was simple: could better examples, corrections to existing data, and additional sentence and word coverage help the model produce better translations?

The update combined 3,000 revised V1 examples, including grammar and other fixes, with 2,800 new sentence pairs and 600 dictionary entries. After cleaning and deduplication, the documented run used 5,994 records for training and 331 for validation. These numbers describe this update, not the total unique data the model has ever seen.

What went into the V2 update6,400 raw records · corrected and new examples
  • 3,000 revised examples
  • 2,800 new sentences
  • 600 dictionary entries
How the experiment worksFrom examples to translationA simplified view of the documented V2 workflow
  1. 01Build & correctRevise older pairs and add sentences and words.
  2. 02Clean & splitNormalize, deduplicate, and separate validation sources.
  3. 03Continue trainingFine-tune the saved V1 checkpoint on the update.
  4. 04Compare & inspectEvaluate V1 and V2 and examine remaining errors.

English input → NLLB-200-based model → Sambalpuri output in Odia script. The target uses the Odia language token.

The October training run

In October 2026, I continued fine-tuning the saved V1 checkpoint in an NLLB-200-based sequence-to-sequence setup. The model takes English as input and produces Sambalpuri in Odia script. The setup routes the target through the Odia language token; it does not introduce a separate Sambalpuri token.

The recorded run used one A100 GPU for five epochs. I selected the checkpoint with the lowest validation loss. There’s a lot of detail behind those few sentences—token limits, cleaning decisions, checkpoints, and decoding settings—and I’ve included them in the technical report for anyone who wants to examine the experiment.

The number that made me stop and look

On the final author-corrected comparison of 149 reference pairs, the reported BLEU score moved from 6.78 for V1 to 33.54 for V2. Seeing that change was encouraging after such a long journey. It suggested that the combined update helped on this particular comparison.

Reported BLEU on the final benchmark149 reference pairs · higher indicates greater overlap

Author-corrected benchmark. BLEU measures overlap with reference translations; it is not percentage accuracy. Test-set independence is unverified.

There is an important boundary around that result. The final test set has not been independently verified as unseen to both models, and the examples are short. The experiment also changed several parts of the data together, so I can’t say how much of the gain came from grammar corrections versus new sentences or dictionary entries. A separate 331-record development evaluation also favored V2, but that set was used for checkpoint selection.

What the model still gets wrong

A stronger score does not mean every translation is right. In one reported example, V2 named onion when the input was “papaya.” That kind of mistake matters: a sentence can look plausible while getting an essential word wrong. In other selected examples, V2 matched the reference where V1 did not. These are useful clues, not a substitute for a blinded evaluation by bilingual speakers.

Next, I want to audit and lock an independent test set, compare the different parts of the data update separately, and evaluate longer passages with human review. I also want to make the experiment easier to reproduce by publishing more of the evaluation and checkpoint details.

Why I’m sharing this

SamLingo started with a question about making a local language more accessible in digital spaces. The result so far is an experiment, not a finished solution. But it has shown me how much language technology depends on people willing to do the patient work: collecting examples, correcting them, testing assumptions, and looking honestly at mistakes.

I’m thankful to Shivangi for her contribution to data collection, and I’m excited to keep learning from people who know the language and care about its future.