Doctor AI

Dr. Savath Saypadith

240 ບົດຄວາມ

ການສ້າງລະບົບ Named Entity Recognition (NER) ສຳລັບບົດຂ່າວພາສາລາວຂັ້ນສູງ

ໂພສເມື່ອ # Natural Language Processing # Named Entity Recognition # Deep Learning # Artificial Intelligence

ການສ້າງລະບົບ Named Entity Recognition (NER) ສຳລັບບົດຂ່າວພາສາລາວຂັ້ນສູງ

ໃນຍຸກດິຈິຕອນ, ສຳນັກຂ່າວຕ່າງໆໃນປະເທດລາວ ເຊັ່ນ: ສຳນັກຂ່າວສານປະເທດລາວ (KPL), ໜັງສືພິມວຽງຈັນໃໝ່ ຫຼື ໜ້າຂ່າວສະຖານີວິທະຍຸກະຈາຍສຽງແຫ່ງຊາດ ໄດ້ຜະລິດບົດຂ່າວອອກມາເປັນຈຳນວນມະຫາສານໃນແຕ່ລະມື້. ການທີ່ຈະນຳເອົາຂໍ້ມູນເຫຼົ່ານີ້ມາໃຊ້ປະໂຫຍດທາງດ້ານ Data Analytics ຫຼື ວິເຄາະແນວໂນ້ມສັງຄົມໄດ້ນັ້ນ, ເຮົາຈຳເປັນຕ້ອງມີລະບົບທີ່ສາມາດ “ອ່ານ ແລະ ເຂົ້າໃຈ” ວ່າພາກສ່ວນໃດຂອງປະໂຫຍກຄືຊື່ຄົນ (Person), ສະຖານທີ່ (Location) ຫຼື ອົງການຈັດຕັ້ງ (Organization).

ນີ້ຄືໜ້າທີ່ຫຼັກຂອງ Named Entity Recognition (NER) ໃນວຽກງານການປະມວນຜົນພາສາທຳມະຊາດ (NLP). ສຳລັບນັກພັດທະນາ AI ລະດັບກ້າວໜ້າ, ການເຮັດ NER ໃນພາສາລາວບໍ່ແມ່ນເລື່ອງງ່າຍ ເນື່ອງຈາກໂຄງສ້າງຂອງພາສາທີ່ຊັບຊ້ອນ. ໃນບົດຄວາມນີ້, ເຮົາຈະມາເຈາະເລິກຂະບວນການສ້າງລະບົບດັ່ງກ່າວ ໂດຍໃຊ້ສະຖາປັດຕະຍະກຳ Transformer ເພື່ອດຶງຂໍ້ມູນຈາກບົດຂ່າວຢ່າງມີປະສິດທິພາບ.

ຄວາມທ້າທາຍຂອງຊຸດຂໍ້ມູນພາສາລາວ (The Challenge of Lao Dataset)

ກ່ອນທີ່ຈະເຂົ້າເຖິງການຂຽນໂຄດ, ເຮົາຕ້ອງເຂົ້າໃຈຂໍ້ຈຳກັດຂອງພາສາລາວກ່ອນ. ພາສາລາວເປັນພາສາທີ່ ບໍ່ມີການຍະຫວ່າງລະຫວ່າງຄຳ (No explicit word boundaries). ເມື່ອເຮົາຕ້ອງການສະກັດຄຳວ່າ “ກະຊວງແຜນການແລະການລົງທຶນ”, ໂມເດວມາດຕະຖານທີ່ບໍ່ມີ Tokenizer ທີ່ດີສຳລັບພາສາລາວອາດຈະຕັດຄຳຜິດພາດ.

ນອກຈາກນີ້, ຍັງມີບັນຫາເລື່ອງ Out-of-Vocabulary (OOV) ໂດຍສະເພາະຊື່ສະຖານທີ່ໃໝ່ໆ ຫຼື ຊື່ຄົນຕ່າງປະເທດທີ່ຖືກຂຽນທັບສັບເປັນພາສາລາວໃນບົດຂ່າວ. ທາດແທ້ຂອງການແກ້ໄຂບັນຫານີ້ລະດັບ Deep Learning ຄືການນຳໃຊ້ Subword Tokenization ເຊັ່ນ: SentencePiece ຫຼື Byte-Pair Encoding (BPE) ທີ່ຝັງມາໃນໂມເດວ Pre-trained ຫຼາຍພາສາ ເຊັ່ນ XLM-RoBERTa ມາເປັນພື້ນຖານ.

ສະຖາປັດຕະຍະກຳລະບົບ: ຈາກ XLM-RoBERTa ສູ່ Token Classification

