Trong quá trình làm việc với dữ liệu text, chuẩn hoá dữ liệu, match dữ liệu text (tên công ty, tên tổ chức đến từ nhiều nguồn khác nhau). VD: có 2 danh sách tên công ty. Danh sách 1 gồm 2k công ty. Danh sách 2 gồm 4k công ty. Làm sao để tìm ra công ty nào có trong danh sách 1 mà cũng có trong danh sách 2? Vấn đề tên công ty giữa 2 danh sách đôi khi không giống nhau hoàn toàn - không phải là exact match để vlookup hay index match gì cả. Làm sao?
Làm bằng tay thì không xuể được, deadline thì đến gần rồi?
Cách đây 3 năm, cái thời còn làm cho KPMG Đức, mình đã làm thế này.
1. Với mỗi tên cty trong DS1, so sánh và đánh giá sự giống nhau với toàn bộ tên cty trong DS2 - gọi là similarity metric
2. Tìm trong DS2 tên công ty có similarity metric cao nhất. Đến bước này có khẳng định được là tên cty trong DS1 và tên cty trong DS2 với similarity metric cao nhất có phải là cùng 1 công ty hay không? Các bạn tự nhận xét và tìm ra nhé. Phải tự làm bài tập về nhà thôi.
3. Sử dụng hàm L sau đây để đánh giá similarity metric đó
"===
Function L(ByVal string1 As String, ByVal string2 As String) As Long
Dim i As Long, j As Long, string1_length As Long, string2_length As Long
Dim distance(0 To 60, 0 To 50) As Long, smStr1(1 To 60) As Long, smStr2(1 To 50) As Long
Dim min1 As Long, min2 As Long, min3 As Long, minmin As Long, MaxL As Long
string1_length = Len(string1): string2_length = Len(string2)
distance(0, 0) = 0
For i = 1 To string1_length: distance(i, 0) = i: smStr1(i) = Asc(LCase(Mid$(string1, i, 1))): Next
For j = 1 To string2_length: distance(0, j) = j: smStr2(j) = Asc(LCase(Mid$(string2, j, 1))): Next
For i = 1 To string1_length
For j = 1 To string2_length
If smStr1(i) = smStr2(j) Then
distance(i, j) = distance(i - 1, j - 1)
Else
min1 = distance(i - 1, j) + 1
min2 = distance(i, j - 1) + 1
min3 = distance(i - 1, j - 1) + 1
If min2 < min1 Then
If min2 < min3 Then minmin = min2 Else minmin = min3
Else
If min1 < min3 Then minmin = min1 Else minmin = min3
End If
distance(i, j) = minmin
End If
Next
Next
MaxL = string1_length: If string2_length > MaxL Then MaxL = string2_length
L = 100 - CLng((distance(string1_length, string2_length) * 100) / MaxL)
End Function
'====
Trả lời cho: https://www.facebook.com/groups/hocexcel.online/permalink/1077409665691728/
