Doctor AI

Dr. Savath Saypadith

240 ບົດຄວາມ

ການແຍກປະເພດຄຳສັບ (Part-of-Speech Tagging) ສຳລັບພາສາລາວ

ໂພສເມື່ອ # Natural Language Processing # Machine Learning # Computational Linguistics # Deep Learning

ການແຍກປະເພດຄຳສັບ (Part-of-Speech Tagging) ສຳລັບພາສາລາວ

ໃນຍຸກທີ່ປັນຍາປະດິດ (AI) ແລະ Large Language Models (LLMs) ກຳລັງເຂົ້າມາມີບົດບາດສຳຄັນໃນທຸກອຸດສາຫະກຳ, ການປະມວນຜົນພາສາທຳມະຊາດ (Natural Language Processing ຫຼື NLP) ສຳລັບພາສາລາວຍັງຄົງເປັນສິ່ງທ້າທາຍອັນໃຫຍ່ຫຼວງ. ໜຶ່ງໃນຂະບວນການພື້ນຖານທີ່ສຸດແຕ່ສຳຄັນທີ່ສຸດໃນ NLP ແມ່ນ Part-of-Speech (POS) Tagging ຫຼື ການແຍກປະເພດຄຳສັບ ວ່າຄຳໃດເປັນຄຳນາມ (Noun), ຄຳກຳມະ (Verb), ຫຼື ຄຳຄຸນນາມ (Adjective).

ລອງຈິນຕະນາການເຖິງການສ້າງ AI ທີ່ສາມາດອ່ານ ແລະ ເຂົ້າໃຈການລາຍງານ “ລະດັບນ້ຳຂອງໃນນະຄອນຫຼວງວຽງຈັນ”, ຫຼື ລະບົບວິເຄາະຄວາມຮູ້ສຶກ (Sentiment Analysis) ທີ່ອ່ານລີວິວຮ້ານອາຫານໃນຮ້ານແຄມຂອງ. ເພື່ອໃຫ້ຄອມພິວເຕີເຂົ້າໃຈປະໂຫຍກດັ່ງກ່າວ, ມັນຈຳເປັນຕ້ອງສາມາດແຍກແຍະໂຄງສ້າງໄວຍາກອນໄດ້ຢ່າງຊັດເຈນ. ໃນບົດຄວາມນີ້, ເຮົາຈະມາລົງເລິກເຖິງເຕັກນິກລະດັບສູງໃນການເຮັດ POS Tagging ສຳລັບພາສາລາວ, ຕັ້ງແຕ່ໂຄງສ້າງທາງຄະນິດສາດ ຈົນເຖິງການຂຽນໂຄ້ດຕົວຈິງ.

ຄວາມທ້າທາຍຂອງ POS Tagging ໃນພາສາລາວ (The Lao Language Challenge)

ກ່ອນທີ່ເຮົາຈະໄປເຖິງການTrain Model, ເຮົາຕ້ອງເຂົ້າໃຈກ່ອນວ່າເປັນຫຍັງ POS Tagging ໃນພາສາລາວຈຶ່ງຍາກກວ່າພາສາອັງກິດ:

  1. ບໍ່ມີການຍະຫວ່າງຄຳ (No Word Boundaries): ພາສາລາວຂຽນຕິດກັນເປັນປະໂຫຍກເຊັ່ນ: “ຂ້ອຍໄປກິນເຂົ້າປຽກຢູ່ປາກຊ່ອງ”. ກ່ອນຈະເຮັດ POS Tagging ໄດ້, ເຮົາຕ້ອງຜ່ານຂັ້ນຕອນ Word Tokenization ຫຼື ການຕັດຄຳກ່ອນ. ຄວາມຜິດພາດໃນການຕັດຄຳ ຈະສົ່ງຜົນກະທົບໂດຍກົງຕໍ່ຄວາມແມ່ນຍຳຂອງ POS Tagger.
  2. ຄວາມກຳກວມຂອງຄຳ (Word Ambiguity): ຄຳໜຶ່ງສາມາດເຮັດໜ້າທີ່ໄດ້ຫຼາຍແບບຂຶ້ນກັບບໍລິບົດ. ຕົວຢ່າງຄຳວ່າ “ຕາ”:
    • “ແມ່ຕູ້ເຈັບຕາ” (Noun - ໝາຍເຖິງອະໄວຍະວະ)
    • ຕາຂອງຂ້ອຍໄປນາ” (Noun - ໝາຍເຖິງພໍ່ຂອງແມ່)
  3. ຂາດແຄນຂໍ້ມູນສຳລັບຝຶກສອນ (Low-Resource Language): ພາສາລາວຍັງຂາດແຄນຊຸດຂໍ້ມູນ (Corpus) ກຳກັບ POS (Annotated Data) ຂະໜາດໃຫຍ່ ເມື່ອທຽບກັບພາສາເພື່ອນບ້ານ.

