HocThuatSo.comHọc Thuật Số
Gửi thư
Python cho nghiên cứu

Xử lý văn bản tiếng Việt bằng Python: tách từ, chuẩn hoá dấu, từ dừng

Chuẩn hoá Unicode dựng sẵn và tổ hợp, thống nhất kiểu bỏ dấu, tách từ tiếng Việt bằng underthesea hoặc pyvi, lọc từ dừng, đếm tần suất, và những giới hạn cần ghi rõ trong bài.

Xử lý văn bản tiếng Việt bằng Python: tách từ, chuẩn hoá dấu, từ dừng

Xử lý văn bản tiếng Việt bằng Python gồm bốn bước theo thứ tự: chuẩn hoá Unicode về dạng dựng sẵn NFC, thống nhất kiểu đặt dấu thanh, tách từ bằng công cụ dành cho tiếng Việt như underthesea hoặc pyvi, rồi lọc từ dừng và đếm tần suất. Bỏ qua bước đầu, cùng một từ có thể bị đếm thành hai.

Tiếng Việt khó hơn tiếng Anh ở hai chỗ. Một chữ có dấu có thể được mã hoá theo hai cách nhìn giống hệt nhau trên màn hình. Và đơn vị nghĩa thường là từ ghép nhiều âm tiết như “nghiên cứu”, “đại học”, trong khi dấu cách lại ngăn từng âm tiết. Ví dụ trong bài đã chạy thử với underthesea 9.5 và pyvi.

Vì sao hai chữ giống hệt nhau lại không bằng nhau?

Dựng sẵn và tổ hợp

Chữ “à” có thể lưu là một ký tự dựng sẵn, hoặc chữ “a” cộng một dấu huyền tổ hợp. Văn bản chép từ PDF, từ trang web cũ, hay gõ bằng bộ gõ đặt chế độ khác thường trộn cả hai. Khi chạy thử, chuỗi “Hoà Bình” dạng dựng sẵn dài 8 ký tự, dạng tổ hợp dài 10, và phép so sánh bằng trả về False.

Sửa bằng một dòng

import unicodedata rồi s = unicodedata.normalize('NFC', s). NFC đưa mọi chữ về dạng dựng sẵn, là dạng phổ biến nhất. Làm bước này ngay khi đọc văn bản vào, trước mọi bước khác.

Ký tự trông giống

Chữ “Đ” tiếng Việt là U+0110. Một số phông và văn bản chuyển đổi dùng nhầm “Д U+00D0 của tiếng Iceland; hai chữ trông y hệt nhưng khác mã, NFC không gộp chúng. Khi đếm thấy một từ bị tách thành hai dòng giống hệt nhau, in mã ký tự bằng [hex(ord(c)) for c in tu] để soi.

Kiểu đặt dấu: hoà hay hòa

NFC không giải quyết được chuyện kiểu bỏ dấu. “hoà” và “hòa”, “thuỷ” và “thủy”, “uỷ ban” và “ủy ban” đều đúng chính tả theo hai thói quen khác nhau, nhưng là các chuỗi khác nhau. Một bộ văn bản gom từ nhiều nguồn sẽ có cả hai, và bảng tần suất sẽ chia đôi số đếm của cùng một từ.

Hàm text_normalize của underthesea đưa văn bản về một kiểu thống nhất. Khi chạy thử, hàm đổi “hoà thuỷ uỷ ban” thành “hòa thủy ủy ban”, tức kiểu đặt dấu trên nguyên âm thứ nhất, đồng thời tách dấu câu khỏi chữ. Nếu nhóm muốn kiểu ngược lại hoặc không muốn đụng dấu câu, tự viết một bảng thay thế nhỏ cho các vần oa, oe, uy và áp lên văn bản đã NFC. Dù chọn cách nào, ghi lại trong phần phương pháp.

Công cụ tách từ tiếng Việt

Tách từ là gộp các âm tiết thuộc cùng một từ, thường nối bằng gạch dưới: “Sinh_viên đại_học”. Ba lựa chọn hay gặp:

