Schreibprozess-Erkennung
Aus Potatos Tastenanschlag-Logs prüfbare Markierungen für eingefügte, abgetippte oder maschinell erzeugte Freitextantworten gewinnen, mit Schwellenwerten, die Sie nachlesen und überschreiben können.
Die Schreibprozess-Erkennung liest die Tippdynamik, die das Tastenanschlag-Logging erfasst, und erzeugt benannte Markierungen samt Belegen, sodass Sie sehen, welche Merkmalswerte jede einzelne ausgelöst haben, und die verwerfen können, denen Sie nicht folgen.
Sie braucht Potato 2.7.2 oder neuer und läuft nur dort, wo das Tastenanschlag-Logging bereits an ist. Da keystroke_logging.enabled standardmäßig false ist, gibt es in einem Projekt, das sich nie dafür entschieden hat, nichts zu erkennen.
Warnung: Markierungen sind Hinweise für eine menschliche Prüfung. Sie sind kein Beweis für Fehlverhalten, und sie dürfen nie an automatische Ablehnung, das Einbehalten von Bezahlung oder Sperren von Teilnehmenden gekoppelt werden. Eine schnelle, flüssige Schreibkraft, die einen sauberen ersten Entwurf produziert, ähnelt tatsächlich dem Abtippen. Ein Annotator am Telefon ähnelt tatsächlich jemandem, der einfügt. Die Regeln unten sind darauf gebaut, solche Überschneidungen klein zu halten, und die Überschneidungen bleiben. Der Abschnitt zu den Falsch-Positiven gehört zur Funktion und ist kein Haftungsausschluss.
Drei Stufen
| Stufe | Was sie ist | Braucht gelabelte Daten? | Vorgabe |
|---|---|---|---|
| 1. Regeln | Sechs benannte Markierungen mit expliziten Schwellenwerten und sichtbaren Belegen | Nein | An |
| 2. Kalibrierung | Schwellenwerte, neu angepasst an die Annotatoren Ihres Projekts | Nein | Aus |
| 3. Überwacht | Ein Klassifikator, den Sie auf Ihren eigenen Labels trainieren | Ja | Aus |
Mit Potato wird kein vortrainiertes Modell ausgeliefert. Im Repository liegt kein gelabeltes Korpus, jede Menge von Koeffizienten, die wir ausliefern würden, käme also mit einer Validierungszahl, die wir uns ausgedacht haben. Stattdessen bekommen Sie sechs Regeln, die Sie lesen und bestreiten können. Wenn Sie echte Labels haben, ist Stufe 3 der Weg, der die Genauigkeiten aus der Literatur reproduziert.
Stufe 1: die Regeln
Jede Markierung gibt die Merkmalswerte zurück, die sie ausgelöst haben, Sie können also jede einzelne verteidigen oder verwerfen.
paste_dominant
Schweregrad: suspect. Löst aus, wenn pasted_fraction >= 0.5, also die Hälfte oder mehr des endgültigen Textes per Einfügen ankam.
Unterdrückt, wenn jede Einfügung als self (Umstellen des eigenen Entwurfs) oder instance_text (Zitieren der annotierten Passage) klassifiziert wurde.
silent_insertion
Schweregrad: suspect. Löst aus, wenn external_insert_ratio >= 0.3, also fast ein Drittel der eingefügten Zeichen ohne zugehörigen Tastenanschlag aufgetaucht ist.
Das ist das wertvollste einzelne Signal. Einfügen, Autofill, Diktat und programmatische Einschleusung zeigen sich alle hier, selbst wenn das Einfügeereignis selbst von der Seite unterdrückt wird. Es ist eine direkte Operationalisierung dessen, was Asher et al. als „Zahl der Tastenanschläge auffällig niedrig im Verhältnis zur Antwortlänge“ beschreiben.
Unterdrückt bei Bildschirmtastaturen (virtual_keyboard) und während der IME-Komposition, wo keydown nicht zuverlässig gesendet wird und sonst jede Einfügung still aussähe. Die Regel nutzt das quellenbewusste Verhältnis, legitimes Zitieren zählt also nicht mit.
transcription_rhythm
Schweregrad: review. Löst aus, wenn alle drei Bedingungen gelten:
iki_log_cv <= 0.06, ein metronomischer Tipprhythmusrevision_ratio <= 0.02, praktisch keine Löschung- weniger als 0,5 Pausen von 2 Sekunden oder länger pro 100 Zeichen
Konjunktiv mit Absicht. Jede Bedingung für sich hat eine harmlose Lesart. Zusammen ergeben sie die Signatur des Abtippens, wie Crossley et al. sie beschreiben: linear, in Schüben, mit geringer Varianz.
Für Antworten unter 80 Zeichen oder 40 Tastenanschlägen wird die Regel ganz übersprungen, dort gibt es keinen nennenswerten Rhythmus.
offscreen_composition
Schweregrad: suspect. Löst aus, wenn eine große extern stammende Einfügung (80 Zeichen oder mehr) unmittelbar auf 10 Sekunden oder mehr Abwesenheit von der Seite folgt. Das ist das Muster „zu ChatGPT gewechselt, zurückgekommen, eingefügt“.
Unterdrückt, wenn die Quelle der Einfügung die Passage oder der eigene Text des Annotators war, denn kurz wegzugehen und dann die Passage zu zitieren ist gewöhnliches Verhalten.
implausible_speed
Schweregrad: review. Löst oberhalb von 900 Zeichen pro Minute aus (etwa 180 wpm), durchgehend über eine ganze Antwort.
synthetic_input
Schweregrad: suspect. Löst bei jedem Ereignis mit isTrusted === false aus, wenn der Browser also meldet, dass die Eingabe per Skript und nicht von einer Person erzeugt wurde. Browser-Automatisierung, eingeschleuste Skripte und ein Teil der Barrierefreiheitswerkzeuge erzeugen das.
Urteilsstufen
| Stufe | Bedeutung |
|---|---|
ok | Keine Markierung ausgelöst |
review | Mindestens eine Markierung mit Schweregrad review |
suspect | Mindestens eine Markierung mit Schweregrad suspect |
Schwellenwerte überschreiben
keystroke_logging:
detection:
thresholds:
paste_dominant.pasted_fraction: 0.4
silent_insertion.ratio: 0.25
transcription_rhythm.iki_log_cv: 0.05
transcription_rhythm.revision_ratio: 0.02
transcription_rhythm.pause_2s_per_100_chars: 0.5
offscreen_composition.blur_ms: 15000
offscreen_composition.insert_chars: 100
implausible_speed.chars_per_min: 1000Schwellenwerte werden serverseitig ausgewertet und nie an den Browser geschickt. Sie zu veröffentlichen würde einem Annotator genau sagen, wie langsam er einfügen muss, um unter der Markierung zu bleiben.
Stufe 2: Kalibrierung auf das Projekt
Tastenanschlagsmerkmale schwanken erheblich mit der Schreibaufgabe (Conijn et al. 2019), und feste Schwellenwerte auf einer mischverteilten Größe sind verzerrt (Roeser et al. 2021). Eine Grenze, die für eine einsätzige Begründung funktioniert, ist für einen Essay über fünf Absätze falsch.
Die Kalibrierung setzt jeden Schwellenwert auf ein Randperzentil der Sitzungen Ihres eigenen Projekts.
# Inspect the fit without saving it
python -m potato.typing_detect calibrate config.yaml --dry-run
# Save it
python -m potato.typing_detect calibrate config.yamlkeystroke_logging:
detection:
calibrate: true # use the saved fitDie Kalibrierung braucht mindestens 30 brauchbare Sitzungen (80 Zeichen oder mehr, nicht mobil). Darunter gibt sie insufficient_data zurück, und die Vorgaben bleiben in Kraft.
Warnung: Eine Perzentilgrenze ist eine relative Definition von Ausreißern. Sie markiert konstruktionsbedingt etwa
tail_fraction(Vorgabe 5 %) der Sitzungen, selbst in einer Population, in der niemand etwas falsch macht. Sie sagt Ihnen, wo Sie zuerst hinschauen sollten. Sie ist kein Beleg. Kalibrierte Schwellenwerte werden zusätzlich auf höchstens das 3-Fache der eingebauten Vorgaben begrenzt, damit eine homogene Population eine Grenze nicht auf ihren eigenen Median ziehen und anfangen kann, ehrliche Annotatoren zu markieren.
Ein ausdrücklicher thresholds:-Eintrag sticht immer einen kalibrierten Wert, und der sticht immer die eingebaute Vorgabe.
Stufe 3: überwachter Klassifikator
Wenn Sie gelabelte Sitzungen haben, trainieren Sie ein echtes Modell:
from potato import typing_store
from potato.typing_detect import fit_supervised
rows = typing_store.feature_matrix(task_dir, project)
labels = [...] # 1 = non-composed, 0 = composed
result = fit_supervised(rows, labels, model="random_forest")
print(result["cv_accuracy_mean"], result["feature_importances"])Braucht scikit-learn, das verzögert importiert wird und keine Abhängigkeit von Potato ist.
Labels ohne externe Studie bekommen
Potatos Trainingsphase kann sie für Sie erzeugen. Bitten Sie Annotatoren, zum Aufwärmen eine vorgegebene Passage abzutippen. Ihre Abtipp-Sitzungen sind echte Beispiele fürs Abtippen, ihre normalen Antworten sind Beispiele fürs Verfassen, und damit haben Sie einen gelabelten Satz aus Ihrem eigenen Projekt, an Ihrer eigenen Aufgabe, mit Ihren eigenen Annotatoren. Das entspricht dem Vorgehen, mit dem Crossley et al. ihr Korpus gebaut haben, und das Kalibrierungsbeispiel richtet es von Anfang bis Ende ein.
Falsch-Positive
Der Fehlerfall dieser Funktion ist, einen ehrlichen Annotator zu beschuldigen. Das sind die Fälle, die den obigen Mustern berechtigterweise ähneln.
| Situation | Welcher Regel es ähnelt | Wie Potato damit umgeht |
|---|---|---|
| Zitieren der annotierten Passage | paste_dominant, silent_insertion, offscreen_composition | Unterdrückt über paste_source: instance_text |
| Umstellen des eigenen Entwurfs | Dieselben | Unterdrückt über paste_source: self |
| Tippen auf Telefon oder Tablet | silent_insertion | Unterdrückt über virtual_keyboard |
| Nicht-lateinische Eingabe per IME | silent_insertion | Unterdrückt über composition_events |
| Schnelle, flüssige Schreibkraft, sauberer Entwurf | transcription_rhythm, implausible_speed | Konjunktive Regeln; review statt suspect; Kalibrierung |
| Sehr kurze Antworten | transcription_rhythm | Unter 80 Zeichen / 40 Tastenanschlägen übersprungen |
| Diktat oder Spracherkennung | silent_insertion | Nicht abgedeckt. Wird markiert. Schließen Sie diese Annotatoren aus oder heben Sie den Schwellenwert an. |
| Screenreader und ein Teil der assistiven Technik | synthetic_input | Nicht vollständig abgedeckt. Manche Werkzeuge erzeugen nicht vertrauenswürdige Ereignisse. |
| Autokorrektur auf Mobilgeräten | silent_insertion | Teilweise. insertReplacementText zählt als extern. |
| Browser-Erweiterungen wie Grammatikhilfen | silent_insertion, synthetic_input | Nicht abgedeckt. Wird markiert. |
Die letzten vier sind echte Grenzen der Funktion und keine Versäumnisse. Wenn zu Ihrem Teilnehmerkreis Menschen gehören, die diktieren, assistive Technik nutzen oder mit Schreib-Erweiterungen arbeiten, streichen Sie diese Regeln aus Ihren Prüfkriterien oder behandeln Sie jede Markierung als Anlass, beim Annotator nachzufragen, statt zu handeln.
Barrierefreiheit
synthetic_input hängt an isTrusted, und einige assistive Technologien lösen das ebenfalls aus. Eine Person mit Behinderung dafür zu markieren, dass sie die Werkzeuge nutzt, die sie zum Arbeiten braucht, ist ein nicht hinnehmbares Ergebnis.
Diese Regel hat keinen Schwellenwert, es gibt also keinen Wert, mit dem Sie sie unerreichbar machen könnten. Wenn Ihre Studie Nutzenden assistiver Technik offensteht, nehmen Sie synthetic_input entweder aus den Prüfkriterien heraus, die Sie festhalten, oder schalten Sie die Erkennung ganz ab und werten die exportierten Merkmale selbst aus:
keystroke_logging:
enabled: true
detection:
enabled: falseSchwellenwertbasierte Regeln lassen sich unerreichbar machen, indem Sie eine absurde Grenze setzen, zum Beispiel implausible_speed.chars_per_min: 1000000.
Eingriff in Echtzeit
keystroke_logging:
detection:
on_external_insert: flag # allow | warn | block | flag| Wert | Verhalten |
|---|---|
allow | Nichts außer dem Aufzeichnen |
warn | Nicht blockierender Hinweis bei externem Einfügen, aber nicht bei Selbst- oder Passagenzitaten |
block | Einfügen und Ablegen in instrumentierten Feldern verhindern |
flag | Vorgabe. Still aufzeichnen; Sie entscheiden später |
block ist ein grobes Mittel. Es blockiert auch legitimes Zitieren, und wer entschlossen ist, tippt den Text stattdessen ab. flag und anschließend prüfen ist meist besser.
Admin-Dashboard
Das Schreibprozess-Panel im Reiter Verhalten des Admin-Dashboards zeigt Mediane pro Annotator, Einfügeraten, Raten stiller Einfügungen und jede markierte Sitzung mit ihren Belegen.
Es weist writing_process_risk aus, den Anteil der Sitzungen einer Person, die jede Markierung ausgelöst haben, gewichtet zugunsten der Signale mit der geringsten harmlosen Erklärung. Das ist eine Hilfe beim Priorisieren, bewusst getrennt vom vorhandenen suspicion_score, damit keine der beiden Zahlen die Bedeutung der anderen still verändert.
Forschungsgrundlage
Jede Quellenangabe unten ist gegen das Crossref- oder DataCite-Register geprüft.
Crossley, Tian, Choi, Holmes und Morris (2024) sammelten 500 argumentative Essays, ließen sie von anderen Workern abtippen und trennten Authentisches vom Abgetippten mit einem Random Forest zu 99 % Genauigkeit (96–98 % bei anderen Modellen). Ihre Merkmalsfamilien sind das, was Potato erfasst: Pausenzeiten vor Sätzen und Wörtern, Anzahl von Einfügungen und Löschungen, Verhältnisse von Produkt zu Prozess, Schreibschübe, Überarbeitung und Prozessvarianz. Ihr Befund ist das Konstruktionsziel. Authentisches Schreiben zeigt längere Pausen, mehr Einfügungen und Löschungen und größere Varianz; Abtippen verläuft linear und in Schüben.
Deane, Zhang, Hao und Li sowie, davon unabhängig, Zhang, Feng, He, Li und Zhu bestätigen die Trennung von Abtippen und natürlichem Schreiben, letztere mit einem Deep-Learning-Modell. Asher, Gold, Chen und Carvalho ist der Fall speziell für Crowdsourcing: ein Tastenanschlag-Werkzeug auf Prolific, das Teilnehmende markiert, die in Antwortfelder einfügen oder deren Zahl an Tastenanschlägen für ihre Antwortlänge auffällig niedrig ist.
Zu den zugrunde liegenden Prozessmaßen siehe Leijten und Van Waes (Inputlog) für die üblichen Log-Maße, Chenoweth und Hayes für das Konstrukt des Schreibschubs, Conijn, Roeser und van Zaanen zur Aufgabenabhängigkeit von Tastenanschlagsmerkmalen und Roeser, De Maeyer, Leijten und Van Waes dazu, warum feste Pausenschwellen verzerrt sind.
Literatur
- Crossley, S., Tian, Y., Choi, J. S., Holmes, L., & Morris, W. (2024). Plagiarism Detection Using Keystroke Logs. EDM 2024 (Short Papers). doi:10.5281/zenodo.12729864
- Deane, P., Zhang, M., Hao, J., & Li, C. Using Keystroke Dynamics to Detect Nonoriginal Text. Journal of Educational Measurement, 63(1). doi:10.1111/jedm.12431
- Asher, M. W., Gold, G., Chen, E., & Carvalho, P. F. (2026). Chatbots Are Undermining Crowdsourced Research in the Behavioral Sciences: Detecting Artificial Intelligence-Assisted Cheating With a Keystroke-Based Tool. Advances in Methods and Practices in Psychological Science, 9(1). doi:10.1177/25152459261424723
- Zhang, M., Feng, L., He, X., Li, C., & Zhu, M. (2026). Disentangling copy typing and natural writing behaviors using keystroke logs and deep learning model. Assessing Writing. doi:10.1016/j.asw.2026.101070
- Leijten, M., & Van Waes, L. (2013). Keystroke Logging in Writing Research: Using Inputlog to Analyze and Visualize Writing Processes. Written Communication, 30(3), 358-392. doi:10.1177/0741088313491692
- Chenoweth, N. A., & Hayes, J. R. (2001). Fluency in Writing: Generating Text in L1 and L2. Written Communication, 18(1), 80-98. doi:10.1177/0741088301018001004
- Conijn, R., Roeser, J., & van Zaanen, M. (2019). Understanding the keystroke log: the effect of writing task on keystroke features. Reading and Writing, 32(9), 2353-2374. doi:10.1007/s11145-019-09953-8
- Roeser, J., De Maeyer, S., Leijten, M., & Van Waes, L. (2021). Modelling typing disfluencies as finite mixture process. Reading and Writing. doi:10.1007/s11145-021-10203-z
- Lee, M., Liang, P., & Yang, Q. (2022). CoAuthor: Designing a Human-AI Collaborative Writing Dataset for Exploring Language Model Capabilities. CHI 2022. doi:10.1145/3491102.3502030
Weiterführende Informationen
- Tastenanschlag-Logging - was erfasst wird und wie
- Ethik des Tastenanschlag-Loggings - IRB, Einwilligung, Rechte der Teilnehmenden
- Qualitätskontrolle - Aufmerksamkeitschecks und Gold-Standards
- Admin-Dashboard - das Schreibprozess-Panel
Implementierungsdetails finden Sie in der Quelldokumentation.