Xử lý tiếng Việt trong Python

Bài số 28 trong 28 bài của khóa học Python Không Khó

Trong bài chia sẻ này, Lập Trình Không Khó sẽ trình bày một số kiến thức liên quan tới việc xử lý tiếng Việt trong Python phục vụ cho các bài toán liên quan đến dữ liệu tiếng Việt (có dấu), đặc biệt là các bài toán trong lĩnh vực xử lý ngôn ngữ tự nhiên.Xử lý tiếng Việt trong Python

Đầu tiên, trước khi đi vào chi tiết các bài toán xử lý tiếng Việt với Python thì mình muốn trình bày sự khác nhau giữa Python 2 (Đã khai tử) và Python 3 đối với dữ liệu tiếng Việt.

Python 2 và Python 3

Đầu tiên, mình xin nhấn mạnh rằng Python đã bị khai tử (Chi tiết xem tại đây). Do đó, nếu bạn bắt đầu với Python, hãy sử dụng Python phiên bản 3 nhé.

Đối với Python 2

Trong Python 2, encoding mặc định là ASCII. Do đó, khi bạn làm việc với dữ liệu tiếng Việt, bắt buộc bạn phải khai báo encoding UTF-8 cho nó ở đầu file code .py của bạn:

Và đây là một số điều đặc biệt khi xử lý dữ liệu tiếng Việt với Python 2:

Ký tự ‘ế’ trong chữ ‘Hiếu’ bao gồm 3 ký tự khác nhau, dẫn đến độ dài của txt là 6. Đó là bởi chuỗi tiếng Việt của chúng ta sử dụng Unicode, trong khi string của Python coi nó là ASCII.

Để làm việc với Unicode trong Python 2, bạn cần làm như sau:

Với Python 3 thì sao?

Sang đến Python 3, encoding mặc định của các file .py là UTF-8. Do đó, bạn chỉ phải khai báo # -*- coding: utf-8 -*- khi bạn không ở trong sự mặc định đó, hoặc nếu các công cụ khác (như IDE hoặc trình soạn thảo văn bản của bạn) cần sử dụng thông tin đó.

Và việc sử dụng tiếng Việt cũng hết sức đơn giản:

Sau phần này, tất cả các kiến thức và kỹ thuật mình trình bày đều được áp dụng trên Python 3 nhé.

Xử lý tiếng Việt trong Python

Sử dụng regex với tiếng Việt

Yêu cầu: Mục này yêu cầu bạn cần có hiểu biết cơ bản về regex, bạn có thể đọc bài viết regex là gì trước khi tiếp tục nếu chưa rõ nhé.

Để sử dụng regex trong Python 3 với tiếng Việt, bạn có một số lưu ý như sau:

1. Để so khớp một từ tiếng Việt bất kỳ, bạn không thể sử dụng \b[a-zA-Z]+\b được. Bởi vì tiếng Việt của chúng ta có những ký tự có thanh sắc. Đây là danh sách đầy đủ ở dạng viết thường cho bạn:

Do đó, nếu bạn muốn so khớp một từ sử dụng thư viện re, hãy sử dụng regex này:

Trong trường hợp bạn cần so khớp không phân biệt hoa thường thì hãy dùng thêm flag IGNORE_CASE nhé:

2. Có một cách khác đơn giản hơn, là cài bổ sung thư viện regex thay vì dùng thư viện re có sẵn. Nó cung cấp cho chúng ta khả năng làm việc với tiếng Việt tốt hơn.

Sau đó bạn có thể sử dụng nó để so khớp chuỗi tiếng Việt đơn giản hơn.

Ở đây, \p{L} sẽ khớp với một chữ cái bất kỳ trong bảng chữ cái của bất kỳ ngôn ngữ nào.

Chuẩn hóa bảng mã tiếng Việt

Đã bao giờ bạn gặp lỗi hai từ trông giống hệt nhau nhưng lại không giống nhau chưa? Hãy thử xem ví dụ này (Bạn có thể copy và chạy thử).

