Xử lý chuỗi dữ liệu có sẵn dựa vào qui tắc kiểu gõ Telex ?

Liên hệ QC

Anti-Plus

Thành viên chính thức
Tham gia
25/3/08
Bài viết
65
Được thích
8
Xin chào, mình không biết đặt tên Topic như thế nào cho các bạn dễ hiểu nhưng vấn đề của mình nhờ các bạn giúp đỡ là mình có 2 cột FIND & REPLACE, ở cột FIND thì mình đã có sẵn dữ liệu chuỗi hết rồi & công việc cần giải quyết là làm sao cho cột REPLACE ra kết quả tương ứng với cột FIND dựa vào qui tắc của kiểu gõ Telex.

Vd:

- Ở cột FIND mình có chuỗi "aaf" thì ở cột REPLACE sẽ cho ra kết quả là "ầ"
- aaj >>>
- aamf >>> ầm

v.v...

Rất cám ơn sự giúp đỡ của các bạn !
 

File đính kèm

  • AutoCorrect Telex.rar
    30.4 KB · Đọc: 32
Xin chào, mình không biết đặt tên Topic như thế nào cho các bạn dễ hiểu nhưng vấn đề của mình nhờ các bạn giúp đỡ là mình có 2 cột FIND & REPLACE, ở cột FIND thì mình đã có sẵn dữ liệu chuỗi hết rồi & công việc cần giải quyết là làm sao cho cột REPLACE ra kết quả tương ứng với cột FIND dựa vào qui tắc của kiểu gõ Telex.

Vd:

- Ở cột FIND mình có chuỗi "aaf" thì ở cột REPLACE sẽ cho ra kết quả là "ầ"
- aaj >>>
- aamf >>> ầm

v.v...

Rất cám ơn sự giúp đỡ của các bạn !
Vấn đề này không đơn giản. Đánh telex chữ thường, chữ hoa, bỏ dấu tại chỗ, bỏ dấu cuối từ,...
Riêng trường hợp đánh telex chữ thường, bỏ dấu tại chỗ có 67 nhóm (as, af, ar, ax, aj, aw, aws, awf, awr, awx, awj, ...)
Bỏ dấu cuối từ càng phức tạp hơn với các nguyên âm ghép. Ví dụ hoangf thì là hoàng hay hòang ? Bỏ dấu sai vị trí thì không chấp nhận được về mặt chính tả. Còn muốn đúng thì phải làm bảng liệt kê tất cả các trường hợp nguyên âm ghép mới viết hàm được.
Tôi chỉ mới giải quyết được trường hợp chữ thường, bỏ dấu tại chỗ.

Mã:
Function KeyTelUni(txt As String) As String
Dim tmp As String, s3 As String, s1 As String, sTel As String, sUni As String
Dim n As Long, m As Long, i As Long, vt1 As Long, vt2 As Long
sTel = "awsawfawrawxawjaasaafaaraaxaajeeseefeereexeejoosoofoorooxoojowsowfowrowxowjuwsuwfuwruwxuwjas af ar ax aj aw aa dd es ef er ex ej ee is if ir ix ij os of or ox oj oo ow us uf ur ux uj uw ys yf yr yx yj "
sUni = ChrW(7855) & ChrW(7857) & ChrW(7859) & ChrW(7861) & ChrW(7863) & ChrW(7845) & ChrW(7847) & ChrW(7849) & ChrW(7851) & ChrW(7853) & "éè" & ChrW(7867) & ChrW(7869) & ChrW(7865) & ChrW(7889) & ChrW(7891) & ChrW(7893) & ChrW(7895) & ChrW(7897) & ChrW(7899) & ChrW(7901) & ChrW(7903) & ChrW(7905) & ChrW(7907) & ChrW(7913) & ChrW(7915) & ChrW(7917) & ChrW(7919) & ChrW(7921) & "áà" & ChrW(7843) & "ã" & ChrW(7841) & ChrW(259) & "â" & ChrW(273) & "éè" & ChrW(7867) & ChrW(7869) & ChrW(7865) & "êíì" & ChrW(7881) & ChrW(297) & ChrW(7883) & "óò" & ChrW(7887) & "õ" & ChrW(7885) & "ô" & ChrW(417) & "úù" & ChrW(7911) & ChrW(361) & ChrW(7909) & ChrW(432) & "ý" & ChrW(7923) & ChrW(7927) & ChrW(7929) & ChrW(7925)
txt = txt & " "
vt1 = 1: vt2 = 1
n = 1
For i = 1 To 67
  s3 = Trim(Mid(sTel, n, 3))
  s1 = Mid(sUni, i, 1)
  m = InStr(1, txt, s3)
  n = n + 3
  txt = Replace(txt, s3, s1)
