Hiện em đang cần lọc ra trong list các chuỗi random letter (chuỗi vô nghĩa - do khách hàng điền bậy bạ vào), không biết excel có hỗ trợ tính năng này không ạ? Nếu có hy vọng các bác hướng dẫn giúp em.
Tôi có một giải thuật này gợi ý cho bạn thôi, còn thực hiện thì tôi không giúp bạn, thay vì phải bỏ khá nhiều giải thuật và thuật toán, bạn nên mượn google dịch để phát hiện từ nguyên vẹn hoặc rời rạc.
Google Dịch có khả năng tách từ nguyên vẹn và phát hiện tiếng Việt khi không có dấu.
Bước thực hiện với VBA như sau:
1. Tách chuỗi lấy đằng trước chữ @
2. Gửi đến Google dịch thông qua Webrowser (IE hoặc Chrome) với trình điều khiển của nó.
3. Kiểm tra, phát hiện và nhận biết:
++ Nếu từ được tách có dấu phân cách
++ Nếu phát hiện Tiếng Việt
++ Nếu có cấu trúc
++ Nếu có từ gợi ý
4. Nếu Gmail đa số là tên tiếng Việt thì cần liệt kê toàn bộ từ ngữ không dấu tiếng Việt, và kiểm tra tương đối của từ (không ít thuật toán),
Tỉ lệ chính xác chỉ có thể ở mức tương đối.
Với điều bạn mong muốn nó là cả một ứng dụng sử dụng nguồn vốn là trí tuệ, cộng thêm kỹ năng lập trình, nên buộc bạn phải trả tiền mới có được.
Vậy nên rất khó để bạn có được sự giúp đỡ.
Tiếng Việt không nhiều từ lắm, mà không dấu thì lại ít hơn nữa.
Chỉ cần một bảng tra thì có thể tra được bằng phương pháp dò từng từ.
Ví dụ: totite có thể dò được theo tò tí te, to tít ẹ, tốt i tế,...
Nếu chỉ từ thôi thì rất dễ. Câu cú mới khó.
Bài của chủ thớt nếu dữ liệu đúng là email thì cần kiểm tra email đó "sống hay chết", chứ ai lại đi loại "random".
Một địa chỉ email gồm toàn phụ âm, toàn nguyên âm hay một chuỗi bất kỳ không có nghĩa gì cả là hoàn toàn hợp lệ cơ mà. Vậy tại sao lại bỏ nó đi. Hết sức vô lý.
Hiện em đang cần lọc ra trong list các chuỗi random letter (chuỗi vô nghĩa - do khách hàng điền bậy bạ vào), không biết excel có hỗ trợ tính năng này không ạ? Nếu có hy vọng các bác hướng dẫn giúp em.
Bài này chắc có lẽ không thể loại 100% được.
Code dưới đây viết thử cho mẫu của bài 1, dữ liệu bắt đầu từ A1 trở xuống.
Bạn có thể gửi dữ liệu thực tế lên để test code
Mã:
Option Explicit
Sub LocEmail()
Dim Nguon
Dim Chuoi As String
Dim Kq() As String
Dim i, j, k
Nguon = Sheet1.Range("A1").CurrentRegion
k = UBound(Nguon)
ReDim Kq(1 To k, 1 To 1)
With CreateObject("VbScript.RegExp")
.Global = True
For i = 1 To k
Chuoi = Left(Nguon(i, 1), InStr(Nguon(i, 1), "@") - 1)
.Pattern = "[aeiouAEIOU]"
j = .Execute(Chuoi).Count
If j > 1 And j < Len(Chuoi) Then
.Pattern = "([a-zA-Z]+)([a-zA-Z]+)(.*\2\1){2,}"
If .test(Chuoi) = 0 Then
Kq(i, 1) = Chuoi
End If
End If
Next i
End With
With Sheet1
.Range("C1:C" & k).ClearContents
.Range("C1:C" & k) = Kq
End With
End Sub
Bài của chủ thớt nếu dữ liệu đúng là email thì cần kiểm tra email đó "sống hay chết", chứ ai lại đi loại "random".
Một địa chỉ email gồm toàn phụ âm, toàn nguyên âm hay một chuỗi bất kỳ không có nghĩa gì cả là hoàn toàn hợp lệ cơ mà. Vậy tại sao lại bỏ nó đi. Hết sức vô lý.
Có thể thớt muốn bắt buộc email phải là từ tiếng Việt, không dấu, không viết tắt, và mỗi từ bắt buộc phải là 2 ký tự trở lên.
Dẫu không thực tế thì tôi thấy nó cũng là một thách thức cho động não.
Điển hình, điều kiện không viết tắt và tối thiểu 2 ký tự sẽ khiến cho dùng bảng tra trở thành khả thi.
Dùng regex như bài #6 cũng là một ý tưởng hay nhưng nếu không nắm vững luật tiếng Việt thì không thể thành công. Bản thân tôi cho rằng đem áp dụng hết luật tiếng Việt vào thì e rằng còn rắc rối hơn dùng bảng tra.
Theo tôi thì chỉ dùng regex để loại nhanh ở vòng sơ khởi - loại những dạng chắc chắn 100% không phải tiếng Việt.
Ví dụ những ký tự bắt buộc phải có một nguyên âm đi sau nó b, d, l, q, r, s, v, x (những ký tự này luôn luôn đứng đầu từ)
Code em viết là theo nhận xét này : Xét chuỗi nằm trước ký tự @ của bài 1
Với pattern "[aeiouAEIOU]" là dựa trên 2 nhận xét
Các mail hợp lệ đều có họ và tên. Vì vậy theo tiếng Việt thì ít nhất sẽ có 2 nguyên âm trong chuỗi.
Họ và tên trong tiếng Việt luôn bao gồm cả phụ âm & nguyên âm.
Như vậy, chuỗi nào chỉ chứa 1 nguyên âm hoặc toàn bộ là nguyên âm sẽ bị loại
Như cái mail huy123@gmail.com tuy là hợp lệ nhưng lại không tương tự các mẫu bài 1 ( tức là phải có cả họ ) nên cũng bó tay
Với pattern = "([a-zA-Z]+)([a-zA-Z]+)(.*\2\1){2,}"
Cái pattern này dựa vào nhận xét là : Người tạo mail rác sẽ có thói quen gõ lặp lại 1 vài ký tự nào đó trên bàn phím
Việc gõ lặp lại này có thể dẫn đến sẽ tạo ra chuỗi theo kiểu của pattern thứ 2.
Cái {2,} thực ra cũng chỉ là nhận xét riêng cho mẫu bài 1 nhưng cũng là phòng hờ cho 1 số tên có các ký tự đảo ngược 1 lần ví dụ như là thanhna@gmail.com
Bài này tạo pattern chung chắc là không thể nhưng cũng viết thử lên để có gì học hỏi thêm bác ạ.
Em căn cứ vào câu này của bài #1:
"chuỗi vô nghĩa - do khách hàng điền bậy bạ vào"
Tức là chủ thớt có một cái 'form' để khách hàng điền thông tin vào (nhằm điều tra, đăng ký cái gì đó), trong đó có trường email. Khách hàng sẽ có những người không muốn điền email của mình để tránh rắc rối (spam gì đó chẳng hạn) nên họ sẽ điền bừa cái gì đó vào cho đủ.
Kết quả, chủ thớt có một danh sách email không như mong đợi.
Nhẽ ra ở ngay 'form' đăng ký của chủ thớt có chức năng kiểm tra sự tồn tại của email khi người ta nhập vào.
Code em viết là theo nhận xét này : Xét chuỗi nằm trước ký tự @ của bài 1
Với pattern "[aeiouAEIOU]" là dựa trên 2 nhận xét
Các mail hợp lệ đều có họ và tên. Vì vậy theo tiếng Việt thì ít nhất sẽ có 2 nguyên âm trong chuỗi.
Họ và tên trong tiếng Việt luôn bao gồm cả phụ âm & nguyên âm.
Như vậy, chuỗi nào chỉ chứa 1 nguyên âm hoặc toàn bộ là nguyên âm sẽ bị loại
Như cái mail huy123@gmail.com tuy là hợp lệ nhưng lại không tương tự các mẫu bài 1 ( tức là phải có cả họ ) nên cũng bó tay
Mail lập trên gmail.com. huy123@gmail.com là hợp lệ. Tôi còn có mail thỉnh thoảng dùng là siwtom***@gmail.com. Chả có họ và cũng chả có tên của tôi.
Nếu bạn cố tình chỉ dùng pattern "[aeiouAEIOU] thì đây: email qwertaaaaa@gmail.com chắc chắn không vừa ý chủ chủ đề. Nhưng code của bạn cho là tốt.
Với pattern = "([a-zA-Z]+)([a-zA-Z]+)(.*\2\1){2,}"
Cái pattern này dựa vào nhận xét là : Người tạo mail rác sẽ có thói quen gõ lặp lại 1 vài ký tự nào đó trên bàn phím
Việc gõ lặp lại này có thể dẫn đến sẽ tạo ra chuỗi theo kiểu của pattern thứ 2.
Cái {2,} thực ra cũng chỉ là nhận xét riêng cho mẫu bài 1 nhưng cũng là phòng hờ cho 1 số tên có các ký tự đảo ngược 1 lần ví dụ như là thanhna@gmail.com