Thêm dấu tiếng việt python
Note: see the link below for the English version of this article. Show
https://duongnt.com/restore-vietnamese-diacritics Chắc chúng ta ai cũng đã từng nghe câu chuyện cười rằng Hôm nay, chúng ta sẽ sử dụng Transformer để thêm dấu cho Tiếng Việt không dấu. Giải pháp này sẽ áp dụng các kỹ thuật thường được sử dụng trong machine translation. Các bạn có thể download toàn bộ code ví dụ từ đường link dưới đây. https://github.com/duongntbk/restore_vietnamese_diacritics Và các bạn có thể download model cùng file vectorization từ đường link dưới đây. https://drive.google.com/drive/folders/1duBcp3YTsKeYz8xQThBsDjEUx3zRoLS3 Transformer là gì?Trước đây, các model RNN như LSTM hay GRU thường được sử dụng để giải quyết các bài toán NLP. Nhưng sau khi được giới thiệu vào năm 2017, Transformer đã nhanh chóng trở thành lựa chọn số một cho các vấn đề NLP, mà một trong số đó là bài toán machine translation. Đây cũng chính là công nghệ mà Google Translate đang sử dụng. Dưới đây là kiến trúc của một model Transformer đầu cuối. Sơ đồ này được lấy từ trang 359 của cuốn sách Deep Learning with Python by Francois Chollet. Như ta thấy từ sơ đồ, một model Transformer được cấu thành từ 2 phần là encoder và decoder. Chúng kết hợp với nhau để ánh xạ một đoạn văn trong tập nguồn tới đoạn văn tương ứng trong tập đích. Transformer và machine translationNhiệm vụ của encoder là chuyển đoạn văn nguồn thành tập các vector. Những vector này tạo thành encoded representation của đầu vào. Đồng thời, encoder đảm bảo tính tuần từ cho encoded representation này. Có nghĩa là các vector của ta vẫn giữ được thông tin về ngữ nghĩa của toàn đoạn văn. Nhiệm vụ của decoder là sinh dữ liệu đầu ra. Nó sử dụng Giả sử ta đã thêm token mồi
Mối liên hệ giữa machine translation và bài toán hôm naySau khi tìm hiểu về cách hoạt động của Transformer trong machine translation, tôi nảy ra một ý tưởng. Ta có thể coi Tiếng Việt không dấu là một ngôn ngữ mới và tìm cách dịch ngược nó về Tiếng Việt có dấu. Khi so sánh với một bài toán machine translation thông thường, ta có một số lợi thế lớn.
Dựa vào các điều trên, tôi tin rằng việc dịch từ Tiếng Việt không dấu sang Tiếng Việt có dấu sẽ đạt được độ chính xác cao hơn các bài toán machine translation thông thường. Chuẩn bị dữ liệuTa sẽ sử dụng dataset Old Newspapers từ Kaggle trong bài hôm nay. Nó có khoảng 16 triệu câu, nhưng chỉ có tầm 720,000 câu Tiếng Việt. Dataset này được lưu trong một
file Ta có thể chạy ứng dụng từ command line.
Dưới đây là một vài dòng trong file đầu ra.
Train thử một model đơn giảnBước preprocessingNhư thường lệ, code để train model được viết bằng Python và sử dụng framework Keras. Đầu tiên, ta đọc dữ liệu từ file, rồi chia nó thành tập training, tập validation, và tập test.
Chú ý là ta chỉ đọc Ta tạo source vectorization và target vectorization từ tập training. Những vectorization này được dùng để chuyển dữ liệu từ dạng text sang tensor, nhờ thế ta có thể train model deep learning bằng các tensor đó. Đừng quên lưu lại các vectorization.
Bước tiếp theo là chuyển dataset của ta từ dạng text sang
Dùng lớp TransformerModel để train modelTa dùng lớp
Sau các bước trên, ta có thể khởi tạo model và bắt đầu train. Ta sẽ train model trong 50 epoch và chỉ giữ lại phiên bản với validation accuracy cao nhất.
Kết quả đầu tiênVì ta chỉ dùng
Hãy xem thử giá trị loss/accuracy tại từng epoch. Có thể thấy rằng validation loss/accuracy là xấp xỉ training loss/accuracy. Có nghĩa là model của ta vẫn đang underfitting. Thiết lập mặc định không có đủ capacity để thực hiện dịch. Tăng capacity cho modelCó một số cách để tăng capacity cho model. Ta có thể tăng số dimension trong layer embed và layer Dense của Transformer, tăng số attention head, và giảm tỷ lệ dropout. Nhưng tiếc là thiết lập mặc định cũng đã gần quá sức với GPU của tôi. Tôi không thể tăng số dimension của layer embed lên quá 256. Và 16 attention head là giới hạn tối đa mà tôi có thể dùng nếu không muốn GPU bị lỗi hết bộ nhớ. Tiếp theo, ta sẽ train 2 model bằng
Kết quả thu được như sau. Ta đã đạt được validation accuracy là Train model bằng toàn bộ dữ liệuTừ kết quả trên, ta sẽ dùng
Lần này, bước train model tốn mất hơn 2 ngày, và cho kết quả như dưới đây.
Ta đã đạt được test accuracy là Thêm dấu cho một vài ví dụTa thử chạy một số câu không dấu dưới đây qua model.
Cách tiếp tục train model sau khi tạm dừngNhư đã nói ở trên, thời gian train model của ta trên toàn bộ dữ liệu là hơn 2 ngày. Vì thế, ta cần phải có cách để tạm dừng rồi tiếp tục quá trình train. Thật may là Keras có hỗ trợ chức năng này.
Kết thúcThêm dấu cho Tiếng Việt không dấu là một vấn đề thú vị với nhiều ứng dụng trong thực tế. Tôi tìm được bài báo khoa học này của nhóm nghiên cứu trường ĐHBKHN (các bạn cùng lớp có thể vẫn nhớ cô Trang, cô dạy môn Lập trình hướng đối tượng hồi năm thứ 3). Nhóm nghiên cứu dùng Transfomer kết hợp với một vài phương pháp khác để thêm dấu cho từng chữ cái (thay vì thêm dấu cả từ như trong bài hôm nay). Phương pháp đó có độ chính xác là 98.37%, nhưng cần lượng dữ liệu lớn gấp 15 lần, đồng thời cần dùng tới GPU Tesla V100 PCIe để train model trong 5 ngày. Giá mà tôi cũng có card Tesla V100:). Nếu tăng capacity của model hơn nữa và train trên một tập dữ liệu lớn hơn thì biết đâu tôi cũng sẽ đạt được độ chính xác tương tự. Tuy nhiên, tôi nghĩ là với một project làm cho vui thì test accuracy đạt tới |