khmer-tag-recommendation_xlmr

This model is a fine-tuned version of xlm-roberta-base for automatic tag recommendation on Khmer-language documents. Given the text of a Khmer document, it predicts a set of relevant tags from a fixed vocabulary of 500 tags, using multi-label classification.

It achieves the following results on the evaluation set:

  • eval_loss: 0.0074
  • eval_f1_micro: 0.9404
  • eval_f1_macro: 0.9518
  • eval_precision_micro: 0.8877
  • eval_recall_micro: 0.9998
  • eval_hamming_loss: 0.0018
  • eval_runtime: 400.6343
  • eval_samples_per_second: 96.337
  • eval_steps_per_second: 1.508
  • epoch: 1.4509
  • step: 14000

Model description

khmer-tag-recommendation_xlmr is a multi-label sequence classification model built on top of xlm-roberta-base, with a classification head sized to a 500-tag vocabulary (problem_type="multi_label_classification"). Given raw Khmer document text, the model outputs a probability for each of the 500 tags, indicating how likely that tag applies to the document.

The tag vocabulary was built by taking the 500 most frequent tags (each appearing at least 5 times) from the training dataset, since the raw tag space in the source dataset is effectively unbounded (many tags are near-unique per document).

Because the tags follow a long-tail distribution, the model was trained with a weighted binary cross-entropy loss (pos_weight capped at 20x) to avoid ignoring rarer tags, and per-tag decision thresholds were tuned on a held-out validation set (see thresholds.npy in this repo) rather than using a flat 0.5 cutoff for every tag.

Intended uses & limitations

Intended use: recommending tags for Khmer-language documents β€” e.g. government letters, certificates, mission reports, articles, and similar administrative or informational text β€” to assist with document organization, search, and categorization.

Limitations:

  • The tag vocabulary is fixed to the 500 most frequent tags seen during training. The model cannot predict tags outside this vocabulary.
  • Training data leans toward Khmer government/administrative document styles (certificates, mission letters, official reports). Performance on stylistically different content (news articles, blog posts, product descriptions, etc.) has not been rigorously validated and may vary.
  • Per-tag thresholds were tuned using an unconstrained per-tag F1 search; tags with very low positive support in the validation set may have less reliable tuned thresholds. Use thresholds.npy together with judgment, and consider min_tags/max_tags bounds at inference time rather than trusting the threshold in isolation for every tag.
  • This is a general-purpose classifier, not tuned or evaluated for high-stakes or safety-critical decisions.

Training and evaluation data

  • Dataset: phonsobon/khmer_tag_recommendations β€” Khmer-language documents, each with 5–12 associated tags.
  • Tag vocabulary: top 500 most frequent tags (minimum count of 5), extracted from the training split.
  • Split: 80% train / 10% validation / 10% test, random split (seed 42).
  • Labels: multi-label binary vectors over the 500-tag vocabulary, built with sklearn.preprocessing.MultiLabelBinarizer.

Training procedure

Training hyperparameters

The following hyperparameters were used during training:

  • learning_rate: 2e-05
  • train_batch_size: 32
  • eval_batch_size: 64
  • seed: 42
  • optimizer: Use OptimizerNames.ADAMW_TORCH_FUSED with betas=(0.9,0.999) and epsilon=1e-08 and optimizer_args=No additional optimizer arguments
  • lr_scheduler_type: linear
  • lr_scheduler_warmup_steps: 0.06
  • num_epochs: 5
  • mixed_precision_training: Native AMP

Framework versions

  • Transformers 5.13.1
  • Pytorch 2.10.0+cu128
  • Datasets 5.0.0
  • Tokenizers 0.22.2

How to use

This repo includes the fine-tuned model, tokenizer, the 500-tag vocabulary (tag_vocab.json), and the per-tag tuned decision thresholds (thresholds.npy). The example below loads all of these from the Hub and runs adaptive tag recommendation (always returns between MIN_TAGS and MAX_TAGS tags, ranked by confidence).

import json
import numpy as np
import torch
from huggingface_hub import hf_hub_download
from transformers import AutoTokenizer, AutoModelForSequenceClassification

# ---- Config ----
HUB_MODEL_ID = "phonsobon/khmer-tag-recommendation_xlmr"
MAX_LENGTH = 256
MIN_TAGS = 4
MAX_TAGS = 12

device = "cuda" if torch.cuda.is_available() else "cpu"

