Chuyển tới nội dung chính

Xử lý ngôn ngữ tự nhiên

Xử lý ngôn ngữ tự nhiên (Natural Language Processing, NLP) là nhánh AI giúp máy tính đọc, hiểu và sinh ra ngôn ngữ con người. Năm 2026, NLP đứng sau các mô hình ngôn ngữ lớn như ChatGPT, Claude, Gemini, sau công cụ tìm kiếm web, dịch máy thời gian thực, trợ lý ảo và lọc nội dung. Vấn đề cốt lõi: máy tính chỉ làm việc với số, còn văn bản là chuỗi ký tự. Vì vậy mọi pipeline NLP đều bắt đầu bằng việc biến văn bản thành con số, rồi mới đưa vào mô hình.

Nhưng biến văn bản thành số khó hơn nghe rất nhiều, vì ngôn ngữ có bốn tính chất khiến nó ngặt hơn hẳn dữ liệu bảng hay ảnh. Nó rời rạc và tổ hợp gần như vô hạn: từ vốn từ vài chục nghìn từ, con người sinh ra vô số câu chưa ai từng nói. Thứ tự quyết định nghĩa: đảo hai từ có thể lật ngược ý câu. Nó mơ hồ ở mọi tầng: một từ nhiều nghĩa, một câu nhiều cách phân tích, một phát ngôn nhiều ý định. Và nghĩa phụ thuộc ngữ cảnh xa: đại từ ở câu này có thể trỏ về danh từ cách đó vài đoạn. Toàn bộ lịch sử NLP, từ viết luật ngữ pháp bằng tay tới đếm thống kê rồi học biểu diễn liên tục, có thể đọc như một chuỗi cố gắng đối phó với bốn tính chất đó.

Thử ngay: túi từ và TF-IDF trên ba câu

Cách biến văn bản thành số kinh điển nhất là túi từ (bag-of-words): mỗi câu trở thành một vector đếm số lần xuất hiện của từng từ, bỏ qua thứ tự. TF-IDF là một biến thể tinh hơn của cùng ý đó. Hãy tự tay xem hai cách biểu diễn ấy trên một tập ba câu tiếng Việt mẫu. Chọn một câu để xem vector của nó, rồi chuyển giữa túi từ và TF-IDF để thấy túi từ chỉ đếm tần suất còn TF-IDF hạ trọng số những từ xuất hiện ở mọi câu. Bạn cũng có thể gõ thêm câu của mình vào kho ngữ liệu hoặc xoá bớt câu mẫu: từ điển, số đếm và trọng số TF-IDF đều được tính lại từ đầu.

Túi từ và TF-IDF từng bướctúi từ
Kho ngữ liệu: thêm câu của bạn
Câu mới được chuẩn hoá trước khi tách từ: hạ hết về chữ thường, bỏ dấu câu, gộp khoảng trắng thừa. Bộ tách từ ở đây chỉ cắt theo khoảng trắng.
Chọn câu để xem vector
phim này rất hay tôi thích phim này
Tách từ (token) của câu này
phimnàyrấthaytôithíchphimnày
Từ điển chung (vocabulary), N = 3 câu
0phim1này2rất3hay4tôi5thích6không7kia8khá
Vector của câu 1 (số đếm)
phim2
này2
rất1
hay1
tôi1
thích1
không0
kia0
khá0
Vector túi từ chỉ đếm số lần mỗi từ xuất hiện, nên hai câu cùng tập từ mà khác thứ tự sẽ cho cùng một vector: túi từ mất thứ tự từ.

Ý tưởng cốt lõi

Một pipeline NLP cơ bản đi qua ba bước: tách văn bản thành đơn vị nhỏ, biểu diễn các đơn vị đó thành vector số, rồi đưa vector vào mô hình để giải tác vụ. Ta đi lần lượt từng bước.

Pipeline NLP cơ bản
Tách từ
chia câu thành token
Chuẩn hóa
hạ chữ thường, lập từ điển
Biểu diễn vector
one-hot, TF-IDF, embedding
Mô hình
phân loại, sinh, dịch
Kết quả
nhãn hoặc văn bản đầu ra

Tách từ (tokenization)

