Chuẩn hóa (viết hoa các danh từ riêng) trong văn bản tiếng Việt viết thường

Mình đang có những câu văn bị viết thường 100%, mục tiêu của mình là tìm kiếm các từ cần viết hoa chữ cái đầu(tên người, địa điểm, tên tổ chức,…).
Với phần quy tắc viết hoa sau dấu câu/ bắt đầu câu thì mình đã xử lý ổn thỏa rồi.

Ví dụ:
Input

từ 7h30 sáng 10/4, lễ tang trung tướng đồng sỹ nguyên - nguyên ủy viên bộ chính trị, nguyên phó chủ tịch hội đồng bộ trưởng được tổ chức theo nghi thức lễ tang cấp nhà nước tại nhà tang lễ quốc gia, số 5, trần thánh tông, hà nội.

Output

Từ 7h30 sáng 10/4, lễ tang Trung tướng Đồng Sỹ Nguyên - nguyên Ủy viên Bộ Chính trị, nguyên Phó chủ tịch Hội đồng Bộ trưởng được tổ chức theo nghi thức Lễ tang cấp Nhà nước tại Nhà tang lễ quốc gia, số 5, Trần Thánh Tông, Hà Nội. 

Vậy rất mong được mọi người giúp đỡ, đóng góp ý kiến giúp mình giải quyết bài toán này ạ.

Đùa tí, phần bạn xử lý chỉ bé như mẩu “cứt mũi” giữa một bể bơi. Còn phần bạn muốn mọi người giúp, nó là cái bể bơi… và là phần việc rất khó, ngay cả Google còn bó tay. Lý do:

  1. Chúng ta không tìm thấy những tài liệu đáng tin cậy để quyết định lúc nào viết thường/ viết hoa mà chỉ theo khuyến cáo của cơ quan nọ kia. Ví dụ như Bộ Nội vụ <= click. Điều này khiến bạn không thể định nghĩa được lúc nào cần viết hoa, lúc nào không => lập trình thế nào?

  2. Hầu hết anh em vào Dạy Nhau Học đều không phải là nhà ngôn ngữ/ nghiên cứu về câu, chữ để tự xây dựng được quy tắc viết hoa.

  3. Dạy máy tính “đọc hiểu” được một chữ trong câu nên viết thường hay viết hoa là việc quá khó, các hãng lớn như Facebook, Google, và vài hãng tự hào với trí tuệ nhân tạo còn cảm thấy bó tay trong việc xử lý ngôn ngữ.

Như vậy, cách xử lý tạm ổn với cấp độ sinh viên hoặc lập trình viên bình thường chỉ là ta sẽ làm từ điển từ, cụm từ để đối chiếu vào đó mà viết hoa một số từ khi bắt gặp. Trường hợp này sẽ giải quyết được một số từ/ ngữ nhất định mà thôi, còn lại có khi viết hoa đến buồn cười.

Ví dụ ta có từ điển lưu hàng ngàn/ hàng chục ngàn cụm từ để nếu dò thấy những từ như: việt nam, nguyễn văn, nguyễn thị,… thì Pascal Case thành Việt Nam, Nguyễn Văn, Nguyễn Thị…

Nhưng rõ ràng cách này là có những tập hợp mà người làm ra tự điển không thể lường trước/ đoán biết được.

Bài toán này có phần nào đó giống với bài toán mà một số phần mềm cố gắng giải quyết: người dùng gõ tiếng Việt không dấu và phần mềm tự thêm dấu để tiết kiệm đánh máy/ convert từ văn bản tiếng Việt không có dấu hoặc một số máy tính cài bộ gõ tiếng Việt chưa được.

Như vậy, chủ topic nên tìm kiếm mấy tác giả của các phần mềm như EasyVN, Tockyvnkey Telex, VietnameseAccent, VietMarker và cả nhóm làm trình duyệt Cốc Cốc,… xem thử họ có gợi ý gì không.

6 Likes

Nếu mình chỉ đọc input thì ngoài tên ngườiđịa chỉ ra thì chưa chắc gì mình đã biết nên viết hoa những chữ khác như thế nào. Ví dụ: “Lễ tang”, “Nhà tang lễ quốc ga”, “Bộ Chính trị”.

Cái này chắc chỉ có dựa vào các text corpus có sẵn trước thì may ra mới biết cách viết hoa như thế nào.

5 Likes

Paste vào google tìm kiếm sẽ ra câu chuẩn hóa nhé .

2 Likes

Mình cũng đánh giá đây là một bài toán khó, nhưng không có nghĩa là bất khả thi. Nếu có thể xử lý được 90% các vấn đề hoặc giải quyết được hết các trường hợp phổ biến(chấp nhận sai ở các TH đặc biệt) thì hoàn toàn khả thi.

Hiện tại, với các danh từ riêng ở mức độ phổ biến, mình đang áp dụng phương pháp thống kê trên tập dữ liệu báo chí lớn, nó tương tự cách bạn @superthin nói ở trên. Cách này cũng giải quyết được vấn đề mà bạn @hungaya nhắc đến(thực chất nó có quy tắc).
Sau bước này thì cũng đã xử lý được kha khá rồi.

Tuy nhiên, để nâng cao độ chính xác thì còn rất nhiều việc phải làm. Mình muốn đăng lên đây để hỏi mọi người các hướng có thể thử. Chia sẻ của các bạn rất có ý nghĩa với mình.

Cheer,

3 Likes

Bài toán này mình đã giải quyết xong và độ chính xác trong open domain tập test của mình đạt được khoảng 94% và đang sử dụng thực tế.

Ý tưởng là dùng mô hình của bài toán sequence labeling. Gán 4 nhãn: C (viết hoa chữ cái đầu), U (viết hoa cả từ), L (viết thường cả từ), O (các token khác)

trong	C
suốt	L
mấy	L
tháng	L
quay_phim	L
,	O
đã	L
có	L
lúc	L
anh	L
và	L
bạn	L
diễn	L
yến_trang	C
tranh_cãi	L
quyết_liệt	L
đến	L
mức	L
không	L
muốn	L
nói_chuyện	L
,	O
đối_thoại	L

Code cho bài toán này các bạn có thể xem trên github: https://github.com/topics/sequence-labeling

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?