Next
KeyTelUni = txt
End Function
 
Xin chào, mình không biết đặt tên Topic như thế nào cho các bạn dễ hiểu nhưng vấn đề của mình nhờ các bạn giúp đỡ là mình có 2 cột FIND & REPLACE, ở cột FIND thì mình đã có sẵn dữ liệu chuỗi hết rồi & công việc cần giải quyết là làm sao cho cột REPLACE ra kết quả tương ứng với cột FIND dựa vào qui tắc của kiểu gõ Telex.

Vd:

- Ở cột FIND mình có chuỗi "aaf" thì ở cột REPLACE sẽ cho ra kết quả là "ầ"
- aaj >>>
- aamf >>> ầm

v.v...

Rất cám ơn sự giúp đỡ của các bạn !
Yêu cầu này lý ra sẽ làm được nếu như bạn GÕ DẤU TIẾNG VIỆT ngay tại ký tự (tức gõ dấu ngay sau nguyên âm)---> Đàng này bạn viết chữ xong mới bỏ dấu (tức gõ dấu tự do), thật khó để dò tìm
Ví dụ
Thay vì viết aamf
Nếu bạn viết aafm
Thì OK ngay
------------
Thầy Long khai báo hằng sTel và sUni thành 1 Array sẽ dể xử lý hơn là 1 chuổi
Giống bài này:
http://www.giaiphapexcel.com/forum/showthread.php?t=29323
 
Lần chỉnh sửa cuối:
Thầy Long khai báo hằng sTel và sUni thành 1 Array sẽ dể xử lý hơn là 1 chuổi
Giống bài này:
http://www.giaiphapexcel.com/forum/showthread.php?t=29323
Chỉnh lại sTel, sUni thành Array. Hàm gọn hơn rất nhiều.
Thank ndu96081631 !
Mã:
Function KeyTelUni(txt As String) As String
Dim sTel, sUni, i As Long
sTel = Array("aws", "awf", "awr", "awx", "awj", "aas", "aaf", "aar", "aax", "aaj", "ees", "eef", "eer", "eex", "eej", "oos", "oof", "oor", "oox", "ooj", "ows", "owf", "owr", "owx", "owj", "uws", "uwf", "uwr", "uwx", "uwj", "as", "af", "ar", "ax", "aj", "aw", "aa", "dd", "es", "ef", "er", "ex", "ej", "ee", "is", "if", "ir", "ix", "ij", "os", "of", "or", "ox", "oj", "oo", "ow", "us", "uf", "ur", "ux", "uj", "uw", "ys", "yf", "yr", "yx", "yj")
sUni = Array(ChrW(7855), ChrW(7857), ChrW(7859), ChrW(7861), ChrW(7863), ChrW(7845), ChrW(7847), ChrW(7849), ChrW(7851), ChrW(7853), "é", "è", ChrW(7867), ChrW(7869), ChrW(7865), ChrW(7889), ChrW(7891), ChrW(7893), ChrW(7895), ChrW(7897), ChrW(7899), ChrW(7901), ChrW(7903), ChrW(7905), ChrW(7907), ChrW(7913), ChrW(7915), ChrW(7917), ChrW(7919), ChrW(7921), "á", "à", ChrW(7843), "ã", ChrW(7841), ChrW(259), "â", ChrW(273), "é", "è", ChrW(7867), ChrW(7869), ChrW(7865), "ê", "í", "ì", ChrW(7881), ChrW(297), ChrW(7883), "ó", "ò", ChrW(7887), "õ", ChrW(7885), "ô", ChrW(417), "ú", "ù", ChrW(7911), ChrW(361), ChrW(7909), ChrW(432), "ý", ChrW(7923), ChrW(7927), ChrW(7929), ChrW(7925))
For i = 0 To UBound(sTel)
  txt = Replace(txt, LCase(sTel(i)), sUni(i))
Next i
KeyTelUni = txt
End Function
 
Lần chỉnh sửa cuối:
Mình đã test qua hàm của các bạn giải quyết rất tốt vấn đề bỏ dấu tại chỗ, nhưng do dữ liệu có sẵn của mình bỏ dấu cuối từ nên rất cần sự quan tâm giúp đỡ của các bạn nhiều lắm.

