So khớp mờ & khử trùng lặp API
So sánh chuỗi (Levenshtein, Jaro-Winkler, token set, trigram), tìm mục gần nhất trong danh sách và gom cụm trùng lặp, bỏ dấu tiếng Việt khi so.
Có ba chế độ. compare (a, b) trả về mọi điểm số từ 0 tới 1: Levenshtein chuẩn hoá, Jaro-Winkler, token sort và token set ratio (như rapidfuzz), độ giống trigram (như pg_trgm của PostgreSQL) và combined là trung bình các điểm, kèm khoảng cách sửa (edit distance). search (query, choices tới 10.000 mục) trả về các mục khớp nhất vượt threshold kèm vị trí. dedupe (items tới 5.000 mục) gom các mục gần trùng thành cụm với một đại diện và trả về danh sách đã khử trùng; các cặp chỉ được so khi có chung trigram nên danh sách lớn vẫn nhanh.
Trước khi so, chuỗi được chuẩn hoá: bỏ phân biệt hoa thường và dấu tiếng Việt (Nguyễn = nguyen, đ = d), dấu câu thành khoảng trắng và mở rộng các chữ viết tắt thông dụng (TP. = thành phố, Q. = quận, P. = phường, Cty = công ty, CP = cổ phần, TM = thương mại, HCM = Hồ Chí Minh…). Có thể tắt bằng keep_accents, case_sensitive và abbreviations=false, và bỏ các từ nhiễu bằng ignore (ví dụ "tnhh, cong ty").
Chọn điểm số bằng algorithm: token_set cho tên có thứ tự từ hoặc từ thừa khác nhau (tên công ty, tên sản phẩm), jaro_winkler cho chuỗi ngắn và lỗi gõ ở cuối, levenshtein cho mã, trigram cho văn bản dài. Không lưu dữ liệu.
Tham số
| Tên | Vị trí | Kiểu | Bắt buộc | Mặc định | |
|---|---|---|---|---|---|
mode | body|query | string | không | compare, search hoặc dedupe (tự nhận ra từ tham số nếu bỏ trống). | |
a | body|query | string | không | compare: chuỗi thứ nhất. | |
b | body|query | string | không | compare: chuỗi thứ hai. | |
query | body|query | string | không | search: chuỗi cần tìm. | |
choices | body | array | không | search: danh sách ứng viên (mảng JSON hoặc mỗi dòng một mục), tối đa 10.000. | |
items | body | array | không | dedupe: danh sách cần gom cụm (mảng JSON hoặc mỗi dòng một mục), tối đa 5.000. | |
algorithm | body|query | string | không | combined | combined, levenshtein, jaro_winkler, token_sort, token_set hoặc trigram (cho search và dedupe). |
threshold | body|query | number | không | Điểm tối thiểu 0-1: mặc định 0,5 với search, 0,85 với dedupe. | |
limit | body|query | number | không | 10 | search: số kết quả trả về (1-1000). |
keep_accents | body|query | boolean | không | false | So sánh giữ nguyên dấu tiếng Việt. |
case_sensitive | body|query | boolean | không | false | Phân biệt chữ hoa, chữ thường. |
abbreviations | body|query | boolean | không | true | Mở rộng chữ viết tắt tiếng Việt (TP., Q., P., Cty, CP, TM…). |
ignore | body|query | array | không | Các từ bỏ đi trước khi so, ví dụ ["tnhh", "cong ty"]. |
Ví dụ
curl -X POST "https://apibox.io.vn/v1/fuzzy-match" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"a":"Cty TNHH Thương mại ABC, Q.1, TP.HCM","b":"Công ty TNHH TM ABC Quận 1 Hồ Chí Minh"}'const res = await fetch('https://apibox.io.vn/v1/fuzzy-match', {
method: 'POST',
headers: {
Authorization: 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"a": "Cty TNHH Thương mại ABC, Q.1, TP.HCM",
"b": "Công ty TNHH TM ABC Quận 1 Hồ Chí Minh"
}),
});
const data = await res.json();
console.log(data);import requests
res = requests.post(
"https://apibox.io.vn/v1/fuzzy-match",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"a": "Cty TNHH Thương mại ABC, Q.1, TP.HCM", "b": "Công ty TNHH TM ABC Quận 1 Hồ Chí Minh"},
timeout=30,
)
print(res.json())<?php
$ch = curl_init('https://apibox.io.vn/v1/fuzzy-match');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => ['Authorization: Bearer YOUR_API_KEY', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => '{"a":"Cty TNHH Thương mại ABC, Q.1, TP.HCM","b":"Công ty TNHH TM ABC Quận 1 Hồ Chí Minh"}',
]);
$response = curl_exec($ch);
print_r(json_decode($response, true));Kết quả trả về
{
"mode": "compare",
"a": "Cty TNHH Thương mại ABC, Q.1, TP.HCM",
"b": "Công ty TNHH TM ABC Quận 1 Hồ Chí Minh",
"normalized_a": "cong ty tnhh thuong mai abc quan 1 thanh pho ho chi minh",
"normalized_b": "cong ty tnhh thuong mai abc quan 1 ho chi minh",
"levenshtein_distance": 10,
"jaro": 0.9151,
"indel_ratio": 0.902,
"scores": {
"combined": 0.9107,
"levenshtein": 0.8214,
"jaro_winkler": 0.9491,
"token_sort": 0.902,
"token_set": 1,
"trigram": 0.8723
},
"options": {
"algorithm": "combined",
"accent_insensitive": true,
"case_insensitive": true,
"abbreviations": true,
"ignore": []
}
}
Ứng dụng
- Khử trùng lặp tên khách hàng, nhà cung cấp khi nhập dữ liệu CRM
- Khớp tên sản phẩm giữa các sàn (Shopee, Lazada, Tiki)
- Tìm tên tỉnh, ngân hàng, đối tác gần nhất với dữ liệu người dùng nhập
- Đối chiếu tên người nhận trên sao kê ngân hàng với hoá đơn
Hỏi đáp
Nên dùng điểm số nào?
combined là lựa chọn mặc định tốt. token_set bỏ qua thứ tự từ và từ thừa, jaro_winkler ưu tiên phần đầu giống nhau, levenshtein đếm số lần sửa, trigram hợp với văn bản dài.
Có bỏ qua dấu tiếng Việt không?
Có, mặc định bỏ dấu, hoa thường và dấu câu; đặt keep_accents=true khi "Hà" và "Ha" phải được coi là khác nhau.
Danh sách được lớn tới đâu?
search nhận tới 10.000 mục, dedupe tới 5.000 mục, mỗi mục tối đa 1.000 ký tự.
API liên quan
So sánh văn bản
So sánh hai đoạn văn bản theo dòng, từ, ký tự, câu hoặc JSON; nhận danh sách thay đổi, tỉ lệ giống nhau và bản diff dạng unified.
a-bTạo slug
Chuyển tiêu đề thành slug URL gọn gàng: bỏ dấu tiếng Việt (cả chữ đ), tuỳ chọn ký tự phân cách, giữ chữ hoa và giới hạn độ dài.
123Thống kê văn bản
Đếm số từ, ký tự, câu, đoạn và dòng; ước tính thời gian đọc và thời gian nói; liệt kê các từ xuất hiện nhiều nhất trong văn bản.