ສະຖາປັດຕະຍະກຳສຳລັບ Sequence Labeling (Architectures)

ການເຮັດ POS Tagging ທາງຄະນິດສາດແລ້ວແມ່ນບັນຫາຂອງ Sequence Labeling. ເຮົາມີລຳດັບຂອງຄຳສັບ X=(x1,x2,...,xn)X = (x_1, x_2, ..., x_n) ແລະ ຕ້ອງການທຳນາຍລຳດັບຂອງ Tag Y=(y1,y2,...,yn)Y = (y_1, y_2, ..., y_n).

1. Conditional Random Fields (CRF)

ສຳລັບພາສາທີ່ມີຊັບພະຍາກອນໜ້ອຍ (Low-resource), CRF ແມ່ນໂມເດວທີ່ນິຍົມຫຼາຍກ່ອນຍຸກຂອງ Deep Learning. ມັນເປັນ Discriminative model ທີ່ຄຳນວນຫາຄ່າຄວາມເປັນໄປໄດ້ແບບມີເງື່ອນໄຂ P(YX)P(Y|X). CRF ມີປະສິດທິພາບບໍລິຫານຈັດການກັບ “Context” ຫຼື ບໍລິບົດອ້ອມຂ້າງຂອງຄຳສັບໄດ້ດີ ໂດຍຜ່ານ Feature Functions.

2. Transformer-based Models (XLM-RoBERTa / mBERT)

ໃນຍຸກປະຈຸບັນ, ການໃຊ້ Pre-trained Multilingual Language Models (ເຊັ່ນ: XLM-R) ມາເຮັດ Fine-tuning ສຳລັບ Token Classification ແມ່ນໃຫ້ຜົນໄດ້ຮັບ (State-of-the-Art). ໂມເດວເຫຼົ່ານີ້ໃຊ້ Self-Attention ທີ່ສາມາດເຂົ້າໃຈບໍລິບົດຂອງຄຳວ່າ “ເຂົ້າປຽກ” ກັບ “ແຊບ” ໄດ້ ເຖິງວ່າຈະຢູ່ຫ່າງກັນໃນປະໂຫຍກ.

ພາກປະຕິບັດ: ການສ້າງ POS Tagger ດ້ວຍ Python ແລະ CRF

ໃນຕົວຢ່າງນີ້, ເຮົາຈະໃຊ້ sklearn-crfsuite ເຊິ່ງເປັນ Library ທີ່ນິຍົມໃນການເຮັດ Sequence Labeling ທີ່ໄວ ແລະ ໃຊ້ຊັບພະຍາກອນຕ່ຳ, ເໝາະສຳລັບການເລີ່ມຕົ້ນສ້າງ Baseline ໃຫ້ກັບພາສາລາວ.

ຂັ້ນຕອນທີ 1: ກະກຽມຂໍ້ມູນ ແລະ ການສະກັດຈຸດເດັ່ນ (Feature Extraction)

ເຮົາຕ້ອງຂຽນຟັງຊັນເພື່ອແປງຄຳສັບໃນປະໂຫຍກ (ທີ່ຕັດຄຳມາແລ້ວ) ໃຫ້ກາຍເປັນ Features ທີ່ CRF ສາມາດຮຽນຮູ້ໄດ້.

import sklearn_crfsuite
from sklearn_crfsuite import metrics

# ຟັງຊັນສຳລັບດຶງ Features ຂອງແຕ່ລະຄຳໃນພາສາລາວ
def word2features(sent, i):
    word = sent[i]
    
    # ກະກຽມ Features ພື້ນຖານ
    features = {
        'bias': 1.0,
        'word.lower()': word.lower(),
        # ກວດສອບວ່າມີຕົວເລກລາວ ຫຼື ອາຣັບ
        'is_numeric': any(char.isdigit() or char in '໑໒໓໔໕໖໗໘໙໐' for char in word),
        # ກວດສອບລັກສະນະຂອງຄຳເຊັ່ນ ການຂຶ້ນຕົ້ນດ້ວຍສະຫຼະແອ, ໂອ (Prefix) ເພື່ອຄາດເດົາ
        'prefix_1': word[0],
        'suffix_1': word[-1],
    }
    
    # ດຶງຂໍູ້ນຄຳສັບກ່ອນໜ້າ (Previous Word context)
    if i > 0:
        word1 = sent[i-1]
        features.update({
            '-1:word.lower()': word1.lower(),
        })
    else:
        features['BOS'] = True # Beginning of Sentence

    # ດຶງຂໍ້ມູນຄຳສັບຖັດໄປ (Next Word context)
    if i < len(sent)-1:
        word1 = sent[i+1]
        features.update({
            '+1:word.lower()': word1.lower(),
        })
    else:
        features['EOS'] = True # End of Sentence

    return features