Công cụCài và gọiĐiểm mạnhLưu ý
undertheseapip install underthesea; word_tokenize(s)Bộ công cụ rộng: tách từ, gán nhãn từ loại, chuẩn hoáLần đầu dùng một số chức năng sẽ tải thêm mô hình
pyvipip install pyvi; ViTokenizer.tokenize(s)Gọn, nhanh, trả chuỗi nối bằng gạch dướiÍt chức năng hơn
VnCoreNLPGói Java, có giao diện PythonChuỗi xử lý đầy đủ, hay được trích trong bài báoCần cài Java

Gọi underthesea: from underthesea import word_tokenize, rồi word_tokenize(s) trả danh sách từ, word_tokenize(s, format='text') trả một chuỗi các từ nối bằng gạch dưới. Với câu “Sinh viên đại học Bách khoa nghiên cứu học máy ở Hà Nội”, cả underthesea và pyvi đều cho “Sinh_viên đại_học Bách_khoa nghiên_cứu học máy ở Hà_Nội”: đúng phần lớn, nhưng “học máy” bị tách làm hai, đúng kiểu sai sót với thuật ngữ chuyên ngành.

Từ dừng: dùng danh sách có sẵn hay tự lập?

Từ dừng là những từ xuất hiện dày nhưng ít mang nghĩa nội dung: “và”, “của”, “là”, “thì”, “những”, “các”. Có nhiều danh sách từ dừng tiếng Việt chia sẻ công khai, khác nhau về độ dài và về việc liệt kê theo âm tiết hay theo từ đã tách. Danh sách theo âm tiết dùng sau bước tách từ sẽ lọc sót, và ngược lại.

Cách làm chắc hơn: bắt đầu từ một danh sách công khai, đếm tần suất trên chính bộ văn bản của bạn, xem 100 đến 200 từ đứng đầu và quyết định thêm bớt. Một từ vô nghĩa trong văn bản báo chí, như “nghiên_cứu” trong bộ tóm tắt luận án, có thể đáng bỏ đi vì xuất hiện ở hầu như mọi văn bản. Lưu danh sách cuối cùng thành tệp chữ trong dự án và nộp kèm.

Đếm tần suất từ: đoạn mã đầy đủ

Ghép các bước lại cho một danh sách văn bản van_ban:

  1. Chuẩn hoá: vb = [unicodedata.normalize('NFC', x) for x in van_ban], rồi áp text_normalize nếu chọn thống nhất kiểu dấu.
  2. Đưa về chữ thường: x.lower() xử lý đúng chữ có dấu, kể cả “Đ”.
  3. Tách từ: tu = [w for x in vb for w in word_tokenize(x.lower())].
  4. Bỏ dấu câu và số: giữ các từ có ít nhất một chữ cái, ví dụ lọc bằng re.search(r'[^\W\d_]', w); trong Python 3, \w nhận đúng chữ cái tiếng Việt.
  5. Bỏ từ dừng: tu = [w for w in tu if w not in tu_dung].
  6. Đếm: from collections import Counter, rồi Counter(tu).most_common(30).

Lưu ý underthesea trả từ ghép ở dạng có dấu cách bên trong, như “sinh viên”, khi gọi không kèm format='text'. Danh sách từ dừng phải cùng dạng với đầu ra bạn đang dùng.

Tách câu, cụm từ và ma trận từ

Tách câu

Nhiều phân tích cần đơn vị câu, ví dụ đếm câu có nhắc tới một khái niệm. from underthesea import sent_tokenize rồi sent_tokenize(doan) trả danh sách câu. Khi chạy thử với ba câu kết thúc bằng dấu chấm, chấm than và chấm hỏi, hàm tách đúng cả ba. Văn bản có nhiều chữ viết tắt kèm dấu chấm như “TS.”, “PGS.”, “tr.” nên được kiểm tay một mẫu.

Cụm hai, ba từ

Đếm cặp từ đứng liền nhau giúp thấy các cụm như “chất_lượng đào_tạo” mà đếm từ đơn bỏ lỡ. Với danh sách từ đã tách tu, các cặp là list(zip(tu, tu[1:])), đếm bằng Counter như trên. Thuật ngữ chuyên ngành bị công cụ tách sai có thể được nối lại bằng một từ điển riêng trước khi đếm.

Ma trận văn bản – từ