Chân thành cám ơn rất nhiều !
 
Mình đã test qua hàm của các bạn giải quyết rất tốt vấn đề bỏ dấu tại chỗ, nhưng do dữ liệu có sẵn của mình bỏ dấu cuối từ nên rất cần sự quan tâm giúp đỡ của các bạn nhiều lắm.

Chân thành cám ơn rất nhiều !
Vấn đề là phải liệt kê được tất cả các tổ hợp nguyên âm ghép. Ví dụ nguyên âm a (ai, ao, au, ay), u (ua, uâ, ue, uê, ui, uy, uyê), ...
Không liệt kê được tất cả các trường hợp thì không thể viết được.
Bạn lập bảng liệt kê nguyên âm ghép, mình giúp bạn viết hàm.
 
Vấn đề là phải liệt kê được tất cả các tổ hợp nguyên âm ghép. Ví dụ nguyên âm a (ai, ao, au, ay), u (ua, uâ, ue, uê, ui, uy, uyê), ...
Không liệt kê được tất cả các trường hợp thì không thể viết được.
Bạn lập bảng liệt kê nguyên âm ghép, mình giúp bạn viết hàm.
Em định dùng Sendkeys để giải quyết, nhưng khi thử nghiệm thì chỉ được 1 cell ---> Có lẽ Sendkeys bị "đụng" với quá trình "hook" bàn phím của trình gõ tiếng Việt chăng?
Xin thầy góp ý cho (vì nếu Sendkeys mà làm được thì bài toán này sẽ được giải quyết vô cùng nhanh gọn, bất chấp người ta gõ theo kiểu gì)
 
Mình đã test qua hàm của các bạn giải quyết rất tốt vấn đề bỏ dấu tại chỗ, nhưng do dữ liệu có sẵn của mình bỏ dấu cuối từ nên rất cần sự quan tâm giúp đỡ của các bạn nhiều lắm.

Chân thành cám ơn rất nhiều !


Em định dùng Sendkeys để giải quyết, nhưng khi thử nghiệm thì chỉ được 1 cell ---> Có lẽ Sendkeys bị "đụng" với quá trình "hook" bàn phím của trình gõ tiếng Việt chăng?
Xin thầy góp ý cho (vì nếu Sendkeys mà làm được thì bài toán này sẽ được giải quyết vô cùng nhanh gọn, bất chấp người ta gõ theo kiểu gì)

Tôi chưa rõ các bạn giải quyết vấn đề gì, không rõ các bạn biến đổi như thế để dùng trong ứng dụng nào trong cuộc sống.
Nếu các bạn nói rõ hơn mục đích của việc này có thể tôi sẽ góp ý thêm, hoặc cũng có thể đề nghị các bạn 1 giải pháp theo hướng khác.

Trong cái file của Anti-Plus, bạn xử lý theo cách trích lấy từng ký tự từ trái qua phải, nếu gặp nguyên âm thì ghi nhận để xử lý: nếu ký tự sau đó thuộc khả năng có dấu thì ghép vào sau với nguyên âm đó và chuyển đổi; các phụ âm thì ghép vào nhau bình thường.

Như vậy vẫn xử lý được người ta bỏ dấu bất kỳ nơi đâu, ngay sau nguyên âm hay ở cuối câu, thậm chí như: ama, duownfg .. thành: âm, dường (uow chỉ 1 chữ w vẫn sửa lại cho đúng được) ....

Tức là cũng y như bộ gõ bạn đang dùng để post bài ở đây.
 
Tôi chưa rõ các bạn giải quyết vấn đề gì, không rõ các bạn biến đổi như thế để dùng trong ứng dụng nào trong cuộc sống.
Nếu các bạn nói rõ hơn mục đích của việc này có thể tôi sẽ góp ý thêm, hoặc cũng có thể đề nghị các bạn 1 giải pháp theo hướng khác.

Trong cái file của Anti-Plus, bạn xử lý theo cách trích lấy từng ký tự từ trái qua phải, nếu gặp nguyên âm thì ghi nhận để xử lý: nếu ký tự sau đó thuộc khả năng có dấu thì ghép vào sau với nguyên âm đó và chuyển đổi; các phụ âm thì ghép vào nhau bình thường.

Như vậy vẫn xử lý được người ta bỏ dấu bất kỳ nơi đâu, ngay sau nguyên âm hay ở cuối câu, thậm chí như: ama, duownfg .. thành: âm, dường (uow chỉ 1 chữ w vẫn sửa lại cho đúng được) ....

