Files
talk/internal/langdetect/detect.go
T
m3ta-chiron de1ef64b8f feat(langdetect): deutsche/englische Spracherkennung als reine Funktion
Detect(text) → "de" | "en" (Default "de"): Common-Word-Listen plus
Umlaute/ß als Deutsch-Signale; Englisch gewinnt nur bei strikter Mehrheit.
Tischgesteuerte Tests für de/en/gemischt/leer.
2026-10-18 15:38:42 +02:00

78 lines
2.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package langdetect
import (
"strings"
"unicode"
)
// Detect erkennt die Sprache eines Ansage-Texts und liefert "de" oder "en".
// Default (auch bei leerem oder unentscheidbarem Text) ist "de".
//
// Heuristik: Common-Word-Listen deutscher und englischer Wörter plus
// Umlaute/ß als starke Deutsch-Signale. Englisch gewinnt nur bei strikt
// mehr englischen Signalen als deutschen; bei Gleichstand entscheidet der
// Default "de". Die Funktion ist rein (kein globaler Zustand, keine IO).
func Detect(text string) string {
var de, en int
for _, r := range text {
switch r {
case 'ä', 'ö', 'ü', 'ß', 'Ä', 'Ö', 'Ü':
de++
}
}
for _, word := range strings.FieldsFunc(text, func(r rune) bool {
return !unicode.IsLetter(r) && r != '\'' && r != '’'
}) {
word = strings.ToLower(word)
if _, ok := germanWords[word]; ok {
de++
}
if _, ok := englishWords[word]; ok {
en++
}
}
if en > de {
return "en"
}
return "de"
}
// germanWords sind häufige deutsche Wörter, die im Englischen nicht
// vorkommen (Mehrdeutigkeiten wie „was" und „in" wurden weggelassen).
var germanWords = map[string]struct{}{
"der": {}, "die": {}, "das": {}, "und": {}, "nicht": {}, "ist": {},
"ein": {}, "eine": {}, "einen": {}, "einem": {}, "einer": {},
"mit": {}, "für": {}, "auf": {}, "von": {}, "vom": {}, "zum": {},
"zur": {}, "den": {}, "dem": {}, "des": {}, "wir": {}, "ihr": {},
"sie": {}, "auch": {}, "als": {}, "wie": {}, "bei": {},
"aus": {}, "nach": {}, "noch": {}, "nur": {}, "schon": {},
"wenn": {}, "dann": {}, "aber": {}, "oder": {}, "doch": {},
"mehr": {}, "sehr": {}, "über": {}, "unter": {}, "jetzt": {},
"hier": {}, "heute": {}, "morgen": {}, "danke": {}, "bitte": {},
"erfolgreich": {}, "fehlgeschlagen": {}, "fertig": {},
"gestartet": {}, "beendet": {}, "abgeschlossen": {}, "warten": {},
"läuft": {}, "kannst": {}, "muss": {}, "soll": {},
"kein": {}, "keine": {}, "wieder": {}, "werden": {}, "wurde": {},
"wurden": {}, "haben": {}, "geht": {}, "machen": {},
}
// englishWords sind häufige englische Wörter, die im Deutschen nicht
// vorkommen.
var englishWords = map[string]struct{}{
"the": {}, "is": {}, "not": {}, "and": {}, "with": {}, "for": {},
"on": {}, "of": {}, "to": {}, "from": {}, "by": {}, "at": {},
"or": {}, "but": {}, "if": {}, "then": {}, "when": {}, "how": {},
"what": {}, "why": {}, "who": {}, "done": {}, "failed": {},
"finished": {}, "started": {}, "completed": {}, "error": {},
"warning": {}, "thanks": {}, "you": {}, "your": {},
"we": {}, "it": {}, "this": {}, "that": {}, "these": {},
"those": {}, "was": {}, "were": {}, "are": {}, "be": {},
"been": {}, "has": {}, "have": {}, "had": {}, "can": {},
"will": {}, "would": {}, "should": {}, "could": {}, "just": {},
"only": {}, "still": {}, "already": {}, "now": {}, "today": {},
"tomorrow": {}, "waiting": {}, "running": {}, "please": {},
"needs": {}, "need": {}, "succeeded": {},
}