Để đưa vào mô hình chủ đề hay phân loại, cần ma trận mỗi văn bản một dòng, mỗi từ một cột. Với scikit-learn, nối các từ đã tách bằng dấu cách rồi dùng CountVectorizer(tokenizer=str.split, lowercase=False) để công cụ giữ nguyên các từ ghép có gạch dưới, thay vì tự tách lại theo quy tắc của tiếng Anh. Tham số min_df bỏ những từ xuất hiện ở quá ít văn bản.

Giới hạn cần ghi rõ trong bài

Công cụ xử lý tiếng Việt chủ yếu được huấn luyện trên văn bản báo chí và văn bản chung. Khi dùng cho tư liệu nghiên cứu, những giới hạn sau nên được nêu trong phần phương pháp:

  • Thuật ngữ chuyên ngành, tên riêng, từ mượn hay bị tách sai. Kiểm tay một mẫu ngẫu nhiên vài trăm từ và ghi tỷ lệ sai bạn tự đo, nếu đo.
  • Văn bản mạng xã hội có chữ viết tắt, không dấu, kiểu gõ teencode; công cụ tách từ cho kết quả kém hơn nhiều.
  • Văn bản cũ có chính tả trước cải cách hoặc chữ Hán Việt hiếm cần xử lý riêng.
  • Kết quả đếm phụ thuộc phiên bản công cụ; ghi phiên bản underthesea hoặc pyvi đã dùng.
  • Việc KHÔNG nên làm: bỏ dấu toàn bộ văn bản cho “dễ xử lý”. Mất dấu là mất phân biệt giữa “bàn”, “bán”, “bạn”.

Lưu đầu ra của từng bước ra tệp riêng: văn bản đã chuẩn hoá, văn bản đã tách từ, danh sách từ dừng, bảng tần suất. Tách từ một bộ văn bản lớn có thể mất nhiều phút, không nên chạy lại mỗi lần chỉ muốn sửa danh sách từ dừng. Các tệp trung gian cũng là bằng chứng để người khác kiểm lại quyết định của bạn, và là thứ nên nộp kèm cùng mã khi tạp chí yêu cầu chia sẻ dữ liệu và mã.

Câu hỏi thường gặp

Có cần chuẩn hoá NFC nếu văn bản gõ từ một nguồn?

Vẫn nên làm. Chỉ cần một đoạn chép từ PDF hay trang web là văn bản đã có thể lẫn dạng tổ hợp. Chuẩn hoá NFC tốn rất ít thời gian và không làm hỏng văn bản đã chuẩn.

underthesea có cần GPU không?

Tách từ và chuẩn hoá chạy được trên máy tính thường không có GPU. Một số chức năng nâng cao dùng mô hình lớn hơn có thể cần tải thêm và chạy chậm hơn trên máy yếu.

Có nên tách từ trước khi đưa vào mô hình chủ đề không?

Thường nên, vì đơn vị nghĩa của tiếng Việt là từ chứ không phải âm tiết. Tuy vậy, nên chạy thử cả hai cách trên một mẫu nhỏ và xem kết quả nào dễ diễn giải hơn với dữ liệu của bạn.

Làm sao xử lý văn bản không dấu?

Đây là bài toán khôi phục dấu, khó và dễ sai. Nếu tỷ lệ văn bản không dấu nhỏ, cân nhắc phân tích riêng hoặc loại ra kèm ghi chú; nếu lớn, cần công cụ khôi phục dấu và kiểm tay kết quả.

Đếm tần suất theo âm tiết có sai không?

Không sai, chỉ là một lựa chọn khác. Đếm theo âm tiết đơn giản và không phụ thuộc công cụ tách từ, nhưng khó diễn giải với từ ghép. Ghi rõ đơn vị đếm trong bài.

Cần tư vấn cụ thể cho trường hợp của bạn?

Chúng tôi sẽ liên hệ trong vòng 24 giờ.

Đăng ký tư vấn ngay

Bài viết liên quan

🧭
Bạn đang ở chặng nào của đường học vị?
Nhập chỗ bạn đang đứng và đích bạn nhắm — công cụ trả về số năm, chi phí và việc phải làm từng chặng.
Xem lộ trình của tôi →
Miễn phí, không cần tài khoản. Xem tất cả công cụ

Bạn cần hỗ trợ thêm?

Để lại thông tin, chúng tôi sẽ liên hệ trong 24 giờ.

hoặc
[email protected]