Tách từ là chia một câu thành các đơn vị nhỏ gọi là token: thường là từ, đôi khi là ký tự hoặc cụm ký tự con. Ví dụ câu "Hôm nay tôi đi học" được tách thành danh sách ["Hôm", "nay", "tôi", "đi", "học"].

Với tiếng Anh, tách theo khoảng trắng đã cho kết quả khá tốt. Tiếng Việt khó hơn vì một từ có nghĩa thường gồm nhiều âm tiết viết rời, ví dụ "học sinh" là một từ chứ không phải hai từ "học""sinh". Vì vậy tiếng Việt cần công cụ tách từ chuyên dụng như underthesea hoặc pyvi. Sau khi có danh sách token, ta lập một từ điển (vocabulary) gán cho mỗi token một chỉ số nguyên duy nhất.

Vì sao tiếng Việt khó tách từ

Mấu chốt nằm ở chỗ ranh giới từ không trùng với khoảng trắng. Khoảng trắng trong tiếng Việt ngăn cách âm tiết, còn từ có nghĩa lại có thể gồm một, hai hay nhiều âm tiết. Máy chỉ nhìn thấy khoảng trắng, nên tách theo khoảng trắng là cắt vụn từ ghép thành các mảnh mang nghĩa khác hẳn: "học sinh" thành "học""sinh", "máy bay" thành "máy""bay". Với mô hình túi từ, cắt sai như vậy đủ làm hỏng nghĩa cả câu. Cái khó thứ hai là nhập nhằng thật sự: cùng một dãy âm tiết có thể tách theo nhiều cách đều hợp lệ về hình thức, chỉ ngữ cảnh mới quyết định được cách nào đúng. Vì thế tách từ tiếng Việt là một bài toán học máy chứ không phải một thao tác chuỗi thuần túy, và đó là thứ các thư viện chuyên dụng cung cấp sẵn.

Hướng thứ ba, phổ biến trong các mô hình hiện đại, là bỏ hẳn khái niệm từ mà dùng đơn vị con của từ (subword): thuật toán tự học một bộ mảnh ký tự thường gặp rồi ghép chúng lại để biểu diễn bất kỳ chuỗi nào. Cách này giữ từ điển ở kích thước vừa phải và khiến mô hình không bao giờ gặp từ lạ hoàn toàn, vì từ nào cũng phân rã được thành các mảnh đã biết. Đó là lý do các mô hình ngôn ngữ lớn xử lý được cả tên riêng, cả từ sai chính tả, cả thuật ngữ chưa từng thấy nguyên vẹn. Khâu chuẩn hóa còn vài quyết định nhỏ mà ảnh hưởng thật: hạ chữ thường thì mất thông tin tên riêng, bỏ dấu câu thì mất tín hiệu câu hỏi, loại từ dừng thì có thể mất luôn từ phủ định "không" vốn đảo ngược hẳn cảm xúc của câu.

Biểu diễn văn bản: từ rời rạc đến dày đặc

Có nhiều cách biến token thành vector số, đi từ đơn giản (rời rạc) đến tinh vi (dày đặc).

One-hot encoding. Mỗi từ trong từ điển cỡ V được biểu diễn bằng một vector dài V, toàn số 0 trừ đúng một vị trí bằng 1. Cách này tốn bộ nhớ (số chiều bằng cả từ điển, thường hàng chục nghìn tới hàng triệu) và quan trọng hơn là mọi từ cách đều nhau: "vua""hoàng đế" xa nhau đúng bằng "vua""mèo", nên không bắt được ngữ nghĩa.

Bag-of-Words (BoW). Biểu diễn cả một văn bản bằng vector đếm số lần mỗi từ xuất hiện. Ví dụ với từ điển ["tôi", "yêu", "ghét", "phim"], câu "tôi yêu phim" thành vector [1, 1, 0, 1]. BoW đơn giản và hiệu quả cho phân loại văn bản cơ bản, nhưng mất thứ tự từ: "chó cắn người""người cắn chó" cho cùng một vector.

TF-IDF. Cải tiến của BoW. Thay vì chỉ đếm, ta cân lại mỗi từ theo hai yếu tố: tần suất trong văn bản (term frequency) nhân với độ hiếm của từ qua toàn bộ tập văn bản (inverse document frequency). Ý tưởng: từ xuất hiện ở mọi văn bản như "là", "và" ít mang thông tin nên bị giảm trọng số; từ xuất hiện tập trung ở vài văn bản thì quan trọng và được tăng trọng số.

