32 lines
728 B
Go
32 lines
728 B
Go
// Package tokens schätzt Tokenzahlen ohne echten Tokenizer (E-09).
|
|
// Kalibrierung gegen die tatsächliche usage aus jeder API-Antwort folgt in M4.
|
|
package tokens
|
|
|
|
import "unicode"
|
|
|
|
// Estimate schätzt die Tokenzahl eines Texts: len/4 für lateinischen Text,
|
|
// len/3 für überwiegend CJK-Text (dort ist ein Token meist ~1 Zeichen).
|
|
func Estimate(s string) int {
|
|
if s == "" {
|
|
return 0
|
|
}
|
|
runes := []rune(s)
|
|
cjk := 0
|
|
for _, r := range runes {
|
|
if isCJK(r) {
|
|
cjk++
|
|
}
|
|
}
|
|
n := len(runes)
|
|
if cjk*2 > n {
|
|
return n/3 + 1
|
|
}
|
|
return n/4 + 1
|
|
}
|
|
|
|
func isCJK(r rune) bool {
|
|
return unicode.Is(unicode.Han, r) ||
|
|
unicode.Is(unicode.Hiragana, r) ||
|
|
unicode.Is(unicode.Katakana, r) ||
|
|
unicode.Is(unicode.Hangul, r)
|
|
}
|