Quick start
Install the upcoming 0.9.0 API using Installation before running these
examples. Detectors operate on Python strings; decode bytes before calling them.
No training or fit() step is needed.
Screen English text
from pygarble import EnsembleDetector
detector = EnsembleDetector()
assert detector.predict("Hello world") is False
assert detector.predict("asdfghjkl") is True
assert detector.predict("नमस्ते दुनिया") is True
Hindi being flagged is expected: the default checks target English. A negative result does not establish meaning, correct grammar, or language identity.
Process a batch
from pygarble import EnsembleDetector
detector = EnsembleDetector()
texts = ["Hello world", "qxzjkwpv"]
assert detector.predict(texts) == [False, True]
scores = detector.score(texts)
assert scores == detector.predict_proba(texts)
assert all(0.0 <= score <= 1.0 for score in scores)
A list input returns a list in the same order; a string returns a single result. Scores are heuristics, not probabilities. Start with serial execution for short texts and measure before enabling threads.
Choose what to detect
from pygarble import EnsembleDetector, GarbleDetector, Strategy
corruption = EnsembleDetector(profile="corruption")
assert corruption.predict("नमस्ते दुनिया") is False
assert corruption.predict("hello\x00world") is True
local = GarbleDetector(Strategy.LOCAL_ANOMALY)
assert local.predict("Please review qxzjkwpvm before delivery.") is True
keyboard = GarbleDetector(
Strategy.KEYBOARD_ADJACENCY, keyboard_layout="azerty"
)
assert keyboard.predict("azerty") is True
Use english_extended to add local anomalies, repetition, and pattern matching
to the default profile. It can flag more valid text. See Choosing strategies
for choosing checks and Detection Strategies for the complete settings catalog.
Inspect a decision
from pygarble import EnsembleDetector
result = EnsembleDetector().analyze("hello\x00world")
assert result.garbled is True
assert result.status == "garbled"
for signal in result.signals:
print(signal.strategy, signal.score, signal.applicable, signal.reason)
empty = EnsembleDetector().analyze("")
assert empty.garbled is False
assert empty.status == "insufficient_evidence"
Required fields need a separate empty-input check. For JSON output and spans, see Python examples. For thresholds, voting, limits, and errors, see API Reference.