Word embedding (biểu diễn phân tán). Đây là bước nhảy lớn. Thay vì vector thưa dài V, ta gán mỗi từ một vector dày đặc số chiều nhỏ d (thường 50 tới 1000), trong đó mọi phần tử đều có giá trị khác 0. Khoảng cách giữa các vector này phản ánh ngữ nghĩa: từ gần nghĩa nằm gần nhau trong không gian. Bảng dưới so sánh hai cách.

Tiêu chíOne-hotWord embedding
Số chiềubằng từ điển V (rất lớn)nhỏ, d khoảng 50 tới 1000
Mật độthưa, chỉ một giá trị khác 0dày đặc, mọi phần tử khác 0
Khoảng cáchmọi cặp từ cách đều nhauphản ánh ngữ nghĩa
Học được khôngkhông, cố địnhcó, học từ dữ liệu

Word embeddings: ý tưởng vector từ

Làm sao máy học được vector từ phản ánh ngữ nghĩa? Nền tảng là giả thuyết phân phối: "các từ xuất hiện trong ngữ cảnh tương tự thì có nghĩa tương tự". Nếu "cà phê""trà" thường đứng cạnh các từ như "uống", "nóng", "buổi sáng", thì máy suy ra hai từ này gần nghĩa và đặt vector của chúng gần nhau.

Phương pháp kinh điển là Word2Vec (Mikolov và cộng sự, 2013), với hai biến thể. CBOW dự đoán từ trung tâm dựa trên các từ ngữ cảnh xung quanh. Skip-gram làm ngược lại: dự đoán các từ ngữ cảnh dựa trên từ trung tâm. Cả hai trượt một cửa sổ dọc theo văn bản, mỗi lần học một chút, cuối cùng thu được bảng vector từ. Các họ sau như GloVe và FastText cải tiến thêm về độ ổn định và khả năng xử lý từ chưa thấy.

Điều bất ngờ là không gian vector học được có tính chất đại số đẹp. Phép tương tự nổi tiếng: vector của king trừ vector man cộng vector woman cho ra vector rất gần với queen. Nói cách khác, quan hệ "đàn ông tới đàn bà" và "vua tới nữ hoàng" được mã hóa bằng cùng một hướng dịch chuyển trong không gian. Quan hệ thủ đô cũng vậy: Paris trừ France cộng Italy xấp xỉ Rome. Tính chất này không được lập trình tay mà tự xuất hiện khi học từ văn bản lớn, và chính nó đã thay đổi cuộc chơi của NLP.

Một hạn chế: Word2Vec cho mỗi từ một vector cố định, không quan tâm ngữ cảnh. Từ "bank" trong "river bank" (bờ sông) và "money bank" (ngân hàng) có cùng vector. Thế hệ sau, embedding ngữ cảnh (BERT, GPT dựa trên kiến trúc Transformer) sinh vector khác nhau cho mỗi lần từ xuất hiện, tùy ngữ cảnh xung quanh. Đây là nền tảng của mọi mô hình ngôn ngữ lớn hiện đại.

Mô hình chuỗi và cơ chế chú ý

Có vector cho từng từ vẫn chưa đủ, vì câu là một chuỗi có thứ tự chứ không phải một túi từ. Họ mô hình đầu tiên đọc được chuỗi là mạng hồi quy (RNN, LSTM, GRU): đọc từ trái sang phải, mỗi bước nhận vector của từ hiện tại cộng với một trạng thái ẩn tóm tắt mọi thứ đã đọc trước đó, rồi cập nhật trạng thái ẩn ấy. Cách này giữ được thứ tự, nhưng có hai điểm yếu nặng: trí nhớ phai dần (thông tin ở đầu câu phải đi qua rất nhiều bước cập nhật mới tới cuối câu và bị làm loãng trên đường đi) và không song song hóa được (bước thứ t phải chờ bước t-1 xong).

