Trang 8 trên tổng số 8 Đầu tiênĐầu tiên ... 678
Từ 71 tới 75 trên tổng số 75 kết quả

Đề tài: Tiếng việt trong Firebird database

  1. #71
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    742

    Mặc định Tiếng việt trong Firebird database

    Để sơ kết, mình nêu ra một số yêu cầu cho thuật toán so sánh và sắp xếp thứ tự tiếng Việt. Không phải là mọi yêu cầu, chỉ là một số yêu cầu mà lập trình viên dễ quên, do sơ ý.

    1. Chính xác. So sánh hai từ Việt, kết quả phải giống hệt như trong từ điển.

    2. Hợp lý. Các xâu gần giống nhau phải được sắp xếp ở gần nhau. Thí dụ, túy lúy, tuý luý, túy luýtuý lúy, nếu cùng có mặt trong cơ sở dữ liệu, phải được sắp xếp ở gần nhau. (Để ý rằng không có từ điển nào chứa nhiều hơn 1 trong 4 từ này.)

    3. Toàn bộ. Phép so sánh phải là hàm toàn bộ (total), nghĩa là xác định trên 2 xâu bất kỳ, chứ không chỉ 2 xâu tiếng Việt. Tất nhiên, không thể đòi hỏi một thuật toán so sánh và sắp xếp thứ tự cho tiếng Việt mà lại có thể bảo toàn thứ tự từ điển của các ngôn ngữ khác. Một thí dụ kinh điển [UCA, Table 5], bốn từ Pháp cote (mã), côte (xương sườn), coté (có ghi rõ độ cao, có tầm cao, có hạng), côté (cạnh sườn) được xếp trong từ điển [truyền thống] theo thứ tự đó, nhưng trong từ điển cách tân (hoặc nếu theo quy tắc sắp xếp Anh, Mỹ) thì thứ tự là cote, coté, côte, côté. Sự đảo lộn này là do theo truyền thống của tiếng Pháp, các dấu phụ đánh trên các chữ cái của một từ được xem xét theo thứ tự từ phải sang trái.

    4. Tinh nhất. So sánh hai xâu chỉ cho kết quả "bằng nhau" nếu chúng giống hệt nhau. Hai xâu khác nhau, bất kể khác biệt ấy nhỏ đến đâu, cũng phải cho kết quả là "nhỏ hơn" hoặc "lớn hơn". Chú ý là sự "giống hệt" hay "khác biệt" này là về điểm mã (sau chuẩn hóa), chứ không phải về mặt nhị phân, bởi vì hai xâu ấy không nhất thiết có cùng định dạng. Trong thực tế, nhiều khi so sánh thô là vừa đủ. Chẳng hạn, nếu gõ tìm từ ngựa gióng, rất có thể người dùng kỳ vọng tìm thấy cả ngựa GióngNGỰA GIÓNG. Nhưng 1 ứng dụng hay 1 thư viện thường phải có ít ra 1 hàm so sánh đến độ tinh cao nhất. Thí dụ, người dùng rất có thể sẽ thất vọng nếu phát hiện độc lập - tự do - hạnh phúc hiện hữu trong CSDL ngăn cản việc thêm hay sửa thành độc lập + tự do + hạnh phúc. Thí dụ khác, sẽ phản cảm nếu vì so sánh không đủ tinh, trong cùng một CSDL, nhà nước đứng trên nhà-nước còn nhân dân thì lại đứng dưới nhân-dân.

    5. Tương đồng. Gọi < và << lần lượt là một phép so sánh thô và một phép so sánh tinh trên cùng một tập dữ liệu. (Thí dụ, chỉ so sánh chữ cái là thô hơn so sánh cả chữ cái lẫn dấu thanh; so sánh cả các dấu ngăn cách là tinh hơn so sánh bỏ qua chúng.) Phải đảm bảo với x, y bất kỳ, hễ x < y thì x << y.
    Đã được chỉnh sửa lần cuối bởi Ada : 26-08-2021 lúc 10:25 AM.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  2. #72
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    742

    Mình dành bài cuối cùng này để nói về yêu cầu số 1 nêu trên, một yêu cầu thuần túy thực tiễn, bỏ qua 4 yêu cầu còn lại vốn mang nặng tính kỹ thuật (lý thuyết).

    Cấu hình phép so sánh xâu của thư viện ICU ở phần đặc thù cho tiếng Việt, xem ra là đúng, nhưng thuật toán UCA mà nó thực thi thì dường như là sai. UCA áp dụng mọi cấp ưu tiên ở phạm vi toàn xâu, trong khi từ điển VN áp dụng 2 cấp ưu tiên cao nhất, cấp 1 (chữ cái) và cấp 2 (dấu thanh) ở phạm vi từng chữ.

    Đơn cử, khi so sánh nguyện cầu với nguyền rủa, UCA đã đem so sánh nguyên câu với nguyên rua ở cấp 1 và định đoạt kết quả nguyện cầu < nguyền rủa ngay ở cấp 1; còn từ điển thì trước hết so sánh hai chữ đầu nguyện với nguyền, nghĩa là ở cấp 1 so sánh nguyên với nguyên và, do cấp 1 bất phân, cấp 2 so sánh nặng với huyền, và quyết định kết quả ngay ở chữ đầu, ngược với UCA, là nguyện cầu > nguyền rủa.

    Vấn đề trên gợi ra 2 câu hỏi.

    1. Vì sao UCA so sánh toàn xâu hơn là so sánh theo từng chữ (từ)?

    2. Thư viện ICU được sử dụng rộng rãi trong các chương trình xử lý dữ liệu, hệ thống thông tin, hệ thống quản trị CSDL và thậm chí các hệ điều hành. Vì sao lỗi sơ đẳng như thế mà không ai nhìn thấy?

    Mình giải đáp 2 câu hỏi này dựa theo phán đoán chủ quan.



    Ad 1. Theo [Wikipedia, bài "Alphabetical order", đoạn "Ordering in the Latin script", mục "Treatment of multiword strings"], đối với các xâu nhiều từ, có 2 cách so sánh. Một là theo từng từ (so sánh từ với từ), hai là theo từng chữ cái (so sánh chữ cái với chữ cái) sau khi đã nối các từ với nhau làm 1. Cách thứ hai thường dùng trong từ điển, cách thứ nhất thường dùng trong chỉ mục (ở cuối một quyển sách). Xin bổ sung, cách thứ nhất cũng được dùng trong từ điển bách khoa. Sở dĩ thế là vì trong từ điển, mỗi mục từ thường chỉ gồm 1 từ còn trong chỉ mục (hay từ điển bách khoa) mỗi mục từ thường là một chuỗi 2 - 3 từ. Vì từ điển thông dụng hơn chỉ mục (hay từ điển bách khoa), nên UCA đã theo cách này.

    Xin nhấn mạnh là cách thứ hai dùng trong từ điển của các thứ tiếng phương Tây, còn từ điển tiếng Việt (hay Việt-Anh, Việt-Pháp, v.v.) thì theo cách thứ nhất. Sở dĩ thế là vì mỗi từ Việt thường là một chuỗi nhiều chữ mà một chữ Việt lại trông giống như một từ của các thứ tiếng phương Tây. Cũng vì thế, cách này áp dụng cho tiếng Việt trở thành so sánh theo từng chữ.



    Ad 2. Hãy xem một mảng thông dụng nhất, hệ thống thông tin. Phép so sánh có 2 công dụng. Một là tìm kiếm (bao gồm cả lập chỉ mục) thông tin, hai là trình bày (hiển thị) kết quả.

    Cho việc tìm kiếm, so sánh sai không nhất thiết cho kết quả sai. Chẳng hạn, tuy khó < khoa, nhưng kể cả khi phép so sánh sai (khoa < khó), nếu người dùng tìm đích danh khoa, rất có thể sẽ tìm thấy. Kết quả chỉ sai (không tìm thấy khoa trong CSDL) nếu người dùng tìm kiếm bằng cách chỉ ra một khoảng giới hạn, chẳng hạn, khoảng [khó,khôn]. Trên các giao diện người dùng, tìm kiếm bằng khoảng tường minh thường chỉ áp dụng cho dữ liệu dạng số (kể cả xâu số, như năm-tháng-ngày, giờ-phút-giây, số hộ chiếu, số điện thoại, số tài khoản) chứ ít khi được áp dụng cho dữ liệu dạng chữ. Đối với chữ, tìm kiếm đích danh thống trị.

    Cho việc trình bày, so sánh sai cũng không nhất thiết cho kết quả sai. Chúng ta thường hiển thị danh mục hàng hóa/sản phẩm hay danh mục tài khoản kế toán sắp thứ tự theo mã số hơn là theo tên. Danh bạ là thứ dữ liệu thông dụng duy nhất thường được hiển thị sắp xếp theo tên. Nên hãy xem thí dụ tiêu biểu, sắp xếp một danh sách người Việt theo tên và họ:

    • Sắp xếp theo tên không thể sai, vì tên chỉ có 1 chữ.
    • Sắp xếp theo họ (khi trùng tên) ít khi sai, vì họ thường ngắn và đơn giản. Nói rõ hơn, do có rất ít họ (và nói chung, rất ít chữ thường dùng trong các họ) nên khả năng 2 chữ ở cùng vị trí trong 2 xâu so sánh chỉ sai khác ở dấu thanh là rất ít. Thí dụ, do chỉ có họ Nguyễn chứ không có họ Nguyên, Nguyền, Nguyển, Nguyến, Nguyện, bất cứ phép so sánh 2 xâu nào bắt đầu bằng Nguyễn cũng đều đã chắc chắn đúng ở chữ đầu tiên và, do thế, hầu như chắc chắn đúng ở kết quả cuối cùng; nếu thêm vào đó, ít nhất 1 trong 2 xâu này chỉ có 1 chữ Nguyễn, thì không còn "hầu như" gì nữa, mà là tuyệt đối.


    Những kết quả sai, như Nguyễn Lệ Hằng Nga < Nguyễn Lê Hồng Nga, Nguyễn Lý Huệ Trang < Nguyễn Ly Hương Trang, Nguyễn Thúy Mi Anh < Nguyễn Thùy Mỵ Anh, Nguyễn Vẫn Đô Con < Nguyễn Vân Đồn Con, Nguyễn Tự Nguyện Hy Sinh < Nguyễn Tự Nguyễn Vô Sinh hay Nguyễn Tù Mười Năm Chửa Xong À Cơ < Nguyễn Tu Mươi Năm Chưa Yong À Cơ, là rất hiếm thấy. Càng hiếm thấy hơn khi xét rằng danh sách mà chúng ta hiển thị thường chỉ có chừng 100 người hơn là 100 triệu người.
    Đã được chỉnh sửa lần cuối bởi Ada : 20-09-2021 lúc 09:08 AM.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  3. #73
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    742

    Trong thời gian tìm tòi học hỏi thêm về chủ đề sắp xếp thứ tự tiếng Việt, mình tìm thấy website "phát triển viên đỉnh cao VN" (topdev.vn) và đọc được bài Sắp xếp (sort) string Tiếng Việt.

    Câu mở đầu:
    Một vấn đề không hề mới, xưa như năm 1991, và có vẻ đâu đó đã được giải quyết
    Vậy nhưng nếu thử hỏi một lập trình viên sử dụng ngôn ngữ lập trình bất kỳ hãy viết một đoạn code sắp xếp những cái tên sau theo thứ tự của tiếng Việt:
    Code:
    In [14]: provinces = ['Hải Dương',
        ...:  'Hưng Yên',
        ...:  'Hà Nội',
        ...:  'Hải Phòng',
        ...:  'Hậu Giang',
        ...:  'Hòa Bình',
        ...:  'Hà Nam',
        ...:  'Hà Giang',
        ...:  'Hà Tĩnh']
    Và câu kết:
    In [6]: sorted(provinces, key=locale.strxfrm)
    Code:
    Out[6]:
    ['Hà Giang',
     'Hải Dương',
     'Hải Phòng',
     'Hà Nam',
     'Hà Nội',
     'Hà Tĩnh',
     'Hậu Giang',
     'Hòa Bình',
     'Hưng Yên']
    Giờ thì Hưng Yên đã đứng cuối list :-)
    Một danh sách chỉ có 9 cái tên mà xếp sai ít nhất 2 chỗ. Hải Dương và Hải Phòng chui vào giữa Hà Giang và Hà Nam. Tất cả những gì mà tác giả biết là "Hưng Yên phải đứng cuối danh sách".

    Và đây không phải là một vấn đề bên lề, mà là chủ đề, là vấn đề chính của bài viết, vấn đề mà tác giả đã bỏ 30 năm tâm huyết ra nghiên cứu và tự hào đem thành quả ra để khoe, để giảng dạy cho các lập trình viên khác.

    Một lập trình viên bậc thầy, một phát triển viên đỉnh cao mà còn không nhìn thấy lỗi như thế. Người dùng không nhìn thấy, cũng chẳng lấy làm lạ.

    Thế là thêm 1 câu trả lời cho câu hỏi 2 mình đặt ra ở bài trên.
    Đã được chỉnh sửa lần cuối bởi Ada : 01-09-2021 lúc 08:24 PM.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  4. #74
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    742

    Danh sách 63 tỉnh thành VN sắp xếp đúng thứ tự có thể xem ở link dưới đây. Để sắp xếp, "Thành phố Hồ Chí Minh" được xem như "Hồ Chí Minh".

    https://vi.wikipedia.org/wiki/T%E1%BB%89nh_th%C3%A0nh_Vi%E1%BB%87t_Nam

    - - - Nội dung đã được cập nhật ngày 03-09-2021 lúc 08:06 AM - - -

    Đính kèm là danh sách 63 tỉnh thành sắp xếp theo thứ tự đúng (good) và sai (poor).

    Cả 2 kết quả thu được bằng thực nghiệm lập trình dùng trực tiếp ICU C/C++ API.
    Attached Files Attached Files
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  5. #75
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    742

    Mình tìm thấy test kit sắc bén nhất xem 1 chương trình có hỗ trợ tiếng Việt không. Đó là so sánh 2 từ Hạ Long và Hà Tiên. Nếu qua được vòng "gửi xe" (Hà Tiên đứng trước) thì thay dấu cách bằng dấu gạch dưới (_) và test lại.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

Trang 8 trên tổng số 8 Đầu tiênĐầu tiên ... 678

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn