Skip to content

Thai segmentation

Source: platform/apps/app/src/lib/rag/thai-segment.ts · rendered from main on every deploy — edit in the repo, not here

platform/apps/app/src/lib/rag/thai-segment.ts
/**
* Thai word segmentation via Intl.Segmenter (available in CF Workers).
* Zero-dependency. Pluggable — swap to PyThaiNLP sidecar later via the same interface.
*/
export interface ThaiSegmenter {
segment(text: string): string;
}
let segmenter: Intl.Segmenter | null = null;
function getSegmenter(): Intl.Segmenter {
if (!segmenter) {
segmenter = new Intl.Segmenter('th', { granularity: 'word' });
}
return segmenter;
}
/** Segment Thai text into space-separated words. Latin text passes through as-is. */
export function segmentThai(text: string): string {
const seg = getSegmenter();
const segments = seg.segment(text);
return Array.from(segments)
.filter((s) => s.isWordLike)
.map((s) => s.segment)
.join(' ');
}
/** Segment for FTS5 indexing — combines Thai segmentation with lowercase Latin. */
export function segmentForIndex(text: string): string {
return segmentThai(text).toLowerCase();
}
/** Segment a search query — same as index but preserves original tokens too. */
export function segmentQuery(query: string): string {
const segmented = segmentThai(query);
// Include original query as well for exact-match boosting
const original = query.trim();
if (segmented === original) return segmented.toLowerCase();
return `${segmented} ${original}`.toLowerCase();
}