# ---- Load model + tokenizer from the Hub ----
tokenizer = AutoTokenizer.from_pretrained(HUB_MODEL_ID)
model = AutoModelForSequenceClassification.from_pretrained(HUB_MODEL_ID).to(device)
model.eval()

# ---- Load tag vocab + tuned thresholds pushed alongside the model ----
tag_vocab_path = hf_hub_download(repo_id=HUB_MODEL_ID, filename="tag_vocab.json")
thresholds_path = hf_hub_download(repo_id=HUB_MODEL_ID, filename="thresholds.npy")

with open(tag_vocab_path, "r", encoding="utf-8") as f:
    tag_vocab = json.load(f)
thresholds = np.load(thresholds_path)

print(f"Loaded model with {len(tag_vocab)} tags.")

# ---- Inference function (adaptive tag count) ----
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def recommend_tags_adaptive(text, min_tags=MIN_TAGS, max_tags=MAX_TAGS, use_tuned_thresholds=True):
    enc = tokenizer(
        text, truncation=True, padding="max_length", max_length=MAX_LENGTH, return_tensors="pt"
    ).to(device)
    with torch.no_grad():
        logits = model(**enc).logits.cpu().numpy()[0]
    probs = sigmoid(logits)

    thr = thresholds if use_tuned_thresholds else 0.5
    above_threshold = np.where(probs >= thr)[0]

    # rank everything above threshold by confidence
    ranked = sorted(above_threshold.tolist(), key=lambda i: probs[i], reverse=True)

    if len(ranked) < min_tags:
        # not enough passed the threshold -> fill up to min_tags with next-best overall
        all_ranked = np.argsort(probs)[::-1]
        for i in all_ranked:
            i = int(i)
            if i not in ranked:
                ranked.append(i)
            if len(ranked) >= min_tags:
                break
    elif len(ranked) > max_tags:
        # too many passed the threshold -> cut to the top max_tags
        ranked = ranked[:max_tags]

    return [(tag_vocab[i], float(probs[i])) for i in ranked]