Cơ chế chú ý (attention) giải quyết cả hai, và trực giác của nó rất gần cách con người đọc: khi cần hiểu một từ, ta không nhớ đều mọi từ trước đó mà liếc lại đúng những từ liên quan, ví dụ gặp đại từ "nó" thì tự động ngoái nhìn danh từ mà nó trỏ tới. Attention hình thức hóa việc liếc lại đó: với mỗi từ, mô hình tính một điểm liên quan giữa từ ấy và mọi từ khác trong chuỗi, biến các điểm này thành trọng số cộng lại bằng 1, rồi lấy trung bình có trọng số các vector của cả chuỗi để tạo biểu diễn mới cho từ đang xét.

Hệ quả rất lớn: đường đi giữa hai vị trí bất kỳ chỉ còn một bước nên quan hệ xa không bị phai, và các từ được xử lý đồng thời nên tận dụng được phần cứng song song. Vì bản thân attention không biết gì về thứ tự, mô hình phải cộng thêm thông tin vị trí vào đầu vào. Kiến trúc Transformer chính là việc xếp chồng nhiều tầng attention như vậy. Cái giá là chi phí tính toán tăng theo bình phương độ dài chuỗi, và đó là lý do mô hình nào cũng có giới hạn cửa sổ ngữ cảnh.

Các tác vụ NLP

Sau khi văn bản đã thành vector, ta đưa vào mô hình để giải nhiều tác vụ khác nhau. Bảng dưới tóm tắt các tác vụ phổ biến.

Vài tác vụ NLP thường gặp
Tác vụMô tảVí dụ ứng dụng
Phân loại văn bảngán nhãn chủ đề cho một văn bảnlọc thư rác, phân loại tin tức
Phân tích cảm xúcxác định thái độ tích cực, tiêu cực, trung tínhđánh giá bình luận sản phẩm
Dịch máychuyển văn bản từ ngôn ngữ này sang ngôn ngữ khácdịch Việt sang Anh
Mô hình ngôn ngữdự đoán từ tiếp theo trong câugợi ý gõ phím, sinh văn bản
Nhận dạng thực thểtìm tên người, địa danh, tổ chức trong văn bảntrích thông tin từ hợp đồng
Hỏi đáptrả lời câu hỏi dựa trên văn bảntrợ lý ảo, chatbot
Tóm tắt văn bảnrút gọn văn bản dài thành ý chínhtóm tắt bài báo

Phân loại văn bản và phân tích cảm xúc về bản chất là cùng một loại bài toán: gán nhãn rời rạc cho một văn bản. Mô hình ngôn ngữ đặc biệt quan trọng vì nó học dự đoán từ tiếp theo, và chính khả năng này khi mở rộng cực lớn đã sinh ra các mô hình ngôn ngữ lớn biết trò chuyện, lập trình và suy luận.

Chọn mô hình theo bài toán

Không phải lúc nào cũng nên dùng mô hình lớn nhất. Một quy tắc thực hành hữu ích:

  • Dữ liệu ít (dưới khoảng 1000 mẫu), cần baseline nhanh: dùng Naive Bayes hoặc logistic regression với TF-IDF.
  • Dữ liệu trung bình, cần chính xác cao: tinh chỉnh (fine-tune) một mô hình pre-trained như BERT, hoặc PhoBERT cho tiếng Việt.
  • Sinh ngôn ngữ, hỏi đáp mở: dùng mô hình ngôn ngữ lớn qua API hoặc chạy cục bộ.

Đừng nhảy ngay sang mô hình lớn cho bài toán phân loại nhỏ: Naive Bayes có thể nhanh hơn hàng nghìn lần và đôi khi còn chính xác hơn.

Đánh giá: đo cái gì và đo thế nào

Với tác vụ phân loại, ta dùng bộ thước quen thuộc của học máy: độ chính xác tổng thể, và quan trọng hơn là precision, recall cùng điểm F1 cho từng lớp. Vì sao độ chính xác tổng thể chưa đủ? Vì dữ liệu ngôn ngữ thường mất cân bằng nặng: nếu chỉ một phần trăm thư là thư rác, một mô hình luôn trả lời "không phải thư rác" đã đạt chín mươi chín phần trăm mà hoàn toàn vô dụng. Precision trả lời "trong những cái tôi báo là thư rác, bao nhiêu phần đúng", còn recall trả lời "trong toàn bộ thư rác thật, tôi bắt được bao nhiêu phần"; hai thước này đánh đổi nhau và bài toán quyết định ta nghiêng về bên nào.

