บันทึกการเปลี่ยนแปลง
การเปลี่ยนแปลงสำคัญทุกรายการของ kham ตาม Keep a Changelog และ Semantic Versioning
เพิ่มเติม — ข้อมูล kham-core
- ขยาย NE gazetteer — 36,668 → 38,950 รายการ (+2,280 จาก
pythainlp/thainer-corpus-v2, CC0): +403 PERSON, +793 PLACE, +1,084 ORG - ขยายตาราง POS — 8,993 → 11,404 รายการ (+2,407 จาก
UD_Thai-PUD, CC-BY-SA-3.0): +884 PROPN, +665 VERB, +662 NOUN, +134 ADJ และอื่นๆ ผ่านการแม็ป UPOS สู่ระบบ 13 หมวดของ kham wiki_freq.tsv— ไฟล์ความถี่คำเสริม (CC-BY-SA-4.0) จาก 500 บทความ Thai Wikipedia; 19,890 รายการ แยกเก็บจาก CC0tnc_freq.txt; ยังไม่ได้โหลดใน FreqMap
แก้ไข
- Docker Hub image tags — แก้ไข tag ให้ใช้รูปแบบที่มีคำนำหน้า
v(เช่นv0.8.1); เอกสารก่อนหน้านี้แสดง tag โดยไม่มีคำนำหน้าv
เพิ่มเติม — kham-core
Token::confidence: f32— คะแนนความมั่นใจในการตัดคำสำหรับทุก token;0.0สำหรับ Unknown tokens,1.0สำหรับคำที่อยู่ในพจนานุกรมอย่างชัดเจน; ค่ากลางสะท้อนความถี่ TNC และความคลุมเครือของขอบเขต ถ่ายทอดไปยังFtsToken::confidenceและ binding ทั้งหมดTokenStream/Tokenizer::segment_stream(text)— streaming iterator พร้อมnext_word(),next_known()และnext_above_confidence(f32)SpellChecker::did_you_mean(word)— คืนNoneหากคำอยู่ในพจนานุกรม,Some(best_match)หากไม่พบSpellChecker::correct_text(text)— ตัดคำ input แล้วแทนที่ Unknown token (≥ 2 อักขระ) ทุกตัวด้วยการแก้ไขคำสะกดที่ดีที่สุด; token ที่รู้จักผ่านไปตามเดิมRomanizationMap::romanize_sentence(text)— ตัดคำและแปลง RTGS ทุก token ภาษาไทย/Named; token ที่ไม่ใช่ภาษาไทย (ตัวเลข, Latin, เครื่องหมายวรรคตอน, ช่องว่าง) ผ่านไปตามเดิมKeyExtractor::extract_phrases(text, max_n)— วลีสำคัญแบบ bigram และ trigram จาก content token ที่อยู่ติดกัน คะแนน TF × average-IDF; เสริมการสกัดคำเดี่ยวด้วยextract()
เพิ่มเติม — bindings (Python / WASM / C FFI)
spell_did_you_mean/kham_spell_did_you_mean— ตรวจสอบการแก้ไขคำเดี่ยว เปิดใช้งานใน binding ทั้งสามspell_correct_text/kham_spell_correct_text— แก้ไขคำสะกดทั้งข้อความ เปิดใช้งานใน binding ทั้งสามromanize_sentence/kham_romanize_sentence— แปลง RTGS ระดับประโยค เปิดใช้งานใน binding ทั้งสามextract_phrases/kham_extract_phrases— สกัดวลีสำคัญ เปิดใช้งานใน binding ทั้งสามsegment_above_confidence(text, min_confidence)(Python / WASM) — filter สะดวกที่คืนเฉพาะ token ที่มี confidence ≥ threshold ผ่านsegment_stream- field
confidenceบน Token — เปิดใช้งานใน Python, WASM และ C FFI (KhamToken) เป็นfloat/f32
เพิ่มเติม — kham-cli
--confidence— แสดงconf=X.XXต่อ token ในโหมด text output--min-confidence <MIN>— กรอง output เฉพาะ token ที่มี confidence ≥ MIN ผ่านsegment_stream--format text|json|csv— output แบบ structured สำหรับทั้งโหมด basic และ FTS--romanize— ตัดคำและแปลง Thai เป็น RTGS Latin; token ที่ไม่ใช่ภาษาไทยผ่านไปตามเดิม--spell— โหมดตรวจสอบคำสะกด: แสดง suggestions ที่จัดอันดับสำหรับคำ input โดยใช้ Levenshtein + phonetic re-ranking--keywords— โหมด keyword: แสดงคำสำคัญและวลีสำคัญจากข้อความพร้อมคะแนน TF × IDF--top-n <N>— จำนวนผลลัพธ์สูงสุดใน--spellหรือ--keywords(ค่าเริ่มต้น: 10)
เพิ่มเติม — kham-pg
- การกรอง stopword — คำไวยากรณ์ภาษาไทย (กับ, ใน, ของ, …) จะถูกกรองออกจาก tsvector โดยอัตโนมัติผ่าน
kham_fts_dictลด noise ใน index โดยไม่ต้องตั้งค่าเพิ่มเติม - การแปลงตัวเลขไทย — ตัวเลขไทย (๑๒๓) จะถูก index พร้อมกับรูป ASCII (123) ในตำแหน่งเดียวกัน ทำให้ค้นหาด้วย
plainto_tsquery('kham', '123')แล้วเจอเอกสารที่มี ๑๒๓ ได้ทันที - การขยาย POS lexeme — token ที่รู้ชนิดคำพูดจะมี lexeme
pos_<tag>เพิ่ม (เช่นpos_noun,pos_verb) กรองตามชนิดคำด้วย'pos_verb'::tsquery kham_fts_dict_udom83และkham_fts_dict_metasound— dictionary variants สองแบบที่ใช้อัลกอริทึม udom83 และ MetaSound สำหรับการจับเสียงที่ละเอียดกว่าkham_tsvector(text)และkham_tsquery(text)— SQL STABLE helper ย่อ; ใช้แทนto_tsvector('kham', …)และplainto_tsquery('kham', …)เพื่อลดความซ้ำซ้อนของชื่อ configurationStopwordSet::builtin_with_extra(extra)(kham-core) — รวม built-in stopword 1 029 คำกับคำเพิ่มเติมของผู้ใช้ในครั้งเดียวFtsTokenizer::segment_stream(text)(kham-core) — คืนFtsTokenStreamiterator พร้อมnext_index_token()สำหรับข้าม stopword อัตโนมัติ
เปลี่ยนแปลง — kham-pg
- การ mapping token ตัวเลข — configuration
khamเปลี่ยน token ชนิดnumberให้ผ่านkham_fts_dictแทนkham_dictรันALTER EXTENSION kham_pg UPDATEเพื่อ upgrade ฐานข้อมูลที่มีอยู่
เพิ่มเติม — kham-core
- SpellChecker —
SpellChecker::builtin().suggestions(word, n)คืนค่า candidates ที่จัดอันดับแล้ว (Levenshtein ≤ 2, lk82 soundex match, คะแนนความถี่ TNC) - KeyExtractor —
KeyExtractor::builtin().extract(text, n)คืนคำสำคัญ top-N โดยคะแนน TF × IDF-proxy ตัด stopword ออกอัตโนมัติ FtsTokenizerBuilder::dict_merge()— method builder ใหม่สำหรับเพิ่มคำพิเศษตอนสร้างFtsTokenizer(fast overlay ไม่ rebuild trie)
เพิ่มเติม — bindings (WASM / Python / C FFI)
- spell_suggestions / kham_spell_suggestions — เปิดใช้งานใน
kham-wasm,kham-pythonและkham-capiพร้อม result typeSpellSuggestion/KhamSpellList - extract_keywords / kham_keywords — เปิดใช้งานในทุก binding พร้อม
Keyword/KhamKeywordList - Live demo — แท็บ Spell & Keywords — demo แบบ interactive ในเบราว์เซอร์สำหรับตรวจสอบคำสะกดและสกัดคำสำคัญ ขับเคลื่อนด้วย WASM
เพิ่มเติม — kham-sqlite
- Custom synonym map — argument
synonyms '<path>'โหลดไฟล์ TSV คำพ้องความหมายตอนสร้างตาราง ส่ง synonym เป็นFTS5_TOKEN_COLOCATED - Custom dictionary overlay — argument
dict '<path>'เพิ่มคำเฉพาะทางไว้บนพจนานุกรมในตัว โดยไม่ต้อง rebuild trie ใหม่ - Integration test suite — 31 tests ครอบคลุม MATCH พื้นฐาน, RTGS, lk82 soundex, snippet/highlight, stopword, mixed script, NE, config ทั้งหมด
- รองรับ Windows —
build.rsตรวจจับ Windows และค้นหา SQLite headers ผ่าน vcpkg (VCPKG_ROOT) หรือSQLITE_INCLUDE_DIRมีkham_sqlite.dllสำเร็จรูปใน release assets - Android NDK build — CI release workflow คอมไพล์
libkham_sqlite.soสำหรับ 4 ABI (arm64-v8a,armeabi-v7a,x86_64,x86) ผ่าน Android NDK ต้องใช้ sqlite-android หรือ SQLCipher (SQLite ในตัวระบบปิดload_extension)
แก้ไข — kham-sqlite
- Trigrams ไม่ถูกส่งออก —
FtsToken::trigramsสำหรับ Unknown token ถูก populate โดย FTS pipeline แต่ไม่ได้ส่งไปยัง SQLite เป็น colocated token การค้นหา OOV n-gram จึงใช้งานได้ถูกต้องแล้ว
แก้ไข
- WASM number overflow — แก้ปัญหา u32 overflow สำหรับตัวเลขขนาดใหญ่ใน
kham-wasm - แก้ไข NE tag —
ประเทศไทยเปลี่ยน tag จาก PERSON → PLACE
เพิ่มเติม — kham-pg
- kham_fts_dict — custom dictionary template ขยาย token ภาษาไทย/Named แต่ละตัวเป็น lexeme สูงสุด 6 รายการ: คำ normalized, รหัส lk82 Soundex และ RTGS romanization รองรับการค้นหาแบบ phonetic-fuzzy และ Latin-script
- รองรับ ts_headline — callback
kham_headlineลงทะเบียนเป็น HEADLINE function มี 5 regress tests - Named entity token type —
TokenKind::Named(_) → 7ลงทะเบียนในkham_lextypes
แก้ไข — kham-pg
- PG 16+ lexize calling convention — arg3 ใน
kham_dict_lexizeเป็นList*บน PG 16+ ไม่ใช่ bool เดิมทำให้ทุก token ถูก discard เป็น stopword ส่งผลให้ tsvector ว่างเปล่า
เพิ่มเติม
- Thai phonetic encoding — โมดูล
soundex:lk82,udom83,metasound,thai_english_soundex - CLI
--soundex— รหัส phonetic ปรากฏใน fieldsyn=ของ FTS output - Accuracy benchmark —
kham-bench-accuracy: P/R/F1 ระดับขอบเขตคำ,--thresholdCI gate - ขยายข้อมูล — NE gazetteer +17,240 รายการ Wikipedia + +8,980 นามสกุลไทย → 36,600 รายการ POS table +8,691 รายการ ORCHID → ~9,000 รายการ
- ลดขนาด binary — บีบอัด
tnc_freq.txt,ne_th.tsv,pos_th.tsvด้วย zlib ตอน compile time
เปลี่ยนแปลง — breaking
- Compound-first DP scoring — เปลี่ยนลำดับ priority ใน
DpScore: ลด token count มี priority 2 (เหนือกว่าการเพิ่ม dict match) แก้ปัญหา over-segmentation คำประสม Micro F1: 0.418 → 0.975, ประโยคที่ตรงกับ PyThaiNLP newmm: 1/39 → 37/39 (94.9%)
เพิ่มเติม
- โมดูล abbrev —
AbbrevMapพร้อม TSV ในตัว 118 รายการ (เดือน, ยศ, หน่วยงาน, เขตกรุงเทพฯ) ขยายคำย่อก่อนตัดคำแบบ greedy longest-first - โมดูล date — normalize วันที่ภาษาไทย: 7 รูปแบบ input, พ.ศ./ค.ศ., output เป็น ISO 8601
- โมดูล sentence — ตัดประโยคภาษาไทย: ตัวจบประโยคไทย, ไปยาลน้อย, เครื่องหมายสากล, กฎจุดคำนึงถึงทศนิยม/คำย่อ
เพิ่มเติม
- Named Entity Recognition —
NeTagger: gazetteer-based, greedy longest-match, 5 token พร้อมกัน NE gazetteer 10,488 รายการ Person / Place / Org - POS Tagging —
PosTagger: lookup-based, 338 รายการ, 13 หมวดหมู่จาก ORCHID - RTGS Romanization —
RomanizationMap: ตาราง Thai → Roman 415 รายการ - Number normalization — แปลงตัวเลขและข้อความตัวเลขภาษาไทย รวมถึงจำนวนเงินบาท
- SQLite FTS5 extension —
kham-sqlite: pipeline NLP ครบชุด, byte-accurate offsets สำหรับhighlight()และsnippet() - FTS pipeline —
FtsTokenizerbuilder รวม POS, NE, romanization, stopwords, synonym expansion ในรอบเดียว
v0.1.0 – v0.1.3 2026-04-18 – 2026-04-19
v0.1.3 — ชุด pg_regress สำหรับ PostgreSQL: 67 tests ใน 4 suite (kham_fts, kham_thai, kham_operators, kham_ranking)
v0.1.2 — PostgreSQL FTS extension (
kham-pg): parser สำหรับ PG 17, 6 token types, make install + Docker regress โมดูล FTS: stopwords, synonyms, ngramsv0.1.1 — ใบอนุญาต MIT OR Apache-2.0 dual license,
pyproject.toml สำหรับ maturinv0.1.0 — เวอร์ชันแรก: อัลกอริทึม DAG-based newmm, DARTS dictionary, TCC boundary detection, Unicode pre-tokenizer, zero-copy Token, Python (PyO3), WASM (wasm-bindgen), C FFI (cbindgen), CLI, criterion benchmarks