Tức là cũng y như bộ gõ bạn đang dùng để post bài ở đây.
Hay bạn làm sơ sơ 1 đoạn code gữi lên đây xem thử thế nào ---> Chứ tôi thì thấy quá oải rồi
 
Hay bạn làm sơ sơ 1 đoạn code gữi lên đây xem thử thế nào ---> Chứ tôi thì thấy quá oải rồi

Code thì phải chạy cho đúng chứ làm sơ sơ rồi khi chạy nó treo máy làm sao?

Nhưng bạn nói cho biết xem bạn định làm cái gì?
Chứ chỉ để xử lý mấy dòng trong cái file đó thì viết code chi cho đau đầu.

Mà trong cái file đó có tới 4.000 chữ. Lấy từ đâu ra vậy? Trích từ tự điển? Hay là bạn gõ vào?
 
Code thì phải chạy cho đúng chứ làm sơ sơ rồi khi chạy nó treo máy làm sao?

Nhưng bạn nói cho biết xem bạn định làm cái gì?
Chứ chỉ để xử lý mấy dòng trong cái file đó thì viết code chi cho đau đầu.

Mà trong cái file đó có tới 4.000 chữ. Lấy từ đâu ra vậy? Trích từ tự điển? Hay là bạn gõ vào?
Thì đây là yêu cầu của tác giả cơ mà (mình biết mục đích của người ta là cái gì đâu)
Dử liệu và yêu cầu đã có trong file của tác giả rồi ---> vấn đề còn lại là code chính xác thôi
Mình của có mường tượng sơ qua, nhưng thấy.. khó quá... bạn làm thử.. hy vọng mình học hỏi được ít nhiều!
 
Nói sơ sơ hướng của tôi nhé:
Tiếng Việt có 3 phần:
- Phụ âm đầu.
- Nguyên âm.
- Phụ âm cuối.
Phụ âm đầu và phụ âm cuối có thể có, có thể không, nhưng nguyên âm chắc chắn phải có.

Thế thì ta lấy phụ âm đầu, lưu lại vào X1.
Lấy tiếp các chữ kế cho đến khi gặp nguyên âm, lưu lại vào X2.
Nếu kế nó là :
- nguyên âm hoặc chữ w: ghép vào nguyên âm đã lưu -> xử lý (có thể nó là nguyên âm kép như uy, ui ... mà cũng có thể là dấu nón, râu ...)
- phụ âm: tách ra 2 trường hợp:
+ s,f,r,x,j: đó là dấu thanh, chắc chắn vì những chữ đó không thể là phụ âm cuối.
+ các phụ âm khác: lưu vào phụ âm cuối X3.

Cuối cùng ghép X1+X2+X3.
 
Nói sơ sơ hướng của tôi nhé:
Tiếng Việt có 3 phần:
- Phụ âm đầu.
- Nguyên âm.
- Phụ âm cuối.
Phụ âm đầu và phụ âm cuối có thể có, có thể không, nhưng nguyên âm chắc chắn phải có.
.....
Cuối cùng ghép X1+X2+X3.
Nói thì hiểu... nhưng mà vẫn thấy.. khó quá đại ca ơi!
Mà sao đại ca không làm mẫu 1 đoạn nhỉ?
 
Chỉnh sửa lần cuối bởi điều hành viên:
Yêu cầu này lý ra sẽ làm được nếu như bạn GÕ DẤU TIẾNG VIỆT ngay tại ký tự (tức gõ dấu ngay sau nguyên âm)---> Đàng này bạn viết chữ xong mới bỏ dấu (tức gõ dấu tự do), thật khó để dò tìm.

Câu trên nghe có quen hông?
Chính là bạn nói đấy nhé.

Thế thì bây giờ tôi sửa lại chút đỉnh:

Thế thì ta lấy phụ âm đầu, lưu lại vào X1.
Lấy tiếp các chữ kế cho đến khi gặp nguyên âm, lưu lại vào X2.
Nếu kế nó là :
- nguyên âm hoặc chữ w: ghép vào nguyên âm đã lưu -> xử lý (có thể nó là nguyên âm kép như uy, ui ... mà cũng có thể là dấu nón, râu ...)
- phụ âm: tách ra 2 trường hợp:
+ s,f,r,x,j: đó là dấu thanh, chắc chắn vì những chữ đó không thể là phụ âm cuối -> lưu vào X3.
+ các phụ âm khác: lưu vào phụ âm cuối X4.