Với tác vụ sinh văn bản như dịch máy hay tóm tắt, khó khăn nằm ở chỗ không có một đáp án đúng duy nhất: một câu có nhiều bản dịch đều tốt. Các thước tự động dựa trên độ trùng lặp cụm từ với bản tham chiếu của con người chỉ là xấp xỉ thô, vì một bản dịch dùng từ đồng nghĩa có thể bị chấm điểm thấp dù nghĩa vẫn đúng, nên đánh giá bằng người vẫn là chuẩn cuối cùng. Nguyên tắc chung cho mọi tác vụ: đánh giá trên chính tác vụ mà bạn quan tâm, và luôn có một baseline tầm thường để biết mô hình của mình thật sự thêm được bao nhiêu.

Hạn chế và khi nào mô hình hỏng

Thiên lệch trong dữ liệu. Mô hình học từ văn bản do con người viết nên hấp thụ luôn mọi định kiến có trong văn bản đó. Nếu trong ngữ liệu một nghề nghiệp thường xuất hiện cạnh một giới tính, vector từ sẽ mã hóa luôn tương quan ấy, và mô hình tái sản xuất nó khi ta dùng nó để sàng lọc hồ sơ hay gợi ý nội dung. Đây không phải lỗi kỹ thuật: mô hình đang làm đúng việc nó được giao là học quy luật thống kê trong dữ liệu, nên muốn xử lý thì phải can thiệp ở tầng dữ liệu hoặc tầng ứng dụng.

Ảo giác. Mô hình ngôn ngữ được huấn luyện để sinh ra chuỗi từ có xác suất cao, chứ không phải chuỗi từ đúng sự thật, và hai điều này không phải lúc nào cũng trùng nhau. Khi không biết câu trả lời, mô hình vẫn sinh ra một câu trôi chảy, đúng ngữ pháp và có thể hoàn toàn bịa. Đây là hệ quả trực tiếp của mục tiêu huấn luyện nên nó không biến mất chỉ nhờ mô hình to hơn; cách giảm thiểu thực tế là buộc mô hình dựa vào nguồn tra cứu được, và luôn kiểm chứng lại mọi con số, mọi trích dẫn, mọi tên riêng nó đưa ra.

Trôi ngữ cảnh. Mô hình chỉ nhìn được một cửa sổ ngữ cảnh hữu hạn. Khi hội thoại vượt quá cửa sổ đó, phần đầu bị cắt bỏ và mô hình quên mất những ràng buộc đã thống nhất từ trước, dẫn tới tự mâu thuẫn với chính mình.

Hiểu nhầm thường gặp

"Mô hình hiểu ngôn ngữ như con người." Cái mô hình chắc chắn có là quy luật thống kê về việc từ nào hay đi cùng từ nào trong ngữ cảnh nào. Điều đó đủ để làm rất nhiều việc hữu ích, nhưng nó giải thích vì sao mô hình viết trôi chảy mà vẫn sai sự thật.

"Bỏ hết từ dừng thì luôn tốt hơn." Không. "không" là từ dừng theo nhiều danh sách chuẩn, nhưng bỏ nó đi thì "phim này không hay" biến thành "phim này hay".

"TF-IDF hay embedding hiểu được thứ tự từ." TF-IDF thì không, nó là túi từ. Embedding tĩnh cũng chỉ gán vector cho từng từ; muốn nắm thứ tự phải có mô hình chuỗi ở trên như RNN hoặc Transformer.

Mã nguồn Python

Đoạn mã sau minh họa bag-of-words bằng Python thuần, không dùng thư viện ngoài. Ta tách từ thô theo khoảng trắng, xây từ điển, rồi đếm tần suất từ cho từng câu để ra vector BoW.

# bag-of-words tu dau bang Python thuan

def tokenize(text):
# ha chu thuong roi tach theo khoang trang
return text.lower().split()

def build_vocab(documents):
# gom moi token duy nhat thanh tu dien co thu tu on dinh
vocab = {}
for doc in documents:
for token in tokenize(doc):
if token not in vocab:
vocab[token] = len(vocab)
return vocab

def bag_of_words(text, vocab):
# vector dem so lan moi tu xuat hien
vector = [0] * len(vocab)
for token in tokenize(text):
if token in vocab:
vector[vocab[token]] += 1
return vector

