Find Similar Values
find_similar_values · standardize · text
2026-09-23
กำลังประมวลผล…
find_similar_values · standardize · text
2026-09-23
Bangkok Co.,Ltd., bangkok co ltd และ BANGKOK CO., LTD คือบริษัทเดียวกัน แต่เป็นสามค่าเมื่อนับ เทคนิคนี้จับค่าที่น่าจะหมายถึงสิ่งเดียวกันเข้ากลุ่ม แล้วแทนทุกค่าด้วยค่ามาตรฐานของกลุ่ม ในแอปมีหน้า Cluster Review ให้ตรวจทีละกลุ่มก่อนตัดสินใจ
สาขา 1 กับ สาขา 2 — ต้องตรวจทีละกลุ่มเสมอmap_values ซึ่งระบุค่าตรง ๆfingerprint (ค่าเริ่มต้น) แปลงค่าเป็นกุญแจด้วยการทำตัวพิมพ์เล็ก ตัดเครื่องหมาย แยกคำ เรียง และตัดคำซ้ำ ค่าที่ได้กุญแจเดียวกันจึงอยู่กลุ่มเดียวกัน วิธีนี้เร็วและพลาดน้อยngram_fingerprint ตัดช่องว่างทั้งหมดแล้วเทียบด้วยชุด n-gram จึงทนต่อการสะกดต่างกันเล็กน้อยmetaphone จับตามเสียงอ่านของภาษาอังกฤษ ใช้กับภาษาไทยไม่ได้levenshtein เทียบทุกคู่ด้วยระยะห่างของข้อความ จับกลุ่มเมื่อความคล้ายถึงเกณฑ์ และหยุดพร้อมคำอธิบายเมื่อค่าไม่ซ้ำเกิน 5,000 แบบ เพราะจะช้าเกินไปcanonical — พบบ่อยที่สุด ยาวที่สุด หรือสั้นที่สุด| Parameter | Type | Default |
|---|---|---|
column | string | — |
algorithm | fingerprint | ngram_fingerprint | metaphone | levenshtein | "fingerprint" |
threshold | number | 0.85 |
ngramSize | number | 2 |
canonical | most_frequent | longest | shortest | "most_frequent" |
import json
import re
import unicodedata
def fingerprint(value):
text = unicodedata.normalize('NFKD', value).lower()
text = ''.join(ch for ch in text if not unicodedata.combining(ch))
text = re.sub(r'[^\w\s-]', ' ', text, flags=re.UNICODE)
tokens = sorted(set(text.split()))
return ' '.join(tokens)
def find_similar_values(values, canonical='most_frequent'):
groups = {}
for value in values:
if value is None:
continue
groups.setdefault(fingerprint(value), []).append(value)
standard = {}
for members in groups.values():
if len(set(members)) < 2:
continue
if canonical == 'longest':
winner = max(members, key=len)
else:
winner = max(set(members), key=lambda m: (members.count(m), -members.index(m)))
for member in members:
standard[member] = winner
return [None if v is None else standard.get(v, v) for v in values]
values = ['Bangkok Co.,Ltd.', 'bangkok co ltd', 'BANGKOK CO., LTD', 'Chiang Mai Co.', None]
print(json.dumps(find_similar_values(values), ensure_ascii=False))
คอลัมน์ company มีค่าไม่ซ้ำ 812 ค่าจาก 2,000 แถว เปิดหน้า Cluster Review เลือกอัลกอริทึม fingerprint แล้วไล่ดูทีละกลุ่ม แก้ค่ามาตรฐานของกลุ่มที่ระบบเลือกมาไม่ตรงใจ ติ๊กเฉพาะกลุ่มที่มั่นใจ แล้วกดเพิ่มเข้า Pipeline ผลที่ได้จะเป็นขั้นตอน map_values ที่ระบุค่าตรง ๆ จึงใช้ซ้ำกับไฟล์เดือนหน้าได้ผลเหมือนเดิม
ใช้ unicode_normalize และ trim_whitespace ก่อนเพื่อลดกลุ่มปลอม ใช้ map_values เพื่อบันทึกการตัดสินใจอย่างถาวร และใช้ find_fuzzy_duplicates เมื่อปัญหาคือแถวซ้ำ ไม่ใช่ค่าซ้ำ