Cuối cùng ghép X1+(X2+X3)+X4.

Mà cái X2+X3 bạn đã làm được rồi.
 
@ndu96081631:

Sao rồi? Bạn làm tới đâu rồi?
Xem thử cái này nè . (File kèm theo).
 

File đính kèm

  • AutoCorrect Telex.rar
    84.4 KB · Đọc: 19
Chỉnh sửa lần cuối bởi điều hành viên:
Cảm ơn bạn đã bớt chút thời gian code để mọi người cùng học hỏi, tuy nhiên vấn đề đang bàn là code cho trường hợp thả dấu tự do, còn thả dấu theo chuẩn thì đã có người làm được rồi. Code của bạn vẫn dựa vào các trường hợp gõ chuẩn mà ra. Tôi ví dụ mấy trường hợp sau nhé:
1. Nếu thả dấu tự do thì khi chuỗi uwa uaw phải cho ra cùng 1 kết quả là ưa, còn của bạn thì cho ra 2 kết quả lần lượt là ưa . Từ đó suy ra các trường hợp tương tự cũng sẽ bị sai.
2. Trường hợp có nhiêu nguyên âm thì code của bạn cũng chưa trả về đúng dấu, ví dụ oaij, hoặc ojai hoặc oaji thì kết quả đều phải trả về là oại, còn của bạn nó trả về là ọai.

Nhìn code của bạn tôi thấy có thể còn nhiều trường hợp không trả về kết quả như mong muốn nữa, vì bản thân nó chưa phải là thuật toán chính xác.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Tôi thì không có nhu cầu sử dụng code này, tuy nhiên nếu có thuật toán hay thì vẫn rất muốn học hỏi, và tôi thì không thích người nào chỉ nói mà ko làm, cảm ơn bạn đã bớt chút thời gian code để mọi người cùng học hỏi, tuy nhiên vấn đề đang bàn là code cho trường hợp thả dấu tự do, còn thả dấu theo chuẩn thì đã có người làm được rồi. Code của bạn vẫn dựa vào các trường hợp gõ chuẩn mà ra. Tôi ví dụ mấy trường hợp sau nhé:
1. Nếu thả dấu tự do thì khi chuỗi uwa uaw phải cho ra cùng 1 kết quả là ưa, còn của bạn thì cho ra 2 kết quả lần lượt là ưa . Từ đó suy ra các trường hợp tương tự cũng sẽ bị sai.
2. Trường hợp có nhiêu nguyên âm thì code của bạn cũng chưa trả về đúng dấu, ví dụ oaij, hoặc ojai hoặc oaji thì kết quả đều phải trả về là oại, còn của bạn nó trả về là ọai.

Nhìn code của bạn tôi thấy có thể còn nhiều trường hợp không trả về kết quả như mong muốn nữa, vì bản thân nó chưa phải là thuật toán chính xác.

Bạn nói đúng.

Cái đó là tôi trích lấy 1 đoạn từ code chương trình gõ bàn phím nhằm mục đích là giải quyết yêu cầu của chủ topic này.

Tôi cũng đã hỏi đi hỏi lại.


Không ai có ý muốn giải 1 vấn đề rộng hơn, kể cả bạn, nên tôi không đề cập đến trong file đó.
2. Trường hợp có nhiêu nguyên âm thì code của bạn cũng chưa trả về đúng dấu, ví dụ oaij, hoặc ojai hoặc oaji thì kết quả đều phải trả về là oại, còn của bạn nó trả về là ọai.
Tôi viết lại nên cũng không muốn kiểm tra kỹ (để vài lỗi nho nhỏ cho vui), người nào có đọc khắc thấy lỗi này và đề nghị hãy tự sửa lấy. Tôi không làm hết tất vì cũng dễ sửa thôi. Không khó khăn gì với ACE trên GPE.

Ngoài ra còn những cái khác như là chữ hoa, chữ thường, gõ dấu kiểu VNI, gõ kiểu lẫn lộn telex+VNI+VIQR, gõ 2 lần thì hủy dấu (như khi gõ tiếng Anh) ....

Nhưng dù sao thì phần chính yếu tôi cũng đã trình bày.
- chia 1 từ thành phụ âm, nguyên âm.
- quy tắc bỏ dấu.

Đoạn code như thế cũng chỉ để giải quyết cho cái file đó mà thôi. Không dùng cho việc khác được.
Muốn phát triển nữa để làm cái gì đó thì tôi sẽ thảo luận tiếp sau.
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom