อ้างอิง API
v0.5.0Public API ของ kham-core — ไลบรารี pure Rust แบบ no_std เอกสารฉบับเต็มอยู่ที่ docs.rs/kham-core docs.rs/kham-core
| โมดูล / ประเภท | คำอธิบาย |
|---|---|
| Tokenizer | ตัดคำภาษาไทยด้วย Maximal Matching บน DAWG dictionary ในตัว |
| Token / TokenKind | Token แบบ zero-copy พร้อม byte span, char span และประเภทอักษร |
| FtsTokenizer | pipeline FTS: stopwords, synonyms, POS, NE, soundex ในครั้งเดียว |
| PosTagger | POS tagger 13 หมวดหมู่ มาจาก ORCHID tagset |
| NeTagger | จดจำ Named Entity: บุคคล สถานที่ องค์กร |
| RomanizationMap | แปลงคำภาษาไทยเป็นอักษรโรมัน RTGS |
| number | จัดการตัวเลขภาษาไทย: แปลงหลัก, อ่านจำนวน, ข้อความบาท |
| sentence | ตรวจหาจุดสิ้นสุดประโยค แบ่งย่อหน้าเป็นประโยค |
| soundex | Phonetic codes: lk82, udom83, MetaSound และ cross-language ไทย–อังกฤษ |
Tokenizer
docs.rs ↗ตัวตัดคำหลัก ใช้ DAWG dictionary ในตัวและตารางความถี่ TNC ทุก Token อ้างอิงข้อความต้นฉบับแบบ zero-copy
use kham_core::Tokenizer;
let tok = Tokenizer::new();
let tokens = tok.segment("กินข้าวกับปลา");
for t in &tokens {
println!("{} ({:?})", t.text, t.kind);
} Token / TokenKind
docs.rs ↗แต่ละ Token มี text (slice ไม่คัดลอก), span (byte offset), char_span (Unicode offset) และ kind
use kham_core::{Tokenizer, TokenKind};
let tok = Tokenizer::new();
let input = "ธนาคาร100แห่ง";
for t in &tok.segment(input) {
println!("{:8} kind={:?} chars={}..{}", t.text, t.kind,
t.char_span.start, t.char_span.end);
}
// ธนาคาร kind=Thai chars=0..6
// 100 kind=Number chars=6..9
// แห่ง kind=Thai chars=9..12 FtsTokenizer
docs.rs ↗รวม pipeline NLP ในครั้งเดียว: stopword, synonym, POS, NE, RTGS romanization, phonetic code ใช้ภายใน extension PostgreSQL และ SQLite
use kham_core::fts::FtsTokenizer;
use kham_core::soundex::SoundexAlgorithm;
let fts = FtsTokenizer::builder()
.soundex(SoundexAlgorithm::Lk82)
.number_normalize(true)
.build();
let tokens = fts.segment_for_fts("กินข้าวกับปลา");
// lexeme list สำหรับ tsvector
let lexemes = fts.lexemes("กินข้าวกับปลา"); PosTagger
docs.rs ↗POS tagger แบบ dictionary-lookup 13 หมวดหมู่ตาม ORCHID tagset: NOUN, VERB, ADJ, ADV, PART, PROPN, PRON, NUM, CLAS, CONJ, AUX, DET, PREP
use kham_core::pos::PosTagger;
let tagger = PosTagger::builtin();
println!("{:?}", tagger.tag("กิน")); // Some(Verb)
println!("{:?}", tagger.tag("ปลา")); // Some(Noun)
// TSV เองได้: คำ TAB POS_TAG
let custom = PosTagger::from_tsv("แชทบอท\tNOUN\n"); NeTagger
docs.rs ↗จดจำ Named Entity จาก gazetteer สามประเภท: Person (บุคคล), Place (สถานที่), Org (องค์กร)
use kham_core::ne::NeTagger;
let ne = NeTagger::builtin();
println!("{:?}", ne.tag("กรุงเทพ")); // Some(Place)
// post-process token list
let tok = kham_core::Tokenizer::new();
let tokens = tok.segment("บริษัทไทยออยล์ในกรุงเทพ");
let tagged = ne.tag_tokens(tokens, "บริษัทไทยออยล์ในกรุงเทพ"); RomanizationMap
docs.rs ↗แปลงคำภาษาไทยเป็นอักษรโรมัน RTGS ใช้ romanize_or_raw() เมื่อต้องการค่าคืนเสมอ
use kham_core::romanizer::RomanizationMap;
let rom = RomanizationMap::builtin();
println!("{:?}", rom.romanize("กรุงเทพ")); // Some("Krung Thep")
println!("{}", rom.romanize_or_raw("ปลา")); // "pla" number
docs.rs ↗จัดการตัวเลขภาษาไทย: แปลงเลขไทย, อ่านตัวเลขจากคำ, สร้างข้อความบาท
use kham_core::number::thai_digits_to_ascii;
let s = thai_digits_to_ascii("ราคา ๑๒๓ บาท");
println!("{s}"); // "ราคา 123 บาท" sentence
docs.rs ↗แบ่งข้อความเป็นประโยค ภาษาไทยไม่มีเครื่องหมายวรรคตอนระบุประโยคชัดเจน จึงใช้ช่องว่าง ขึ้นบรรทัดใหม่ และรูปแบบเครื่องหมายไทยในการตรวจหา
use kham_core::sentence::split_sentences;
let text = "กินข้าวกับปลา วันนี้อากาศดี\nพรุ่งนี้จะไปเที่ยว";
let sentences = split_sentences(text);
for (i, s) in sentences.iter().enumerate() {
println!("S{}: {:?}", i, s.text);
} soundex
docs.rs ↗Phonetic encoding สามอัลกอริทึม: lk82 (ราชบัณฑิต 2525), udom83 (อุดม 2526) และ MetaSound รองรับ cross-language ไทย–อังกฤษ
use kham_core::soundex::{lk82, udom83, metasound};
println!("{}", lk82("กรุงเทพ")); // "ก640"
println!("{}", udom83("กรุงเทพ")); // "ก5050"
println!("{}", metasound("กรุงเทพ")); // "ก300"