def sent2features(sent):
    return [word2features(sent, i) for i in range(len(sent))]

ຂັ້ນຕອນທີ 2: ການກຳນົດ Training Data

ສົມມຸດເຮົາມີປະໂຫຍກທີ່ຕັດຄຳ ແລະ ກຳກັບ Tag ມາແລ້ວ (ໃຊ້ມາດຕະຖານໂຄງສ້າງ Universal Dependencies (UD) ປະກອບມີ NOUN, VERB, ADJ, PRON).

# ຂໍ້ມູນຕົວຢ່າງ: "ຂ້ອຍ ກິນ ເຂົ້າປຽກ ຢູ່ ຮ້ານ ແຄມ ຂອງ"
train_sents = [
    (
        ["ຂ້ອຍ", "ກິນ", "ເຂົ້າປຽກ", "ຢູ່", "ຮ້ານ", "ແຄມ", "ຂອງ"],
        ["PRON", "VERB", "NOUN", "ADP", "NOUN", "NOUN", "PROPN"]
    ),
    (
        ["ທາດຫຼວງ", "ງາມ", "ຫຼາຍ", "ມື້", "ນີ້"],
        ["PROPN", "ADJ", "ADV", "NOUN", "PRON"]
    )
]

X_train = [sent2features(sent[0]) for sent in train_sents]
y_train = [sent[1] for sent in train_sents]

ຂັ້ນຕອນທີ 3: ການຝຶກສອນໂມເດວ (Training the CRF Model)

# ສ້າງ ແລະ Train CRF Model ດ້ວຍລີກໍຣີທຶມ L-BFGS
crf = sklearn_crfsuite.CRF(
    algorithm='lbfgs',
    c1=0.1, # L1 Regularization
    c2=0.1, # L2 Regularization
    max_iterations=100,
    all_possible_transitions=True
)

crf.fit(X_train, y_train)

# ທົດສອບການທຳນາຍ (Prediction)
test_sentence = ["ລາວ", "ມັກ", "ເຂົ້າປຽກ", "ແຊບ"]
X_test = [sent2features(test_sentence)]
y_pred = crf.predict(X_test)

print("Sentence:", test_sentence)
print("Predicted POS:", y_pred[0])
# ຜົນລັບທີ່ຄາດຫວັງ: ['PRON', 'VERB', 'NOUN', 'ADJ']

ການນຳໄປປະຍຸກໃຊ້ກັບທຸລະກິດ ແລະ ອົງກອນໃນລາວ

ການສ້າງລະບົບ POS Tagger ທີ່ມີຄວາແນ່ນອນສູງ ບໍ່ແມ່ນພຽງແຕ່ເປັນງານວິຊາການເທົ່ານັ້ນ, ແຕ່ມີມູນຄ່າທາງທຸລະກິດຢ່າງມະຫາສານ:

ຂໍ້ສັງເກດ ແລະ ຈຸດສຳຄັນທີ່ຄວນຈື່ (Key Takeaways)

ສະຫຼຸບ

ການພັດທະນາລະບົບ Part-of-Speech Tagging ສຳລັບພາສາລາວເປັນບາດກ້າວທີ່ສຳຄັນທີ່ສຸດໃນການຍົກລະດັບ NLP ຂອງປະເທດເຮົາ. ເຖິງແມ່ນວ່າຈະມີອຸປະສັກເລື່ອງຊັບພະຍາກອນຂໍ້ມູນ ແລະ ຄວາມຊັບຊ້ອນຂອງໄວຍາກອນລາວ (ເຊັ່ນການບໍ່ຍະຫວ່າງຄຳ), ແຕ່ດ້ວຍເຕັກນິກທາງຄະນິດສາດຂັ້ນສູງເຊັ່ນ Conditional Random Fields (CRF) ຫຼື ໂມເດວ Deep Learning ຮຸ່ນໃໝ່ກໍສາມາດເຮັດໃຫ້ການວິເຄາະໂຄງສ້າງພາສາເປັນຈິງໄດ້. ສຳລັບນັກພັດທະນາ AI ແລະ ນັກສຶກສາລາວ, ນີ້ຄືໂອກາດສຳຄັນທີ່ຈະສ້າງຜົນງານວິໄຈ ແລະ ເຄື່ອງມືທີ່ຈະກາຍເປັນຮາກຖານໃຫ້ກັບວົງການເຕັກໂນໂລຊີລາວໃນອະນາຄົດ.