ການສ້າງ NER Model ໃນລະດັບສູງ ແມ່ນການປ່ຽນບັນຫານີ້ໃຫ້ເປັນ Sequence Labeling Task (Tagging). ໂດຍທົ່ວໄປ, ເຮົາຈະໃຊ້ຮູບແບບການ Tagging ແບບ BIO ດັ່ງຕົວຢ່າງຂອງປະໂຫຍກຂ່າວ: “ທ່ານ ສອນໄຊ ສີພັນດອນ ລົງຢ້ຽມຢາມ ແຂວງຈຳປາສັກ”.

ເຮົາຈະໃຊ້ໂມເດວ Transformer (XLM-R) ເຊິ່ງມີຄວາມສາມາດດ້ານພາສາແຖບອາຊີຕາເວັນອອກສຽງໃຕ້ໄດ້ດີກວ່າ, ມາໃສ່ຫົວຕໍ່ (Classification Head) ສຳລັບແຍກປະເພດ Token.

ການກະກຽມຂໍ້ມູນ ແລະ ຈັດການ Label Alignment (Python Code)

ເນື່ອງຈາກ XLM-R ຈະຕັດຄຳລາວອອກເປັນຫຼາຍໆ Subwords. ບັນຫາທີ່ໃຫຍ່ທີ່ສຸດຄືການຈັບຄູ່ (Align) ລະຫວ່າງ Labels ຈາກຂໍ້ມູນຂອງເຮົາ ເຂົ້າກັບ Subword tokens ທີ່ໂມເດວສ້າງຂຶ້ນ.

ລອງມາເບິ່ງວິທີການຂຽນ Code ດ້ວຍຫໍສະໝຸດ Transformers ຂອງ Hugging Face ເພື່ອຈັດການຮູບແບບທີ່ຊັບຊ້ອນນີ້:

import torch
from transformers import AutoTokenizer, AutoModelForTokenClassification

# 1. ໂຫຼດ Tokenizer ສຳລັບໂມເດວ Multilingual
model_checkpoint = "xlm-roberta-base"
tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)

def tokenize_and_align_labels(examples):
    # ເປີດການຕັດຄຳແບບແຍກແລ້ວ (ສົມມຸດວ່າຜ່ານການໃຊ້ LaoNLP ແຍກຄຳເບື້ອງຕົ້ນ)
    tokenized_inputs = tokenizer(examples["tokens"], truncation=True, is_split_into_words=True)

    labels = []
    for i, label in enumerate(examples["ner_tags"]):
        word_ids = tokenized_inputs.word_ids(batch_index=i)  # Mapping subwords ກັບຄຳເດີມ
        previous_word_idx = None
        label_ids = []
        for word_idx in word_ids:
            # Special tokens ([CLS], [SEP]) ຈະໄດ້ word_idx ເປັນ None. ເຮົາບໍ່ສົນໃຈ ຈຶ່ງກຳນົດເປັນ -100
            if word_idx is None:
                label_ids.append(-100)
            # ຖ້າເປັນ Subword ທຳອິດຂອງຄຳ ໃຫ້ໃສ່ Label ຕາມປົກກະຕິ
            elif word_idx != previous_word_idx:
                label_ids.append(label[word_idx])
            # ຖ້າຖືກຕັດຍ່ອຍໄປເຂົ້າອີກ Subword ໜຶ່ງພາຍໃນຄຳດຽວກັນ (ເຊັ່ນ: "ຈຳ" ແລະ "ປາສັກ")
            # ເຮົາຈະບໍ່ເອົາມາຄິດໄລ່ Loss ໃນລະຫວ່າງການ Train (ກຳນົດເປັນ -100)
            else:
                label_ids.append(-100)
            previous_word_idx = word_idx
        labels.append(label_ids)

    tokenized_inputs["labels"] = labels
    return tokenized_inputs

ການໃຊ້ປ້າຍກຳກັບ -100 ແມ່ນເຕັກນິກສຳຄັນໃນ PyTorch ທີ່ບອກໃຫ້ Loss Function (Cross-Entropy) ຂ້າມການຄິດໄລ່ສຳລັບ Token ນັ້ນໆ, ຊ່ວຍຫຼຸດຜ່ອນຄວາມຜິດພາດທີ່ເກີດຈາກກົນໄກພາສາ (Sub-word artifacts).

ການ Fine-Tuning ໂມເດວສຳລັບຂ່າວລາວ (Training Protocol)

ເມື່ອຂໍ້ມູນພ້ອມແລ້ວ, ເຮົາສາມາດສ້າງໂມເດວ Token Classification ແລະ ເລີ່ມການຝຶກສອນ (Fine-tuning):

from transformers import TrainingArguments, Trainer
from evaluate import load
import numpy as np

