Levenshtein Distance Calculator: คำนวณ Edit Distance และความคล้ายของข้อความ
วิธีใช้ Levenshtein Distance Calculator คำนวณ edit distance, similarity ratio และความต่างของข้อความสองชุดแบบทันที ฟรี ใช้งานง่าย และประมวลผล 100% ฝั่ง client
Table of Contents
ข้อความสองชุด "ต่างกันแค่ไหน" — คำถามนี้ในโลกของ software ไม่ได้ตอบด้วยความรู้สึก แต่ตอบด้วยตัวเลขที่นับได้แม่นยำ นั่นคือจำนวนครั้งน้อยที่สุดของการแก้ข้อความทีละตัวอักษรที่ใช้เปลี่ยน string หนึ่งให้กลายเป็นอีก string หนึ่ง คำถามนี้โผล่มาเรื่อย ๆ ไม่ว่าจะเป็น spell checker ที่ต้องเดาว่าคนพิมพ์ "recieve" หมายถึง "receive" งาน dedupe ข้อมูลลูกค้าที่ต้องตัดสินว่า "สมชาย ใจดี" กับ "สมชายใจดี" เป็นคนเดียวกันหรือเปล่า หรือ test suite ที่ต้องยืนยันว่า formatter แก้โค้ดเท่าที่จำเป็นจริง ๆ คำตอบของทั้งหมดนี้คือ Levenshtein distance และวิธีเร็วที่สุดที่จะได้คำตอบคือ Levenshtein Distance Calculator
เครื่องมือรับ string สองชุดแล้วคืนค่า edit distance ทันที — จำนวนน้อยที่สุดของการ insert, delete และ substitute ที่ใช้แปลงข้อความหนึ่งเป็นอีกข้อความหนึ่ง แต่มันไม่ได้หยุดแค่ตัวเลขเดียว คุณยังได้ similarity ratio ในรูปเปอร์เซ็นต์ สรุปย่อยว่ามี match, substitution, insertion, deletion กี่ครั้งแต่ละอย่าง มุมมอง alignment ที่ระบายสีตำแหน่งต่าง ๆ ทีละตัวอักษร และเมื่อข้อความสั้นพอ ยังได้ dynamic programming matrix แบบเต็ม ให้เห็นเลยว่า algorithm คิดคำนวณมาอย่างไรทีละช่อง
ทุกอย่างประมวลผลในเบราว์เซอร์ของคุณ ไม่มีการยิง request ไป server ไม่มีการอัปโหลด ไม่มี log เก็บข้อความของคุณ — เรื่องนี้สำคัญมากเวลาที่คุณแปะชื่อลูกค้าจริง internal identifier หรือข้อความใด ๆ ที่ไม่ควรหลุดออกไปหาบุคคลที่สาม
ทำไมต้องใช้ Levenshtein Distance Calculator?
- ได้คำตอบแม่นยำทันที — edit distance และ similarity ratio คำนวณสด ๆ ตอนที่คุณพิมพ์ ไม่ต้องหาปุ่ม Calculate ให้เมื่อย แปะข้อความสองชุดแล้วอ่านผลได้เลย
- สรุป operation แบบละเอียด — รู้ไม่ใช่แค่ว่า distance เท่ากับ 5 แต่รู้ว่ามันประกอบด้วย substitution 2, insertion 1 และ deletion 2 ซึ่งบอกว่าความต่างเป็น "แบบไหน" ไม่ใช่แค่ "มากแค่ไหน"
- alignment แบบ visual — เครื่องมือจัดข้อความสองชุดเรียงกันแล้วระบายสีแยกตำแหน่ง ทำให้เห็นทันทีว่าต่างกันตรงไหน ไม่ต้องเพ่งเทียบเอาเอง
- DP matrix แบบเต็ม — สำหรับข้อความยาวไม่เกิน 24 ตัวอักษร เครื่องมือวาดตาราง dynamic programming ทั้งใบ มีประโยชน์มากถ้าคุณกำลังเรียน algorithm, debug implementation ของตัวเอง หรือสอนคนอื่น
- ตัวเลือก normalization ที่ฉลาด — toggle case-insensitive และ ignore-whitespace ให้คุณกำหนดเองว่า "Hello World" กับ "helloworld" จะนับว่าเหมือนหรือต่าง โดยไม่ต้องไปแก้ข้อความต้นฉบับ
- เป็นส่วนตัวโดยดีไซน์ — คำนวณฝั่ง client ล้วน ๆ ข้อมูล sensitive ไม่ออกจากเครื่องคุณ เหมาะกับข้อมูลลูกค้าจริง codename ภายใน หรืออะไรก็ตามที่อยู่ใต้ NDA
ฟีเจอร์เด่น
| ฟีเจอร์ | ทำอะไร |
|---|---|
| Edit distance | จำนวนน้อยที่สุดของการแก้ทีละตัวอักษร (insert / delete / substitute) เพื่อแปลง String A เป็น String B |
| Similarity ratio | เปลี่ยน distance เป็นเปอร์เซ็นต์ 0–100% ใช้ตั้ง threshold ได้ง่าย |
| Operation counts | นับ match, substitution, insertion, deletion แยกกันเป๊ะ ๆ |
| Character alignment | มุมมองเรียงคู่ระบายสี ให้เห็นว่าข้อความสองชุดบรรจบกันตรงไหน |
| DP matrix | ตาราง dynamic programming เต็มใบ สำหรับข้อความยาวไม่เกิน 24 ตัวอักษรต่อชุด |
| Hamming distance | แสดงอัตโนมัติเมื่อข้อความสองชุดยาวเท่ากัน |
| ปุ่ม Swap | สลับ A กับ B ทันที สะดวกเวลาเทียบซ้ำ ๆ หลายคู่ |
| Copy result | คลิกเดียวคัดลอกสรุปผลเป็น plain text ใส่ clipboard |
มีสองรายละเอียดที่สมควรเน้น อันดับแรกคือ similarity ratio คำนวณจากสูตร 1 − distance / max(len(A), len(B)) ซึ่งเป็น normalization มาตรฐานที่เปลี่ยน distance ให้เป็นสเกล 0–100% ทำให้ได้ตัวเลขที่ตั้ง threshold ได้สะดวก เพราะกฎแบบ "ถ้าเกิน 85% ถือว่าเป็น match กัน" ใช้งานจริงง่ายกว่าตัดด้วย raw distance ที่ค่าความหมายเปลี่ยนตามความยาวข้อความ
อันดับที่สองคือโบนัส Hamming distance — เมื่อข้อความสองชุดยาวเท่ากัน เครื่องมือจะแสดง Hamming distance ด้วย คือจำนวนตำแหน่งที่ตัวอักษรต่างกัน การเทียบสองตัวเลขนี้ให้ความรู้จริง ๆ เพราะ Hamming อนุญาตแค่ substitution จึงเป็นค่า upper bound ที่ไม่เห็นเส้นทาง insert/delete ที่ถูกกว่าซึ่ง Levenshtein หาเจอ
วิธีใช้งาน
- เปิด Levenshtein Distance Calculator ในเบราว์เซอร์
- แปะหรือพิมพ์ข้อความชุดแรกลงช่อง String A
- แปะหรือพิมพ์ข้อความชุดที่สองลง String B — ผลอัปเดตสด ๆ ตามที่คุณพิมพ์
- ถ้าจำเป็น เปิด toggle case-insensitive หรือ ignore whitespace เพื่อกำหนดว่าจะนับความต่างแบบไหน
- อ่านค่า distance, similarity ratio และ operation breakdown — หรือเลื่อนดู alignment กับ DP matrix สำหรับภาพเต็ม แล้วกด Copy เก็บสรุปผลไว้ใช้
เข้าใจ Edit Distance
Levenshtein distance ระหว่างข้อความสองชุดคือจำนวนน้อยที่สุดของ operation ระดับตัวอักษรเดียว — insert ตัวอักษรเพิ่ม, delete ตัวอักษรทิ้ง หรือ substitute ตัวหนึ่งเป็นอีกตัวหนึ่ง — ที่ใช้แปลงข้อความแรกให้เป็นข้อความที่สอง ตัวอย่างคลาสสิก: kitten → sitting มี distance เท่ากับ 3
ทำไมเป็น 3? เพราะแปลงได้ด้วย operation สามครั้งพอดี:
- kitten → sitten (substitute k → s)
- sitten → sittin (substitute e → i)
- sittin → sitting (insert g)
ไม่มีลำดับที่น้อยกว่านี้ที่ทำได้ ดังนั้น distance คือ 3 จากค่าสูงสุดที่เป็นไปได้ 7 (ความยาวของข้อความที่ยาวกว่า) ทำให้ similarity ratio เท่ากับ 1 − 3/7 ≈ 57.1%
algorithm ที่คำนวณเรื่องนี้เป็น dynamic programming มันสร้างตาราง d ที่ d[i][j] เก็บ edit distance ระหว่าง i ตัวอักษรแรกของ A กับ j ตัวอักษรแรกของ B แถวและคอลัมน์แรกแทนการแปลงจาก/ไป string ว่าง จึงเป็นแค่ 0, 1, 2, 3... ที่เหลือเติมตาม recurrence เดียว:
d[i][j] = min( d[i-1][j] + 1, // deletion d[i][j-1] + 1, // insertion d[i-1][j-1] + (A[i-1] === B[j-1] ? 0 : 1) // match หรือ substitution )
แต่ละช่องมองเพื่อนบ้านสามตัว — บน, ซ้าย, และทแยง — แล้วเลือกเส้นทางที่ถูกที่สุด คำตอบอยู่มุมขวาล่างของตาราง นี่คือตารางเป๊ะ ๆ ที่เครื่องมือวาดให้ดูสำหรับข้อความสั้น ทำให้คุณไล่เหตุผลของ algorithm ได้ทีละช่อง ส่วน +0 / +1 ตรงทแยงคือหัวใจ: ถ้าตัวอักษรเหมือนกัน การ edit ฟรี เราแค่ยกค่าทแยงมาใช้ ถ้าไม่เหมือน เราจ่าย 1 เพื่อ substitute แล้วเทียบกับการจ่าย 1 ไป delete หรือ insert แทน
สมบัติที่ควรเข้าใจสักหน่อย:
- สมมาตร — distance(A, B) = distance(B, A) เพราะฉะนั้นปุ่ม Swap ไม่เปลี่ยนผลลัพธ์แม้แต่นิดเดียว
- Triangle inequality — distance(A, C) ≤ distance(A, B) + distance(B, C) สมบัตินี้ทำให้ library พวก fuzzy search ตัดต้นไม้ candidate ได้หนักมือ
- Hamming เป็นกรณีพิเศษ — เมื่อข้อความยาวเท่ากันและห้าม insert/delete Levenshtein ยุบลงเป็น Hamming distance นี่คือเหตุผลที่เครื่องมือแสดงทั้งสองค่าเมื่อทำได้
Use Cases ที่ใช้จริง
Fuzzy search และ spell checking
application ต้นตำรับของเรื่องนี้ spell checker คำนวณ distance จากคำที่สะกดผิดไปหาทุกคำใน dictionary แล้วเสนอคำที่ใกล้ที่สุด — "recieve" ห่างจาก "receive" แค่ 1 ส่วน similarity ratio คือสิ่งที่คุณตั้ง threshold ในช่อง search-as-you-type: เรียง candidate ตาม distance เก็บเฉพาะที่ต่ำกว่า cutoff ผู้ใช้ก็เจอสิ่งที่ตั้งใจหาโดยไม่ต้องพิมพ์ถูกต้อง 100%
Dedupe ข้อมูลและจับคู่ record
ข้อมูลใน CRM กับ mailing list มันรกเสมอ: "Jon Smith", "John Smith" และ "Jhn Smith" น่าจะเป็นคนเดียวกัน การ match ด้วย distance ช่วย flag record ที่เกือบซ้ำให้คนมา review และ toggle case/whitespace ถูกออกแบบมาเพื่องานนี้โดยเฉพาะ — normalize ทิ้งทั้งสองอย่าง แล้วเหลือเฉพาะความต่างของตัวอักษรที่ มีความหมาย จริง ๆ ทีมจำนวนมากใช้กฎแบบ "distance ≤ 2 ถือเป็น merge candidate"
ตรวจ input ที่พิมพ์ผิด
ชื่อ command, รหัส SKU, feature flag, API endpoint — ผู้ใช้พิมพ์ผิดได้ทั้งหมด แทนที่จะ reject "reszie" ด้วย error กลาง ๆ ลองคำนวณ distance ไปยังรายการค่าที่ valid แล้วตอบกลับว่า "did you mean resize?" Levenshtein สองบรรทัดเปลี่ยนทางตันให้เป็นคำแนะนำที่เป็นประโยชน์ และเครื่องมือนี้คือวิธีเร็วที่สุดที่จะ prototype ว่า threshold เท่าไหร่ลงตัวกับ vocabulary ของคุณ
เทียบ content และ output
นักเขียนกับ QA ใช้มันเป็น diff score แบบเบา ๆ: สองเวอร์ชันของ headline, release note หรือ string ที่ generate ออกมาต่างกันแค่ไหน operation breakdown มีประโยชน์กว่าที่คิด — เวอร์ชันที่ต่างด้วย substitution 1 กับเวอร์ชันที่ต่างด้วย insertion 1 ล้วนเป็น "distance 1" ทั้งคู่ แต่เป็นการเปลี่ยนแปลง คนละชนิด และมุมมอง alignment ทำให้เห็นความต่างนั้นชัด ๆ เนื่องจาก Levenshtein เป็นการเทียบแบบ position-based (ไม่ใช่ order-free) มันจึงเข้าคู่กับ Diff Checker ได้ดีเวลาที่ต้องการเทียบระดับบรรทัดแทนที่จะเป็นระดับตัวอักษร
Best Practices
- normalize ก่อนเทียบเสมอ — ตัดสินใจตั้งแต่ต้นว่า case กับ whitespace จะถูกปฏิบัติอย่างไร toggle ทั้งสองมีอยู่เพราะ "Mustang GT" กับ "mustang gt" มักควรเป็น 0 ไม่ใช่ 2
- ตั้ง threshold ด้วย ratio ไม่ใช่ raw distance — distance 2 เป็นเรื่องใหญ่มากสำหรับ code 4 ตัวอักษร แต่เป็นเรื่องเล็กมากสำหรับย่อหน้ายาว ๆ ส่วน similarity แบบเปอร์เซ็นต์ scale ได้สมเหตุสมผลข้ามความยาว
- อย่าลืมว่ามันเป็นระดับตัวอักษร — Levenshtein เห็นตัวอักษร ไม่เห็นคำ "car park" กับ "park car" มี distance 6 ทั้งที่ใช้คำเหมือนกันทุกคำ การสลับลำดับต้องใช้เทคนิคอื่น
- ระวังต้นทุน quadratic ตอน scale — algorithm DP มีความซับซ้อน O(m×n) เกินสองสามพันตัวอักษรต่อ string เริ่มช้า ตัวจำกัด matrix 24 ตัวอักษรของเครื่องมือมีเหตุผลเดียวกัน — สิ่งที่ถูกจำกัดคือ visualization ไม่ใช่คณิตศาสตร์
- ใช้ matrix ตอน debug implementation ตัวเอง — ถ้าโค้ดคุณคำนวณไม่ตรงกับเครื่องมือ เทียบช่องระหว่างทาง ไม่ใช่แค่มุมสุดท้าย จะรู้ทันทีว่า bug อยู่ตรงไหน
- ข้อความ sensitive ให้อยู่ฝั่ง client — นั่นคือประเด็นหลักของเครื่องมือนี้: ไม่มี network call ไม่มี log ไม่มี history ที่ถูกเก็บ
ลองใช้ Levenshtein Distance Calculator วันนี้
ไม่ว่าคุณจะกำลังปรับ threshold ของ fuzzy match, debug ฟังก์ชัน edit distance, dedupe ตารางลูกค้า หรือแค่สงสัยว่า "kitten" กับ "sitting" ห่างกันแค่ไหนจริง ๆ Levenshtein Distance Calculator ให้คำตอบ — พร้อมเหตุผลที่อยู่เบื้องหลัง — ในเวลาที่คุณแปะข้อความลงไป distance, ratio, operation counts, alignment และ DP matrix เต็มรูปแบบ เป็นส่วนตัวและเร็วทันใจ
เครื่องมือที่เกี่ยวข้อง
- Diff Checker — เทียบข้อความหรือโค้ดสองก้อนทีละบรรทัด เมื่อต้องการ diff เชิงโครงสร้าง ไม่ใช่แค่นับตัวอักษร
- Word Counter — นับคำ ตัวอักษร ประโยค และย่อหน้าของข้อความที่คุณกำลังวิเคราะห์แบบรวดเร็ว
- Text Case Converter — normalize string ระหว่าง camelCase, snake_case, UPPER และอื่น ๆ ก่อนรันการเทียบ
ขอให้สนุกกับการวัดระยะ!