Skip to main content

อ้างอิง API

v0.5.0

Public 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"