corpus = [
"toi yeu phim nay",
"toi ghet phim do",
"phim nay rat hay",
]

vocab = build_vocab(corpus)
print("Tu dien:", vocab)

for cau in corpus:
print(cau, "->", bag_of_words(cau, vocab))

Kết quả in ra từ điển và vector BoW của từng câu. Mỗi vector dài bằng số từ trong từ điển, mỗi vị trí là số lần từ tương ứng xuất hiện. Hãy để ý: hai câu khác thứ tự từ nhưng cùng tập từ sẽ cho cùng một vector, đúng với hạn chế "mất thứ tự" của BoW đã nói ở trên.

Ta cũng có thể tự đếm tần suất từ trên toàn bộ tập văn bản, một thao tác cơ sở khác:

# dem tan suat tu tren toan bo corpus

def word_frequency(documents):
freq = {}
for doc in documents:
for token in doc.lower().split():
freq[token] = freq.get(token, 0) + 1
return freq

corpus = [
"toi yeu phim nay",
"toi ghet phim do",
"phim nay rat hay",
]

freq = word_frequency(corpus)
# sap xep theo tan suat giam dan
for token, count in sorted(freq.items(), key=lambda x: -x[1]):
print(token, count)

Từ "phim" xuất hiện nhiều nhất, đúng trực giác. Một bộ đếm tần suất đơn giản như vậy chính là viên gạch đầu tiên để xây TF-IDF và nhiều kỹ thuật NLP cổ điển khác.

Bài tập thực hành

Bài 1. Viết hàm Python nhận vào một danh sách câu và trả về vector TF (term frequency) đã chuẩn hóa cho mỗi câu, tức là mỗi vector BoW chia cho tổng số từ trong câu đó.

Gợi ý

Tái sử dụng build_vocabbag_of_words ở trên. Với mỗi câu, lấy vector BoW rồi tính tổng các phần tử bằng sum(vector). Nếu tổng lớn hơn 0, chia từng phần tử cho tổng đó để ra tỷ lệ. Kết quả là vector số thực, các phần tử cộng lại bằng 1.

Bài 2. Cho từ điển kích thước V = 50000 và embedding số chiều d = 300. Tính số phần tử cần lưu để biểu diễn một tài liệu gồm 200 từ bằng one-hot, và bằng embedding. So sánh hai con số.

Gợi ý

One-hot: mỗi từ là một vector dài V, nên 200 từ cần 200 * 50000 phần tử, bằng 10 triệu (tuy hầu hết là số 0). Embedding: mỗi từ là vector dài d, nên cần 200 * 300 bằng 60000 phần tử dày đặc. Embedding tiết kiệm hơn khoảng 167 lần mà còn mang được ngữ nghĩa.

Bài 3. Dùng một bộ embedding pre-trained (ví dụ qua thư viện gensim) để kiểm tra phép tương tự king - man + woman. Từ nào nằm gần kết quả nhất?

Gợi ý

Tải một mô hình như glove-twitter-100 qua gensim.downloader. Dùng phương thức most_similar với tham số positive=["king", "woman"]negative=["man"]. Từ đứng đầu danh sách thường là queen. Cosine similarity càng gần 1 thì hai vector càng giống hướng.

Tự kiểm tra

Vì sao word embedding bắt được ngữ nghĩa còn one-hot thì không?

Vì one-hot đặt mọi từ cách đều nhau trong không gian, nên khoảng cách giữa các vector không chứa thông tin gì về nghĩa. Word embedding học từ ngữ cảnh theo giả thuyết phân phối, nên từ gần nghĩa được đặt gần nhau, và khoảng cách hay hướng giữa các vector phản ánh quan hệ ngữ nghĩa thực sự.

Hai câu "chó cắn người" và "người cắn chó" có cùng vector bag-of-words không? Vì sao?

Có, chúng cho cùng một vector bag-of-words, vì BoW chỉ đếm số lần mỗi từ xuất hiện mà bỏ qua thứ tự từ. Đây là hạn chế cố hữu của BoW và TF-IDF. Muốn phân biệt được ý nghĩa phụ thuộc thứ tự, ta cần các mô hình giữ trật tự như RNN hoặc Transformer.