# ກຳນົດລາຍການ Tags ເຊັ່ນ: O, B-PER, I-PER, B-ORG, I-ORG, B-LOC, I-LOC
label_list = ["O", "B-PER", "I-PER", "B-ORG", "I-ORG", "B-LOC", "I-LOC"]
id2label = {i: label for i, label in enumerate(label_list)}
label2id = {label: i for i, label in enumerate(label_list)}

model = AutoModelForTokenClassification.from_pretrained(
    model_checkpoint,
    num_labels=len(label_list),
    id2label=id2label,
    label2id=label2id
)

# ໃຊ້ Seqeval ເຊິ່ງເປັນ Metric ມາດຕະຖານສຳລັບວຽກງານ NER
metric = load("seqeval")

def compute_metrics(p):
    predictions, labels = p
    predictions = np.argmax(predictions, axis=2)

    # ເອົາ -100 ອອກຈາກການປະເມີນຜົນ
    true_predictions = [
        [label_list[p] for (p, l) in zip(prediction, label) if l != -100]
        for prediction, label in zip(predictions, labels)
    ]
    true_labels = [
        [label_list[l] for (p, l) in zip(prediction, label) if l != -100]
        for prediction, label in zip(predictions, labels)
    ]

    results = metric.compute(predictions=true_predictions, references=true_labels)
    return {
        "precision": results["overall_precision"],
        "recall": results["overall_recall"],
        "f1": results["overall_f1"],
        "accuracy": results["overall_accuracy"],
    }

args = TrainingArguments(
    output_dir="./lao-news-ner-xlmr",
    evaluation_strategy="epoch",
    learning_rate=2e-5,
    per_device_train_batch_size=16,
    num_train_epochs=5,
    weight_decay=0.01,
)

trainer = Trainer(
    model=model,
    args=args,
    train_dataset=tokenized_datasets["train"],
    eval_dataset=tokenized_datasets["validation"],
    tokenizer=tokenizer,
    compute_metrics=compute_metrics
)

trainer.train()

ການປັບແຕ່ງຂັ້ນສູງ (Advanced Optimization)

ສຳລັບທີມພັດທະນາ AI ໃນລາວທີ່ຂາດແຄນ Dataset ຂະໜາດໃຫຍ່, ສາມາດໃຊ້ເຕັກນິກ Cross-Lingual Transfer Learning. ເນື່ອງຈາກພາສາລາວ ແລະ ພາສາໄທ ມີໂຄງສ້າງ ແລະ ໄວຍາກອນທີ່ໃກ້ຄຽງກັນຫຼາຍ ບວກກັບ XLM-R ເປັນໂມເດວແບບຫຼາຍພາສາ (Multilingual). ທ່ານສາມາດເອົາຊຸດຂໍ້ມູນໄທຂະໜາດໃຫຍ່ ເຊັ່ນ: ThaiDNER ຫຼື LST20 ມາ Train ກ່ອນ (Pre-fine-tuning) ກ່ອນທີ່ນຳມາ Fine-tune ຮອບສຸດທ້າຍກັບຊຸດປ້າຍກຳກັບ (Annotated dataset) ຈາກບົດຂ່າວລາວ ເຊິ່ງຈະຊ່ວຍເພີ່ມຄ່າ F1-Score ໄດ້ຢ່າງມະຫາສານ.

Key Takeaways

ບົດສະຫຼຸບ

ການພັດທະນາລະບົບ Named Entity Recognition (NER) ສຳລັບໜັງສືພິມ ຫຼື ບົດຂ່າວພາສາລາວ ແມ່ນບາດກ້າວສຳຄັນທີ່ຈະປ່ຽນຂໍ້ມູນດິບ (Raw Text) ໃນຕາໜ່າງສື່ອັກສອນຂອງປະເທດລາວ ໃຫ້ກາຍເປັນຂໍ້ມູນມີໂຄງສ້າງ (Structured Data). ເຖິງແມ່ນວ່າຈະມີອຸປະສັກທາງດ້ານໂຄງສ້າງພາສາທີ່ບໍ່ມີການຍະຫວ່າງ ຫຼື ຂໍ້ຈຳກັດດ້ານ Dataset ທ້ອງຖິ່ນ, ແຕ່ດ້ວຍການປະຍຸກໃຊ້ສະຖາປັດຕະຍະກຳ Transformer-based models, ການຈັດການ Subword Tracking ທີ່ຖືກຕ້ອງ ແລະ ການນຳໃຊ້ Transfer Learning ຢ່າງມີຍຸດທະສາດ, ນັກພັດທະນາກໍສາມາດສ້າງລະບົບດຶງຂໍ້ມູນ Entities ຂັ້ນສູງເພື່ອວິເຄາະທ່າອ່ຽງທາງສັງຄົມ-ເສດຖະກິດໃນປະເທດລາວໄດ້ຢ່າງຊັດເຈນ ແລະ ມີປະສິດທິຜົນ.