ການສ້າງລະບົບ Named Entity Recognition (NER) ສຳລັບບົດຂ່າວພາສາລາວຂັ້ນສູງ
ການສ້າງລະບົບ 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 ດັ່ງຕົວຢ່າງຂອງປະໂຫຍກຂ່າວ: “ທ່ານ ສອນໄຊ ສີພັນດອນ ລົງຢ້ຽມຢາມ ແຂວງຈຳປາສັກ”.
- ທ່ານ (O - Outside)
- ສອນໄຊ (B-PER - Beginning of Person)
- ສີພັນດອນ (I-PER - Inside Person)
- ລົງຢ້ຽມຢາມ (O)
- ແຂວງຈຳປາສັກ (B-LOC - Beginning of Location)
ເຮົາຈະໃຊ້ໂມເດວ 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
- Subword Mapping ຄືຫົວໃຈສຳຄັນ: ພາສາລາວບໍ່ມີການຍະຫວ່າງຄຳ ການຈັບຄູ່ (Alignment) ລະຫວ່າງ Labels ແລະ Tokens ໂດຍໃຊ້ຄ່າ
-100ແມ່ນຈຳເປັນເພື່ອປ້ອງກັນ Model ສະຫຼັບຕຳແໜ່ງການຮຽນຮູ້. - XLM-RoBERTa ຄືທາງເລືອກທີ່ດີເລີດ: ໃນຂະນະທີ່ຍັງບໍ່ມີ Monolingual LLM ຂະໜາດໃຫຍ່ສະເພາະສຳລັບພາສາລາວ, ໂມເດວແບບຂ້າມພາສາສາມາດໃຊ້ປະໂຫຍດຈາກຖານຂໍ້ມູນພາສາໃກ້ຄຽງໄດ້.
- Transfer Learning ມີປະໂຫຍດຫຼາຍ: ການດຶງຄວາມຮູ້ຈາກ Data ພາສາໄທ ຜ່ານໂມເດວ Multilingual ມາຊ່ວຍຕື່ມເຕັມຊ່ອງຫວ່າງຂອງ Resource ໃນພາສາລາວ ເຮັດໃຫ້ Model ເຂົ້າໃຈບໍລິບົດຂ່າວໄດ້ເລິກເຊິ່ງຂຶ້ນ.
ບົດສະຫຼຸບ
ການພັດທະນາລະບົບ Named Entity Recognition (NER) ສຳລັບໜັງສືພິມ ຫຼື ບົດຂ່າວພາສາລາວ ແມ່ນບາດກ້າວສຳຄັນທີ່ຈະປ່ຽນຂໍ້ມູນດິບ (Raw Text) ໃນຕາໜ່າງສື່ອັກສອນຂອງປະເທດລາວ ໃຫ້ກາຍເປັນຂໍ້ມູນມີໂຄງສ້າງ (Structured Data). ເຖິງແມ່ນວ່າຈະມີອຸປະສັກທາງດ້ານໂຄງສ້າງພາສາທີ່ບໍ່ມີການຍະຫວ່າງ ຫຼື ຂໍ້ຈຳກັດດ້ານ Dataset ທ້ອງຖິ່ນ, ແຕ່ດ້ວຍການປະຍຸກໃຊ້ສະຖາປັດຕະຍະກຳ Transformer-based models, ການຈັດການ Subword Tracking ທີ່ຖືກຕ້ອງ ແລະ ການນຳໃຊ້ Transfer Learning ຢ່າງມີຍຸດທະສາດ, ນັກພັດທະນາກໍສາມາດສ້າງລະບົບດຶງຂໍ້ມູນ Entities ຂັ້ນສູງເພື່ອວິເຄາະທ່າອ່ຽງທາງສັງຄົມ-ເສດຖະກິດໃນປະເທດລາວໄດ້ຢ່າງຊັດເຈນ ແລະ ມີປະສິດທິຜົນ.