Vì sao cơ chế chú ý nắm quan hệ xa tốt hơn mạng hồi quy?

Trong mạng hồi quy, thông tin từ một từ ở đầu câu muốn tới một từ ở cuối câu phải đi qua toàn bộ các bước cập nhật trạng thái ẩn ở giữa và bị làm loãng dần, nên quan hệ càng xa càng khó giữ. Với cơ chế chú ý, mỗi từ tính điểm liên quan trực tiếp với mọi từ khác, nên đường đi giữa hai vị trí bất kỳ chỉ là một bước, không phụ thuộc khoảng cách. Thêm nữa attention xử lý các vị trí đồng thời nên huấn luyện song song được. Cái giá là chi phí tính toán tăng theo bình phương độ dài chuỗi, và vì attention không tự biết thứ tự nên phải cộng thêm thông tin vị trí.

Một mô hình lọc thư rác đạt độ chính xác 99 phần trăm. Vì sao con số này chưa nói lên điều gì?

Vì dữ liệu thư rác thường mất cân bằng nặng: nếu chỉ một phần trăm thư là thư rác, một mô hình luôn trả lời "không phải thư rác" cũng đạt đúng 99 phần trăm mà không bắt được lá thư rác nào. Cần xem precisionrecall cho riêng lớp thư rác, cùng điểm F1 và ma trận nhầm lẫn, và luôn so với baseline đoán luôn lớp đa số.

Câu hỏi tự kiểm

Kiểm tra nhanh: xử lý ngôn ngữ tự nhiên0/4 đúngchưa trả lời
  1. 1Vì sao tách từ tiếng Việt khó hơn tiếng Anh?
  2. 2Hai câu "chó cắn người" và "người cắn chó" cho vector bag-of-words như thế nào?
  3. 3Vì sao word embedding bắt được ngữ nghĩa còn one-hot thì không?
  4. 4TF-IDF giảm trọng số của loại từ nào?

Tóm tắt

Cả bài xoay quanh một chuỗi nhân quả duy nhất: máy chỉ tính được trên số, nên phải tách văn bản thành đơn vị, biểu diễn đơn vị thành vector, rồi mới đưa vào mô hình. Tách từ là bước dễ bị coi thường nhất mà lại quyết định nhiều nhất, đặc biệt với tiếng Việt, nơi ranh giới từ không trùng khoảng trắng. Ở tầng biểu diễn, túi từ và TF-IDF đơn giản, nhanh, dễ giải thích, đủ mạnh cho phân loại, nhưng mất thứ tự và coi mọi từ cách đều nhau; vector nhúng khắc phục cả hai bằng cách học từ ngữ cảnh theo giả thuyết phân bố. Điểm mù còn lại của vector nhúng tĩnh là mỗi từ chỉ có một vector bất kể ngữ cảnh, và đó chính là chỗ cơ chế chú ý bước vào.

Ba hạn chế cuối cùng không tự biến mất khi mô hình lớn hơn: mô hình hấp thụ thiên lệch có trong dữ liệu; nó được huấn luyện để sinh chuỗi có xác suất cao chứ không phải chuỗi đúng sự thật nên có thể bịa một cách trôi chảy; và cửa sổ ngữ cảnh hữu hạn khiến hội thoại dài bị trôi. Người dùng NLP có trách nhiệm biết ba điều đó, đo trên chính tác vụ mình quan tâm, và luôn giữ một baseline tầm thường để không tự lừa mình bằng những con số đẹp.

Ghi nhớ

Máy tính chỉ hiểu số, nên NLP luôn bắt đầu bằng tách từ rồi biểu diễn văn bản thành vector. Cách rời rạc (one-hot, bag-of-words, TF-IDF) đơn giản nhưng mất thứ tự và không bắt được ngữ nghĩa. Word embedding gán mỗi từ một vector dày đặc học từ ngữ cảnh, đặt từ gần nghĩa gần nhau và cho phép phép tương tự king - man + woman xấp xỉ queen. Trên nền biểu diễn đó, ta giải nhiều tác vụ: phân loại văn bản, phân tích cảm xúc, dịch máy, mô hình ngôn ngữ. Hãy chọn mô hình theo bài toán, đừng chạy theo trào lưu.