# ---- Just paste your Khmer content here and run ----
content = """
αž–αŸ’αžšαŸ‡αžšαžΆαž‡αžΆαžŽαžΆαž…αž€αŸ’αžšαž€αž˜αŸ’αž–αž»αž‡αžΆ
αž‡αžΆαžαž· αžŸαžΆαžŸαž“αžΆ αž–αŸ’αžšαŸ‡αž˜αž αžΆαž€αŸ’αžŸαžαŸ’αžš

αž€αŸ’αžšαžŸαž½αž„αž”αŸ’αžšαŸƒαžŸαžŽαžΈαž™αŸ αž“αž·αž„αž‘αžΌαžšαž‚αž˜αž“αžΆαž‚αž˜αž“αŸ
αž€αŸ’αžšαž»αž˜αž€αžΆαžšαž„αžΆαžšαž”αžšαž·αžœαžαŸ’αžαž€αž˜αŸ’αž˜αžŒαžΈαž‡αžΈαžαž›

αž›αŸαžαŸˆ ០៑៨្ៀ αž”αž‘/αžšαž”

αžšαžΆαž‡αž’αžΆαž“αžΈαž—αŸ’αž“αŸ†αž–αŸαž‰ αžαŸ’αž„αŸƒαž‘αžΈαŸ’αŸ₯ αžαŸ‚αžŸαžΈαž αžΆ αž†αŸ’αž“αžΆαŸ†αŸ’αŸ αŸ’αŸ§

# αžšαž”αžΆαž™αž€αžΆαžšαžŽαŸαž”αŸαžŸαž€αž€αž˜αŸ’αž˜

**αž€αž˜αŸ’αž˜αžœαžαŸ’αžαž»αŸ–** αžšαž”αžΆαž™αž€αžΆαžšαžŽαŸαžŸαŸ’αžαžΈαž–αžΈαž€αžΆαžšαž”αŸ†αž–αŸαž‰αž”αŸαžŸαž€αž€αž˜αŸ’αž˜αž…αžΌαž›αžšαž½αž˜αžŸαž“αŸ’αž“αž·αžŸαžΈαž‘αž’αž“αŸ’αžαžšαž‡αžΆαžαž·αžŸαŸ’αžαžΈαž–αžΈαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αžšαž·αžœαžαŸ’αžαž€αž˜αŸ’αž˜αžŒαžΈαž‡αžΈαžαž› αž“αž·αž„αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαžΆαž’αžΆαžšαžŽαŸˆ αž“αŸ…αžŸαžΆαž’αžΆαžšαžŽαžšαžŠαŸ’αž‹αžŸαž·αž„αŸ’αž αž”αž»αžšαžΈ

**αž™αŸ„αž„αŸ–**

* αž›αž·αžαž·αžαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž”αŸ†αž–αŸαž‰αž”αŸαžŸαž€αž€αž˜αŸ’αž˜αž›αŸαžαŸˆ ០៑៧αŸ₯៦ αž”αž‘/αž’αž” αž…αž»αŸ‡αžαŸ’αž„αŸƒαž‘αžΈαŸ αŸ₯ αžαŸ‚αžŸαžΈαž αžΆ αž†αŸ’αž“αžΆαŸ†αŸ’αŸ αŸ’αŸ§
* αž›αž·αžαž·αžαž’αž‰αŸ’αž‡αžΎαž‰αž–αžΈαž‚αžŽαŸˆαž€αž˜αŸ’αž˜αžΆαž’αž·αž€αžΆαžšαžšαŸ€αž”αž…αŸ†αžŸαž“αŸ’αž“αž·αžŸαžΈαž‘ Smart Government Summit 2027
* αž•αŸ‚αž“αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž”αžšαž·αžœαžαŸ’αžαž€αž˜αŸ’αž˜αžŒαžΈαž‡αžΈαžαž› αž†αŸ’αž“αžΆαŸ†αŸ’αŸ αŸ’αŸ§β€“αŸ’αŸ αŸ£αŸ‘

**αž‡αžΌαž“**

αž―αž€αž§αžαŸ’αžαž˜ αž”αŸ’αžšαž’αžΆαž“αž€αŸ’αžšαž»αž˜αž€αžΆαžšαž„αžΆαžšαž”αžšαž·αžœαžαŸ’αžαž€αž˜αŸ’αž˜αžŒαžΈαž‡αžΈαžαž›

## ៑. αžŸαŸαž…αž€αŸ’αžαžΈαž•αŸ’αžαžΎαž˜

αž’αž“αž»αžœαžαŸ’αžαžαžΆαž˜αž›αž·αžαž·αžαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž”αŸ†αž–αŸαž‰αž”αŸαžŸαž€αž€αž˜αŸ’αž˜αžαžΆαž„αž›αžΎ αžαŸ’αž‰αž»αŸ†αž”αžΆαž‘ **αž•αž»αž“ αžŸαž»αž”αž»αžŽαŸ’αž™** αž”αŸ’αžšαž’αžΆαž“αž€αŸ’αžšαž»αž˜αž€αžΆαžšαž„αžΆαžšαž”αž‰αŸ’αž‰αžΆαžŸαž·αž”αŸ’αž”αž“αž·αž˜αŸ’αž˜αž·αž αž“αŸƒαž€αŸ’αžšαž»αž˜αž€αžΆαžšαž„αžΆαžšαž”αžšαž·αžœαžαŸ’αžαž€αž˜αŸ’αž˜αžŒαžΈαž‡αžΈαžαž› αž”αžΆαž“αž…αžΌαž›αžšαž½αž˜αžŸαž“αŸ’αž“αž·αžŸαžΈαž‘αž’αž“αŸ’αžαžšαž‡αžΆαžαž·αžŸαŸ’αžαžΈαž–αžΈ **αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αžšαž·αžœαžαŸ’αžαž€αž˜αŸ’αž˜αžŒαžΈαž‡αžΈαžαž› αž“αž·αž„αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαžΆαž’αžΆαžšαžŽαŸˆ** αžŠαŸ‚αž›αž”αžΆαž“αžšαŸ€αž”αž…αŸ†αž‘αžΎαž„αž“αŸ…αž”αŸ’αžšαž‘αŸαžŸαžŸαž·αž„αŸ’αž αž”αž»αžšαžΈ αžŠαŸ„αž™αž˜αžΆαž“αž€αžΆαžšαž…αžΌαž›αžšαž½αž˜αž–αžΈαž˜αž“αŸ’αžαŸ’αžšαžΈαžšαžŠαŸ’αž‹ αž’αŸ’αž“αž€αžŸαŸ’αžšαžΆαžœαž‡αŸ’αžšαžΆαžœ αž“αž·αž„αž’αŸ’αž“αž€αž‡αŸ†αž“αžΆαž‰αž•αŸ’αž“αŸ‚αž€αž”αž…αŸ’αž…αŸαž€αžœαž·αž‘αŸ’αž™αžΆαž˜αž€αž–αžΈαž”αžŽαŸ’αžαžΆαž”αŸ’αžšαž‘αŸαžŸαž‡αžΆαž…αŸ’αžšαžΎαž“αŸ”

## ្. αž–αŸαžαŸŒαž˜αžΆαž“αž’αŸ†αž–αžΈαž”αŸαžŸαž€αž€αž˜αŸ’αž˜

* αž‘αžΈαž€αž“αŸ’αž›αŸ‚αž„αŸ– αžŸαž·αž„αŸ’αž αž”αž»αžšαžΈ
* αž€αžΆαž›αž”αžšαž·αž…αŸ’αž†αŸαž‘αŸ– αžαŸ’αž„αŸƒαž‘αžΈαŸ‘αŸ₯ αžŠαž›αŸ‹αžαŸ’αž„αŸƒαž‘αžΈαŸ’αŸ  αžαŸ‚αžŸαžΈαž αžΆ αž†αŸ’αž“αžΆαŸ†αŸ’αŸ αŸ’αŸ§
* αžšαž™αŸˆαž–αŸαž›αŸ– αŸ¦αžαŸ’αž„αŸƒ
* αž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜αŸ– αžαŸ†αžŽαžΆαž„αž€αŸ’αžšαžŸαž½αž„αž”αŸ’αžšαŸƒαžŸαžŽαžΈαž™αŸ αž“αž·αž„αž‘αžΌαžšαž‚αž˜αž“αžΆαž‚αž˜αž“αŸ

## ៣. αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αžŠαŸ‚αž›αž”αžΆαž“αž’αž“αž»αžœαžαŸ’αž

αž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž›αž”αŸαžŸαž€αž€αž˜αŸ’αž˜ αž”αžΆαž“αž…αžΌαž›αžšαž½αž˜αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

* αž…αžΌαž›αžšαž½αž˜αžŸαž“αŸ’αž“αž·αžŸαžΈαž‘αžŸαŸ’αžαžΈαž–αžΈαž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšαžšαžŠαŸ’αž‹αžΆαž—αž·αž”αžΆαž›αžŒαžΈαž‡αžΈαžαž›αŸ”
* αžŸαž·αž€αŸ’αžŸαžΆαž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‡αžΆαžαž· αž“αž·αž„ Data GovernanceαŸ”
* αžŸαž·αž€αŸ’αžŸαžΆαž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž”αž‰αŸ’αž‰αžΆαžŸαž·αž”αŸ’αž”αž“αž·αž˜αŸ’αž˜αž·αžαž€αŸ’αž“αž»αž„αž€αžΆαžšαž•αŸ’αžαž›αŸ‹αžŸαŸαžœαžΆαžŸαžΆαž’αžΆαžšαžŽαŸˆαŸ”
* αž…αžΌαž›αžšαž½αž˜αžŸαž·αž€αŸ’αžαžΆαžŸαžΆαž›αžΆαž’αŸ†αž–αžΈ Cybersecurity αž“αž·αž„αž€αžΆαžšαž€αžΆαžšαž–αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ”
* αž‘αžŸαŸ’αžŸαž“αž€αž·αž…αŸ’αž…αž“αŸ…αž˜αž‡αŸ’αžˆαž˜αžŽαŸ’αžŒαž› Smart Nation αž“αž·αž„ Government Technology AgencyαŸ”
* αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸαž‡αžΆαž˜αž½αž™αž’αŸ’αž“αž€αž‡αŸ†αž“αžΆαž‰ αž“αž·αž„αžαŸ†αžŽαžΆαž„αžšαžŠαŸ’αž‹αžΆαž—αž·αž”αžΆαž›αž–αžΈαž”αŸ’αžšαž‘αŸαžŸαž•αŸ’αžŸαŸαž„αŸ—αŸ”

## ៀ. αž›αž‘αŸ’αž’αž•αž›αžŠαŸ‚αž›αž‘αž‘αž½αž›αž”αžΆαž“

αžαžΆαž˜αžšαž™αŸˆαž”αŸαžŸαž€αž€αž˜αŸ’αž˜αž“αŸαŸ‡ αž‘αž‘αž½αž›αž”αžΆαž“αž›αž‘αŸ’αž’αž•αž›αžŸαŸ†αžαžΆαž“αŸ‹αŸ—αžšαž½αž˜αž˜αžΆαž“αŸ–

* αž™αž›αŸ‹αžŠαžΉαž„αž’αŸ†αž–αžΈαž‚αŸ„αž›αž“αž™αŸ„αž”αžΆαž™ Smart GovernmentαŸ”
* αžŸαž·αž€αŸ’αžŸαžΆαž‚αŸ†αžšαžΌαž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαžΆαž’αžΆαžšαžŽαŸˆαž”αŸ’αžšαž€αž”αžŠαŸ„αž™αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αŸ”
* αž‘αž‘αž½αž›αž”αžΆαž“αž…αŸ†αžŽαŸαŸ‡αžŠαžΉαž„αž’αŸ†αž–αžΈαž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ AI αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαž•αŸ’αž’αŸ‚αž€αž›αžΎαž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ”
* αžŸαŸ’αžœαŸ‚αž„αž™αž›αŸ‹αž–αžΈαž€αžΆαžšαžšαŸ€αž”αž…αŸ† Digital Identity αž“αž·αž„ Digital Public InfrastructureαŸ”
* αž”αž„αŸ’αž€αžΎαžαž”αžŽαŸ’αžαžΆαž‰αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αž‡αžΆαž˜αž½αž™αž’αŸ’αž“αž€αž‡αŸ†αž“αžΆαž‰ αž“αž·αž„αžŸαŸ’αžαžΆαž”αŸαž“αž’αž“αŸ’αžαžšαž‡αžΆαžαž·αŸ”

## αŸ₯. αž”αž‰αŸ’αž αžΆαž”αŸ’αžšαžˆαž˜

* αž—αžΆαž–αžαž»αžŸαž‚αŸ’αž“αžΆαž“αŸƒαž”αž‘αž”αŸ’αž”αž‰αŸ’αž‰αžαŸ’αžαž· αž“αž·αž„αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžšαžœαžΆαž„αž”αŸ’αžšαž‘αŸαžŸαŸ”
* αžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αž˜αžΆαž“αž’αž“αž’αžΆαž“αž˜αž“αž»αžŸαŸ’αžŸαž‡αŸ†αž“αžΆαž‰αž”αž“αŸ’αžαŸ‚αž˜αž€αŸ’αž“αž»αž„αžœαž·αžŸαŸαž™ AI αž“αž·αž„ Data EngineeringαŸ”
* αžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αž˜αžΆαž“αž€αžΆαžšαžœαž·αž“αž·αž™αŸ„αž‚αž›αžΎαž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ Cloud αž“αž·αž„ GPUαŸ”

## ៦. αž’αž“αž»αžŸαžΆαžŸαž“αŸ

αžŠαžΎαž˜αŸ’αž”αžΈαž’αž“αž»αžœαžαŸ’αžαž…αŸ†αžŽαŸαŸ‡αžŠαžΉαž„αžŠαŸ‚αž›αž‘αž‘αž½αž›αž”αžΆαž“ αžŸαžΌαž˜αžŸαŸ’αž“αžΎαž’αž“αž»αžŸαžΆαžŸαž“αŸαžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

* αž”αž„αŸ’αž€αžΎαžαž‚αž˜αŸ’αžšαŸ„αž„αžŸαžΆαž€αž›αŸ’αž”αž„ AI αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž„αžΆαžšαžšαžŠαŸ’αž‹αž”αžΆαž›αŸ”
* αž–αž„αŸ’αžšαžΉαž„αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž“αž·αž„ Data GovernanceαŸ”
* αžšαŸ€αž”αž…αŸ†αžœαž‚αŸ’αž‚αž”αžŽαŸ’αžαž»αŸ‡αž”αžŽαŸ’αžαžΆαž›αž‡αžΌαž“αž˜αž“αŸ’αžαŸ’αžšαžΈαž‡αŸ†αž“αžΆαž‰αŸ”
* αž–αž„αŸ’αžšαžΈαž€αž€αž·αž…αŸ’αž…αžŸαž αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž‡αžΆαž˜αž½αž™αžŸαŸ’αžαžΆαž”αŸαž“αž’αž“αŸ’αžαžšαž‡αžΆαžαž·αŸ”
* αž‡αŸ†αžšαž»αž‰αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαžŸαŸαžœαžΆαžŸαžΆαž’αžΆαžšαžŽαŸˆαžŒαžΈαž‡αžΈαžαž›αŸ”

## ៧. αžŸαŸαž…αž€αŸ’αžαžΈαžŸαž“αŸ’αž“αž·αžŠαŸ’αž‹αžΆαž“

αž‡αžΆαžšαž½αž˜ αž”αŸαžŸαž€αž€αž˜αŸ’αž˜αž“αŸαŸ‡αž”αžΆαž“αžŸαž˜αŸ’αžšαŸαž…αžαžΆαž˜αž‚αŸ„αž›αž”αŸ†αžŽαž„αžŠαŸ‚αž›αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹ αž“αž·αž„αž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž…αŸ†αžŽαŸαŸ‡αžŠαžΉαž„ αž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸ αž“αž·αž„αž‚αŸ†αž“αž·αžαžαŸ’αž˜αžΈαŸ— αžŠαŸ‚αž›αž’αžΆαž…αž™αž€αž˜αž€αž’αž“αž»αžœαžαŸ’αžαž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αž…αŸ’αž…αŸαž€αžœαž·αž‘αŸ’αž™αžΆαžŒαžΈαž‡αžΈαžαž› αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž“αž·αž„αž€αžΆαžšαž›αžΎαž€αž€αž˜αŸ’αž–αžŸαŸ‹αž‚αž»αžŽαž—αžΆαž–αžŸαŸαžœαžΆαžŸαžΆαž’αžΆαžšαžŽαŸˆαžšαž”αžŸαŸ‹αž€αŸ’αžšαžŸαž½αž„αž”αŸ’αžšαŸƒαžŸαžŽαžΈαž™αŸ αž“αž·αž„αž‘αžΌαžšαž‚αž˜αž“αžΆαž‚αž˜αž“αŸαŸ”

αžŸαžΌαž˜αž―αž€αž§αžαŸ’αžαž˜ αž˜αŸαžαŸ’αžαžΆαž‘αž‘αž½αž›αž‡αŸ’αžšαžΆαž”αŸ”

αžšαžΆαž‡αž’αžΆαž“αžΈαž—αŸ’αž“αŸ†αž–αŸαž‰
αžαŸ’αž„αŸƒαž‘αžΈαŸ’αŸ₯ αžαŸ‚αžŸαžΈαž αžΆ αž†αŸ’αž“αžΆαŸ†αŸ’αŸ αŸ’αŸ§

αž αžαŸ’αžαž›αŸαžαžΆ

**αž•αž»αž“ αžŸαž»αž”αž»αžŽαŸ’αž™**

αž”αŸ’αžšαž’αžΆαž“αž€αŸ’αžšαž»αž˜αž€αžΆαžšαž„αžΆαžšαž”αž‰αŸ’αž‰αžΆαžŸαž·αž”αŸ’αž”αž“αž·αž˜αŸ’αž˜αž·αž

αž€αŸ’αžšαž»αž˜αž€αžΆαžšαž„αžΆαžšαž”αžšαž·αžœαžαŸ’αžαž€αž˜αŸ’αž˜αžŒαžΈαž‡αžΈαžαž›

αž…αž˜αŸ’αž›αž„αž‡αžΌαž“αŸ–

* αž“αžΆαž™αž€αžŠαŸ’αž‹αžΆαž“αž”αž»αž‚αŸ’αž‚αž›αž·αž€ αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‡αŸ’αžšαžΆαž”
* αž―αž€αžŸαžΆαžš
"""

predicted_tags = recommend_tags_adaptive(content, min_tags=MIN_TAGS, max_tags=MAX_TAGS)

print(f"\nPredicted tags ({len(predicted_tags)}, adaptive between {MIN_TAGS}-{MAX_TAGS}):")
for tag, score in predicted_tags:
    crossed = "βœ“" if score >= thresholds[tag_vocab.index(tag)] else " "
    print(f"  [{crossed}] {tag}  ({score:.3f})")

Citation

If you use this model, please cite the base model and the source dataset:

Base model: xlm-roberta-base (Conneau et al., 2020)
Fine-tuning dataset: phonsobon/khmer_tag_recommendations
Downloads last month
56
Safetensors
Model size
0.3B params
Tensor type
F32
Β·
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support

Model tree for phonsobon/khmer-tag-recommendation_xlmr

Finetuned
(4104)
this model

Dataset used to train phonsobon/khmer-tag-recommendation_xlmr