लेखन-प्रक्रिया पहचान
Potato के कीस्ट्रोक लॉग को पेस्ट किए गए, नकल किए गए, या मशीन से बने फ़्री-टेक्स्ट उत्तरों के लिए जाँचने-योग्य फ़्लैग में बदलें, ऐसे थ्रेशोल्ड के साथ जिन्हें आप पढ़ भी सकते हैं और बदल भी सकते हैं।
लेखन-प्रक्रिया पहचान कीस्ट्रोक लॉगिंग से कैप्चर हुई typing dynamics पढ़ती है और साक्ष्य के साथ नामित फ़्लैग बनाती है, ताकि आप देख सकें कि किन फ़ीचर मानों ने कौन-सा फ़्लैग चलाया और जिनसे आप असहमत हैं उन्हें हटा सकें।
इसके लिए Potato 2.7.2 या उसके बाद का संस्करण चाहिए, और यह वहीं चलती है जहाँ कीस्ट्रोक लॉगिंग पहले से चालू हो। चूँकि keystroke_logging.enabled डिफ़ॉल्ट रूप से false है, जिस प्रोजेक्ट ने कभी ऑप्ट-इन नहीं किया, उसमें पहचानने को कुछ है ही नहीं।
चेतावनी: फ़्लैग मानव समीक्षा के लिए साक्ष्य हैं। वे कदाचार का प्रमाण नहीं हैं, और उन्हें स्वचालित अस्वीकृति, भुगतान रोकने, या प्रतिभागी पर प्रतिबंध से कभी नहीं जोड़ा जाना चाहिए। साफ़ पहला मसौदा लिखने वाला तेज़ और प्रवाहपूर्ण टाइपिस्ट वाक़ई नकल जैसा लगता है। फ़ोन पर काम कर रहा एनोटेटर वाक़ई पेस्ट करने वाले जैसा लगता है। नीचे दिए नियम इन टकरावों को कम करने के लिए बने हैं, और टकराव फिर भी होते हैं। फ़ॉल्स पॉज़िटिव खंड इस सुविधा का हिस्सा है, कोई अस्वीकरण नहीं।
तीन स्तर
| स्तर | यह क्या है | लेबल किया डेटा चाहिए? | डिफ़ॉल्ट |
|---|---|---|---|
| 1. नियम | स्पष्ट थ्रेशोल्ड और दिखने वाले साक्ष्य के साथ छह नामित फ़्लैग | नहीं | चालू |
| 2. कैलिब्रेशन | आपके प्रोजेक्ट के अपने एनोटेटर पर दोबारा फ़िट किए गए थ्रेशोल्ड | नहीं | बंद |
| 3. सुपरवाइज़्ड | आपके अपने लेबल पर प्रशिक्षित एक क्लासिफ़ायर | हाँ | बंद |
Potato के साथ कोई पूर्व-प्रशिक्षित मॉडल नहीं आता। रिपॉज़िटरी में कोई लेबल किया हुआ कॉर्पस नहीं है, इसलिए हम जो भी गुणांक भेजते वे एक गढ़ी हुई validation संख्या के साथ आते। इसके बजाय आपको छह नियम मिलते हैं, जिन्हें आप पढ़ सकते हैं और जिनसे बहस कर सकते हैं। अगर आपके पास असली लेबल हैं, तो साहित्य में बताई गई सटीकताएँ दोहराने का रास्ता स्तर 3 है।
स्तर 1: नियम
हर फ़्लैग वे फ़ीचर मान लौटाता है जिनकी वजह से वह चला, ताकि आप किसी भी एक फ़्लैग का बचाव कर सकें या उसे हटा सकें।
paste_dominant
गंभीरता: suspect. तब चलता है जब pasted_fraction >= 0.5, यानी अंतिम टेक्स्ट का आधा या उससे अधिक हिस्सा पेस्ट से आया।
तब दबा दिया जाता है जब हर पेस्ट self (अपना ही मसौदा दोबारा जमाना) या instance_text (एनोटेशन वाले अंश को उद्धृत करना) के रूप में वर्गीकृत हुआ हो।
silent_insertion
गंभीरता: suspect. तब चलता है जब external_insert_ratio >= 0.3, यानी डाले गए क़रीब एक-तिहाई अक्षर बिना किसी कीस्ट्रोक के प्रकट हुए।
यह अकेला सबसे क़ीमती संकेत है। पेस्ट, ऑटोफ़िल, डिक्टेशन, और प्रोग्राम से किया गया इंजेक्शन, सब यहाँ दिखते हैं, तब भी जब पेज ने पेस्ट इवेंट ख़ुद दबा दिया हो। यह Asher et al. की “उत्तर की लंबाई के मुक़ाबले असामान्य रूप से कम कीस्ट्रोक गिनती” का सीधा क्रियान्वयन है।
सॉफ़्ट कीबोर्ड (virtual_keyboard) पर और IME कंपोज़िशन के दौरान दबा दिया जाता है, जहाँ keydown भरोसे से नहीं निकलता और वरना हर इंसर्ट मौन दिखता। यह नियम स्रोत-सजग अनुपात इस्तेमाल करता है, इसलिए जायज़ उद्धरण नहीं गिने जाते।
transcription_rhythm
गंभीरता: review. तब चलता है जब ये तीनों सही हों:
iki_log_cv <= 0.06, यानी मेट्रोनोम जैसी टाइपिंग लयrevision_ratio <= 0.02, यानी लगभग कुछ भी नहीं मिटाया गया- प्रति 100 अक्षर पर 2 सेकंड या उससे लंबे ठहराव 0.5 से कम
यह जानबूझकर संयोजी है। इनमें से किसी एक का अकेला अर्थ निर्दोष हो सकता है। तीनों साथ हों तो वही कॉपी-टाइपिंग हस्ताक्षर बनता है जिसका वर्णन Crossley et al. करते हैं: रैखिक, बर्स्ट-केंद्रित, कम प्रसरण वाला।
80 अक्षरों या 40 कीस्ट्रोक से छोटे उत्तरों के लिए पूरी तरह छोड़ दिया जाता है, जहाँ लय जैसी कोई चीज़ होती ही नहीं।
offscreen_composition
गंभीरता: suspect. तब चलता है जब पेज से 10 सेकंड या उससे अधिक दूर रहने के तुरंत बाद बाहरी स्रोत से एक बड़ा इंसर्शन (80 अक्षर या अधिक) होता है। यह “ChatGPT पर गए, लौटे, पेस्ट किया” वाला पैटर्न है।
तब दबा दिया जाता है जब इंसर्शन का स्रोत वही अंश था या एनोटेटर का अपना टेक्स्ट, क्योंकि थोड़ी देर हटकर फिर अंश उद्धृत करना सामान्य व्यवहार है।
implausible_speed
गंभीरता: review. तब चलता है जब पूरे उत्तर भर 900 अक्षर प्रति मिनट (लगभग 180 wpm) से ऊपर की रफ़्तार टिकी रहे।
synthetic_input
गंभीरता: suspect. किसी भी ऐसे इवेंट पर चलता है जिसका isTrusted === false हो, यानी ब्राउज़र बता रहा है कि इनपुट किसी व्यक्ति ने नहीं, स्क्रिप्ट ने बनाया। ब्राउज़र ऑटोमेशन, इंजेक्ट की गई स्क्रिप्ट, और कुछ सुलभता उपकरण, सभी ऐसा करते हैं।
फ़ैसले के स्तर
| स्तर | अर्थ |
|---|---|
ok | कोई फ़्लैग नहीं चला |
review | कम से कम एक review-गंभीरता वाला फ़्लैग |
suspect | कम से कम एक suspect-गंभीरता वाला फ़्लैग |
थ्रेशोल्ड बदलना
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: 1000थ्रेशोल्ड सर्वर पर आँके जाते हैं और ब्राउज़र को कभी नहीं भेजे जाते। उन्हें प्रकाशित करना एनोटेटर को ठीक-ठीक बता देगा कि फ़्लैग से नीचे रहने के लिए कितनी धीमे पेस्ट करना है।
स्तर 2: प्रोजेक्ट कैलिब्रेशन
कीस्ट्रोक फ़ीचर लेखन कार्य के साथ काफ़ी बदलते हैं (Conijn et al. 2019), और मिश्रण-वितरित राशि पर तय थ्रेशोल्ड पक्षपाती होते हैं (Roeser et al. 2021)। जो कटऑफ़ एक-वाक्य के तर्क के लिए ठीक है, वह पाँच-पैराग्राफ़ के निबंध के लिए ग़लत है।
कैलिब्रेशन हर थ्रेशोल्ड को आपके अपने प्रोजेक्ट के सत्रों के एक tail percentile पर सेट करता है।
# 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 fitकैलिब्रेशन के लिए कम से कम 30 उपयोगी सत्र चाहिए (80 अक्षर या अधिक, ग़ैर-मोबाइल)। इससे कम पर यह insufficient_data लौटाता है और डिफ़ॉल्ट लागू रहते हैं।
चेतावनी: percentile कटऑफ़ outlier की एक सापेक्ष परिभाषा है। बनावट से ही यह किसी भी आबादी के लगभग
tail_fraction(डिफ़ॉल्ट 5%) सत्र फ़्लैग करता है, उस आबादी के भी जिसमें कोई कुछ ग़लत नहीं कर रहा। यह बताता है कि पहले कहाँ देखना है। यह साक्ष्य नहीं है। कैलिब्रेट किए गए थ्रेशोल्ड अतिरिक्त रूप से अंतर्निर्मित डिफ़ॉल्ट के 3x के भीतर सीमित रहते हैं, ताकि कोई समरूप आबादी किसी कटऑफ़ को खींचकर अपनी ही माध्यिका पर न ले आए और ईमानदार एनोटेटर फ़्लैग होने न लगें।
स्पष्ट thresholds: override हमेशा कैलिब्रेट किए गए मान से ऊपर रहता है, और कैलिब्रेट किया मान हमेशा अंतर्निर्मित डिफ़ॉल्ट से ऊपर।
स्तर 3: सुपरवाइज़्ड क्लासिफ़ायर
अगर आपके पास लेबल किए हुए सत्र हैं, तो एक असली मॉडल प्रशिक्षित करें:
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"])इसके लिए scikit-learn चाहिए, जो आलसी ढंग से import होता है और Potato की निर्भरता नहीं है।
बाहरी अध्ययन के बिना लेबल जुटाना
Potato का प्रशिक्षण चरण आपके लिए लेबल बना सकता है। एनोटेटर से वार्म-अप कार्य के तौर पर दिया हुआ अंश नकल करने को कहें। उनके नकल वाले सत्र नकल के असली नमूने हैं और उनके सामान्य उत्तर लिखे गए नमूने, जिससे आपको आपके अपने प्रोजेक्ट के भीतर से, आपके अपने कार्य पर, आपके अपने एनोटेटर के साथ एक लेबल किया हुआ सेट मिल जाता है। Crossley et al. ने अपना कॉर्पस इसी तरह बनाया था, और कैलिब्रेशन उदाहरण इसे शुरू से अंत तक सेट करता है।
फ़ॉल्स पॉज़िटिव
इस सुविधा की विफलता का रूप यह है कि किसी ईमानदार एनोटेटर पर आरोप लग जाए। ये वे मामले हैं जो जायज़ रूप से ऊपर बताए पैटर्न जैसे लगते हैं।
| स्थिति | किस नियम जैसी लगती है | Potato इसे कैसे सँभालता है |
|---|---|---|
| एनोटेशन वाले अंश को उद्धृत करना | paste_dominant, silent_insertion, offscreen_composition | paste_source: instance_text से दबा दिया जाता है |
| अपना ही मसौदा इधर-उधर करना | वही | paste_source: self से दबा दिया जाता है |
| फ़ोन या टैबलेट पर टाइप करना | silent_insertion | virtual_keyboard से दबा दिया जाता है |
| IME के ज़रिए ग़ैर-लैटिन इनपुट | silent_insertion | composition_events से दबा दिया जाता है |
| तेज़, प्रवाहपूर्ण टाइपिस्ट, साफ़ मसौदा | transcription_rhythm, implausible_speed | संयोजी नियम; suspect नहीं, review; कैलिब्रेशन |
| बहुत छोटे उत्तर | transcription_rhythm | 80 अक्षर / 40 कीस्ट्रोक से नीचे छोड़ दिया जाता है |
| डिक्टेशन या speech-to-text | silent_insertion | नहीं सँभाला गया। फ़्लैग होगा। उन एनोटेटर को बाहर रखें या थ्रेशोल्ड बढ़ाएँ। |
| स्क्रीन रीडर और कुछ सहायक तकनीक | synthetic_input | पूरी तरह नहीं सँभाला गया। कुछ उपकरण untrusted इवेंट बनाते हैं। |
| मोबाइल पर ऑटोकरेक्ट | silent_insertion | आंशिक रूप से। insertReplacementText बाहरी गिना जाता है। |
| व्याकरण जैसे ब्राउज़र एक्सटेंशन | silent_insertion, synthetic_input | नहीं सँभाला गया। फ़्लैग होगा। |
आख़िरी चार असली सीमाएँ हैं, चूक नहीं। अगर आपके प्रतिभागी समूह में डिक्टेशन उपयोगकर्ता, सहायक-तकनीक उपयोगकर्ता, या लेखन एक्सटेंशन इस्तेमाल करने वाले लोग हैं, तो या तो उन नियमों को अपनी समीक्षा कसौटी से हटा दें, या हर फ़्लैग को कार्रवाई करने के बजाय एनोटेटर से पूछने का संकेत मानें।
सुलभता
synthetic_input isTrusted पर टिका है, जिसे कुछ सहायक तकनीकें भी छेड़ देती हैं। किसी दिव्यांग एनोटेटर को इसलिए फ़्लैग करना कि वह काम करने के लिए ज़रूरी उपकरण इस्तेमाल कर रहा था, अस्वीकार्य नतीजा है।
उस नियम का कोई थ्रेशोल्ड नहीं है, इसलिए ऐसा कोई मान नहीं जिसे सेट करके आप उसे पहुँच से बाहर कर दें। अगर आपका अध्ययन सहायक-तकनीक उपयोगकर्ताओं के लिए खुला है, तो या तो जो भी समीक्षा कसौटी आप लिखें उससे synthetic_input बाहर रखें, या पहचान पूरी तरह बंद करके निर्यात किए गए फ़ीचर ख़ुद विश्लेषित करें:
keystroke_logging:
enabled: true
detection:
enabled: falseथ्रेशोल्ड-आधारित नियमों को बेतुका कटऑफ़ सेट करके पहुँच से बाहर किया जा सकता है, जैसे implausible_speed.chars_per_min: 1000000।
वास्तविक समय में हस्तक्षेप
keystroke_logging:
detection:
on_external_insert: flag # allow | warn | block | flag| मान | व्यवहार |
|---|---|
allow | रिकॉर्ड करने के अलावा कुछ न करें |
warn | बाहरी पेस्ट पर बिना रोक-टोक सूचना, पर अपने या अंश के उद्धरणों पर नहीं |
block | मापे जा रहे फ़ील्ड में पेस्ट और ड्रॉप रोक दें |
flag | डिफ़ॉल्ट। चुपचाप दर्ज करें; फ़ैसला आप बाद में करें |
block एक भोथरा औज़ार है। यह जायज़ उद्धरण भी रोकता है, और ठान लेने वाला प्रतिभागी उसके बदले दोबारा टाइप कर सकता है। flag रखकर फिर समीक्षा करना आमतौर पर बेहतर है।
एडमिन डैशबोर्ड
एडमिन डैशबोर्ड के Behavioral टैब के नीचे मौजूद Writing Process पैनल प्रति-एनोटेटर माध्यिकाएँ, पेस्ट दरें, मौन-इंसर्शन दरें, और हर फ़्लैग हुआ सत्र उसके साक्ष्य के साथ दिखाता है।
यह writing_process_risk बताता है, यानी किसी उपयोगकर्ता के सत्रों का वह हिस्सा जिसने हर फ़्लैग चलाया, उन संकेतों की ओर भारित जिनकी निर्दोष व्याख्या सबसे कम है। यह एक रैंकिंग सहायक है, जिसे जानबूझकर मौजूदा suspicion_score से अलग रखा गया है ताकि कोई भी संख्या चुपचाप दूसरी का अर्थ न बदल दे।
शोध आधार
नीचे दिया हर उद्धरण Crossref या DataCite रजिस्ट्री के विरुद्ध सत्यापित है।
Crossley, Tian, Choi, Holmes और Morris (2024) ने 500 तर्कात्मक निबंध इकट्ठा किए, दूसरे वर्करों से उनकी नकल करवाई, और random forest से असली को नकल से 99% सटीकता पर अलग किया (दूसरे मॉडलों के लिए 96-98%)। उनके फ़ीचर परिवार वही हैं जो Potato कैप्चर करता है: वाक्यों और शब्दों से पहले के ठहराव, इंसर्शन और डिलीशन की गिनती, product-to-process अनुपात, बर्स्ट, संशोधन, और प्रक्रिया का प्रसरण। उनका निष्कर्ष ही डिज़ाइन का लक्ष्य है। असली लेखन में लंबे ठहराव, अधिक इंसर्शन और डिलीशन, और अधिक प्रसरण दिखता है; नकल रैखिक और बर्स्ट-केंद्रित होती है।
Deane, Zhang, Hao और Li, तथा अलग से Zhang, Feng, He, Li और Zhu, कॉपी-टाइपिंग बनाम स्वाभाविक लेखन के इस अंतर की स्वतंत्र रूप से पुष्टि करते हैं, दूसरे मामले में एक deep-learning मॉडल के साथ। Asher, Gold, Chen और Carvalho क्राउडसोर्सिंग से जुड़ा ख़ास मामला हैं: Prolific पर चला एक कीस्ट्रोक टूल, जो ऐसे प्रतिभागियों को फ़्लैग करता है जो उत्तर फ़ील्ड में पेस्ट करते हैं या जिनकी कीस्ट्रोक गिनती उनके उत्तर की लंबाई के हिसाब से असामान्य रूप से कम है।
अंतर्निहित प्रक्रिया मापों के लिए, मानक लॉग मापों हेतु Leijten और Van Waes (Inputlog) देखें, बर्स्ट की अवधारणा के लिए Chenoweth और Hayes, कीस्ट्रोक फ़ीचर की कार्य-निर्भरता के लिए Conijn, Roeser और van Zaanen, और तय ठहराव थ्रेशोल्ड पक्षपाती क्यों होते हैं इसके लिए Roeser, De Maeyer, Leijten और Van Waes।
References
- 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
आगे पढ़ें
- कीस्ट्रोक लॉगिंग - क्या कैप्चर होता है और कैसे
- कीस्ट्रोक लॉगिंग नैतिकता - IRB, सहमति, प्रतिभागी अधिकार
- गुणवत्ता नियंत्रण - attention checks और gold standards
- एडमिन डैशबोर्ड - Writing Process पैनल
कार्यान्वयन विवरण के लिए, स्रोत दस्तावेज़ देखें।