Nguyên nhân có lẽ là do người dùng sử dụng bộ mã khác nhau khi gõ tiếng Việt. Cụ thể đa số chúng ta đang dùng Unikey với bộ mã Unicode (dựng sẵn). Nhưng ở đâu đó, bộ mã Unicode tổ hợp vẫn được sử dụng. Do đó, đối với các nguồn dữ liệu thu thập trên internet thường bị lẫn cả 2 cách gõ này.

Cách khắc phục: Thay thế cách gõ Unicode tổ hợp bằng cách gõ của Unicode dựng sẵn.

Dưới đây là script dùng để thực hiện công việc thay thế kể trên. Ngoài ra, bạn cũng có thể dùng chức năng convert có sẵn trong Unikey trên Windows của anh Phạm Kim Long.

Chuẩn hóa kiểu gõ dấu tiếng Việt

Hiện nay, tiếng Việt có 2 kiểu gõ dấu khác nhau. Chúng lần lượt có tên là kiểu mới (ex: oà, uý) và kiểu cũ (ex: òa, úy). Chi tiết sự khác nhau bạn có thể xem tại đây.

Do đó, các bộ gõ tiếng Việt phổ biến hiện nay cũng cho phép tùy chỉnh chọn một trong hai cách gõ dấu kể trên. Dẫn đến các từ giống nhau nhưng lại có cách viết khác nhau khi chúng ta sử dụng dữ liệu văn bản vào các bài toán học máy. Do đó, việc cần làm là đưa chúng về một bộ gõ tiêu chuẩn.

Theo kinh nghiệm bản thân cũng như các văn bản, tài liệu mình tiếp xúc hàng ngày thì kiểu gõ cũ vẫn chiếm ưu thế tuyệt đối. Và mặc định các bộ gõ tiếng Việt cũng dùng kiểu cũ luôn.

Cách khắc phục: Đưa về kiểu gõ dấu cũ đối với các từ dùng kiểu gõ mới.

Script python dưới đây cung cấp cho bạn khả năng chuẩn hóa kiểu gõ về kiểu cũ, đồng thời không làm thay đổi cấu trúc dữ liệu gốc (giữ nguyên hoa thường, dấu ngắt câu,…).

Ngoài ra, script chuẩn hóa (bảng mã, cách gõ dấu) còn có phiên bản ngôn ngữ Java, bạn có thể xem đầy đủ cả 2 phiên bản Java và Python tại đây.

Trên đây là một số kỹ thuật xử lý tiếng Việt trong Python do bản thân mình ghi chép lại. Nếu bạn có những kỹ thuật khác thì đừng ngại chia sẻ dưới mục thảo luận của bài viết nhé.

Tài nguyên xử lý tiếng Việt

Ngoài các kỹ thuật mình giới thiệu ở trên, mục này mình sẽ để lại một số tài nguyên hữu ích cho bài toán xử lý tiếng Việt.

  1. Thư viện chuẩn hóa văn bản Tiếng Việt (Có sẵn wrapper cho Python) của anh langman (ai chơi Cộng đồng C Việt chắc khá quen nickname này). Thư viện này giúp bạn xử lý một số vấn đề thiếu nhất quán trong tiếng Việt, và một số vấn đề khác như sửa lỗi chính tả. Xem tại: https://github.com/langmaninternet/VietnameseTextNormalizer
  2. Danh sách 400 từ teencode tiếng Việt phổ biến nhất, có thể dùng làm từ điển để chuẩn hóa text mạng xã hội. Xem tại: https://gist.github.com/nguyenvanhieuvn/7d9441c10b3c2739499fc5a4d9ea06fb
  3. Updating…

Đọc thêm:

Các bài viết trong khóa họcBài trước: Xóa dấu tiếng Việt trong Java, JS, Python
Subscribe
Notify of
guest
0 Bình luận
Inline Feedbacks
View all comments