Trong vai một người viết, điều khó nhất mà tôi thấy là dùng từ thế nào để diễn đạt ý sắp viết ra. Từ lúc suy nghĩ cho đến lúc đặt tay xuống gõ, đôi khi không biết phải gõ gì, gõ như thế nào để viết thành điều muốn nói. Mặc dù biết ý tưởng đó là gì, nhưng làm thế nào để viết câu cú cho trôi chảy, ai đọc cũng hiểu thì quả thật là rất khó.
Thông thường, cách mà tôi thường làm là lập dàn ý cho những gì muốn nói. Rồi từ các ý đó viết thành các đoạn. Không cần phải viết hay ngay từ đầu mà chỉ cần viết ra những gì đang nghĩ, câu nào, chữ nào hiện ra trong đầu thì cứ ghi ra, sau khi xong hết cả thảy thì mới quay lại nắn nót. Vài ba lần như thế, thậm chí cả chục lần viết đi viết lại thì mới ưng. Nhưng mà buồn cười ở chỗ vẫn bài đó, vài ngày sau đọc lại thì lại thấy lấn cấn, muốn sửa tiếp. Nhưng không phải bài nào cũng có thời gian sửa vì nếu cứ lặp đi lặp lại cái chu trình này thì không thể xuất bản thêm được bài viết mới nào nữa. Ngập lụt trong mớ đòng đong mình viết ra cũng đủ để tạo thành một vòng lặp vô tận.
Một vấn đề khác chỉ xếp sau viết là kiểm tra chính tả. Chính tả thôi mà, có gì khó khăn đâu nhỉ? Chỉ cần đọc kỹ lại bài viết là có thể phát hiện ra lỗi sai rồi mà? Nếu nghĩ như vậy, xin chúc mừng bạn có khả năng kiểm soát ngôn ngữ rất tốt. Còn với tôi không may mắn được như vậy. Cho dù có đọc đi đọc lại nhiều lần thì vẫn có khả năng sai sót ở đâu đó. Nếu không ai chỉ thì không bao giờ biết được. Thi thoảng, một vài lỗi chính tả phát hiện ra nhờ vào quá trình đọc lại ngẫu nhiên mà tôi thường áp dụng trên các bài viết của mình.
Đã nhiều lần đi tìm sự trợ giúp trên mạng. Tìm cách kiểm tra chính tả tiếng Việt cho các bài mới viết ra. Ban đầu tìm được trang web cho nhập văn bản vào để kiểm tra, nhưng kết quả cho ra không như mong đợi nên thôi không dùng nữa. Nhiều người hướng dẫn dùng bộ kiểm tra chính tả mặc định của trình duyệt hoặc hệ điều hành, nhưng tất cả đều không hiệu quả, lại thêm phần phức tạp nữa nên thôi. Thậm chí tôi đã tìm đến sự trợ giúp của các mô hình ngôn ngữ lớn (LLM) nhưng chúng cũng đành bó tay trước lượng dữ liệu đưa vào. Ngày qua ngày, bài thì vẫn viết, lỗi thì vẫn còn khiến mình luôn đau đáu trong lòng.
Trong một lần tình cờ lang thang trên mạng, tôi tìm thấy dự án underthesea được giới thiệu như là một bộ công cụ xử lý ngôn ngữ tự nhiên cho tiếng Việt. Đây là dự án mã nguồn mở, có vẻ như được phát triển bởi các lập trình viên người Việt. Thật uy tín, ngó qua xem nó làm được gì nào!
Sau một vài giờ nghiên cứu, thư viện này cung cấp các hàm để xử lý nội dung tiếng Việt. Ví dụ nó chia văn bản thành các câu riêng lẻ, thành các từ riêng lẻ hoặc phân tích cấu trúc ngữ pháp... Lúc này, tôi cố tìm xem thư viện có cung cấp hàm nào để kiểm tra chính tả không thì rất tiếc là không có. Xem ra kiểm tra chính tả vẫn là một bài toán nan giải. Tưởng dừng lại ở đó thì trong đầu chợt nảy ra một ý tưởng táo bạo: Nếu thư viện có thể tách văn bản thành các từ riêng lẻ, xong mang những từ đó đi so sánh với từ điển tiếng Việt thì chuyện gì sẽ xảy ra? Đúng vậy! Nếu nó không có trong từ điển tiếng Việt, khả năng nó là từ sai chính tả càng lớn.
Ví dụ một câu "Chàng trai 9X Quảng Trị khởi nghiệp từ nấm sò", sau khi đi qua hàm word_tokenize
được tách thành ["Chàng trai", "9X", "Quảng Trị", "khởi nghiệp", "từ", "nấm", "sò"]
, lúc này chỉ việc mang những từ kia đi so sánh với từ điển là xong.
Nghĩ là làm, tôi bắt tay vào thử nghiệm luôn ý tưởng lớn này. Tại thời điểm viết bài, về cơ bản tôi đã làm được và chứng minh là nó có hiệu quả. Tuy vậy quá trình này không mấy suôn sẻ. Nhân tiện viết luôn bài này nhằm mục đích lưu trữ, vừa dùng để tra cứu hoặc giới thiệu đến bạn đọc, vì biết đâu ai đó có thể mang đến giải pháp hay hơn thì sao.
Trước tiên hãy dành thời gian để phân tích bài toán cần giải quyết. Mục đích cuối cùng là để chỉ ra những từ sai chính tả trong bài viết. Như vậy đầu vào là nội dung, đầu ra là các từ sai chính tả, rồi dựa vào đó đi kiểm tra xem có đúng hay không. Nhưng thế nào là sai chính tả?
Có nhiều nguyên nhân dẫn đến lỗi sai chính tả như ở trong các trường hợp dưới đây.
Lỗi sai âm tiết. Ví dụ bạn muốn viết từ "chưa" nhưng lại gõ thành "chuwa", hoặc "không" thành "khôong"... nói chung là những từ này dễ nhận biết nếu đọc kỹ.
Lỗi sai phụ âm. Ví dụ "đến trường đi học" thì lại viết thành "đến chường đi học", "xuất sắc" thì thành "suất xắc"... Các lỗi này hơi khó phát hiện bằng cách thông thường.
Lỗi nhầm lẫn dấu thanh (dấu ?/~). Lỗi này chắc phổ biến nhất trong số các lỗi thường gặp hoặc bị mắc phải. Ví dụ "chẳng lẽ" thì lại viết thành "chẵng lẽ"...
Lỗi sai phương ngữ có thể do đặc trưng vùng miền. Ví dụ "biết" thì viết thành "biếc", "sân" thì thành "sâng"...
Dùng từ sai. Ví dụ "chín muồi" thì lại viết "chín mùi", "đi tham quan" thì thành "đi thăm quan"... Nhìn chung đây là lỗi khó phát hiện nhất vì nó liên quan nhiều đến vốn từ của người viết.
Ngoài ra còn một số lỗi khác như viết không đúng quy cách, ví dụ "trời đổ những hạt mưa li ti xuống mặt đất ,bỗng...". Không viết hoa tên riêng, danh từ riêng...
Phân tích đến đây đủ để thấy bài toán kiểm tra chính tả không hề đơn giản chút nào, có rất nhiều lỗi có thể xảy ra trong quá trình viết, bên cạnh đó cách nhận biết những lỗi này cũng từ đơn giản cho đến khó khăn hơn nhiều. Nếu áp chúng vào hệ quy chiếu của tôi thì các lỗi liên quan đến việc dùng từ sai và nhầm lẫn dấu thanh diễn ra phổ biến hơn cả, mà đó toàn là lỗi khó phát hiện. Để tránh thì cách tốt nhất vẫn là nên tra cứu từ điển cho mỗi từ viết ra.
Vậy nên sau khi tìm thấy dự án underthesea, trong đầu nảy ra sáng kiến chế công cụ kiểm tra chính tả dựa trên từ điển mà không chút do dự.
Nói về cách làm thì ngay từ đầu đã hình dung ra các hướng triển khai cho công cụ kiểm tra chính tả này.
Thứ nhất underthesea được viết bằng python nên muốn dùng mình phải biết python. Mặc dù python nổi tiếng là một trong những ngôn ngữ lập trình dễ học, nhưng do chưa tiếp xúc nhiều nên khả năng phải mất thêm một thời gian để đọc những kiến thức cơ bản. Sự thật không thể chối cãi là ngày nay công nghệ tiến bộ hơn xưa rất nhiều. Bằng sự trợ giúp của nhiều công cụ AI Generator mà rào cản ngôn ngữ được thu hẹp đáng kể. Thứ mà lập trình viên nên chú trọng hơn vào lúc này là tư duy thay vì cú pháp của ngôn ngữ, còn lại AI là cánh tay phải đắc lực giúp làm những điều còn lại.
Về kiến trúc, ý tưởng là xây dựng một bộ "core" bằng python sử dụng underthesea, xuất ra các API cần thiết. Việc xử lý như sửa lỗi tự động hoặc là tương tác với dữ liệu thì viết bằng ngôn ngữ quen thuộc hơn như JavaScript. Với kiến trúc này sẽ giúp cho việc triển khai ứng dụng nhanh và dễ dàng hơn. Tưởng tượng "core" như một máy chủ còn JavaScritp là máy khách giao tiếp với máy chủ python.
Từ điển tiếng Việt rất nhiều và phong phú, phải tìm được bộ từ điển càng đầy đủ, càng chi tiết thì càng tốt. Sau khi lang thang trên github, tôi tìm thấy một vài kho lưu trữ có các bộ từ điển này, mang về thử thì thấy vẫn còn nhiều từ chưa có trong từ điển. Trong lúc loay hoay thì phát hiện trong thư viện underthesea có tệp từ điển chứa hơn 74k từ. Ồ thật vi diệu, còn chần chừ gì nữa mà không dùng luôn nhỉ.
Một hạn chế nữa là hàm word_tokenize
vốn dùng để tách câu thành các từ có nghĩa không phải lúc nào cũng tách được từ theo mong đợi của mình. Nó có thể tách thành các cụm từ không có nghĩa, nhưng lại trở nên hợp lý hơn nếu có một từ khác. Rất may word_tokenize
hỗ trợ tham số fixed_words
để khắc phục điều này. Cần phải liệt kê ra được những cụm từ mà chúng ta không muốn tách để tạo thành một cụm từ có nghĩa, bỏ vào trong mảng fixed_words
thì công cụ tách theo cụm từ đã được định nghĩa.
Kết quả sau cùng bộ "core" kiểm tra chính tả là một tệp python, nhận dữ liệu thông qua pipe và đầu ra là một danh sách từ có khả năng sai chính tả. Ví dụ.
"Con ngựa đá con ngựa đá" | python3 index.py
Sau đó có thể kết hợp thêm lệnh lệnh cat
để lấy nội dung bài viết làm đầu vào.
cat articles/bai-viet.md | python3 index.py
Bộ "core" này cần phải biết cách học thêm từ mới và cả những cụm từ có nghĩa, nên giải pháp là tạo ra 2 tệp chứa từ mới và cụm từ có nghĩa. Khi chạy, "core" tải hai nội dung này vào và xử lý. Nội dung thêm mới vào 2 tệp này bằng cách thủ công hoặc dùng một công cụ tự động nào đó tích hợp vào trong ứng dụng CLI quản lý bài viết của 2coffee.dev.
Như vậy chúng ta đã xác định được rõ nhu cầu của mình, phân tích những lỗi sai phổ biến và cả dự kiến cách làm. Trong phần tiếp theo tôi sẽ trình bày chi tiết hơn các bước triển khai. Hãy đón chờ nhé!
5 bài học sâu sắc
Mỗi sản phẩm đi kèm với những câu chuyện. Thành công của người khác là nguồn cảm hứng cho nhiều người theo sau. 5 bài học rút ra được đã thay đổi con người tôi mãi mãi. Còn bạn? Hãy bấm vào ngay!
Đăng ký nhận thông báo bài viết mới
Bình luận (0)