كشف عملية الكتابة
حوّل سجلات ضغطات المفاتيح في Potato إلى إشارات قابلة للتدقيق على الإجابات النصية الحرة الملصوقة أو المنسوخة أو المولَّدة آلياً، بعتبات يمكنك قراءتها وتجاوزها.
يقرأ كشف عملية الكتابة ديناميات الطباعة التي يلتقطها تسجيل ضغطات المفاتيح وينتج إشارات مسمّاة مرفقة بأدلتها، فترى قيم السمات التي أطلقت كل إشارة وتطرح ما لا توافق عليه منها.
وهو يحتاج إلى Potato 2.7.2 أو أحدث، ولا يعمل إلا حيث يكون تسجيل ضغطات المفاتيح مفعّلاً أصلاً. وبما أن القيمة الافتراضية لـ keystroke_logging.enabled هي false، فالمشروع الذي لم يفعّلها ليس لديه ما يُكشف عليه.
تحذير: الإشارات قرائن للمراجعة البشرية. وهي ليست دليلاً على سوء سلوك، ولا يجوز بحال ربطها برفض تلقائي أو حجب أجر أو حظر المشاركين. فالكاتب السريع الطليق الذي ينتج مسودة أولى نظيفة يشبه النسخ فعلاً. والمعلّق الذي يكتب على هاتفه يشبه من يلصق فعلاً. والقواعد أدناه مبنية لتقليل هذه التصادمات، وهي تقع رغم ذلك. وقسم الإيجابيات الكاذبة جزء من الميزة لا إخلاء مسؤولية.
ثلاث طبقات
| الطبقة | ما هي | تحتاج بيانات موسومة؟ | الافتراضي |
|---|---|---|---|
| 1. القواعد | ست إشارات مسمّاة بعتبات صريحة وأدلة ظاهرة | لا | مفعّلة |
| 2. المعايرة | عتبات يُعاد ضبطها على معلّقي مشروعك أنت | لا | معطّلة |
| 3. الإشراف | مصنّف تدرّبه على تسمياتك أنت | نعم | معطّل |
لا يُشحن مع Potato أي نموذج مدرَّب مسبقاً. فلا متن موسوم في المستودع، وأي معاملات نشحنها ستصل ومعها رقم تحقق اخترعناه. وتحصل بدل ذلك على ست قواعد يمكنك قراءتها ومجادلتها. وإن كانت لديك تسميات حقيقية، فالطبقة الثالثة هي المسار الذي يعيد إنتاج الدقات المذكورة في الأدبيات.
الطبقة 1: القواعد
تعيد كل إشارة قيم السمات التي أطلقتها، فيمكنك الدفاع عن أي واحدة منها أو طرحها.
paste_dominant
الخطورة: suspect. تُطلَق حين pasted_fraction >= 0.5، أي أن نصف النص النهائي أو أكثر وصل عن طريق اللصق.
وتُكبَت حين تُصنَّف عمليات اللصق كلها self (إعادة ترتيب مسودتك أنت) أو instance_text (اقتباس المقطع محل التعليق التوضيحي).
silent_insertion
الخطورة: suspect. تُطلَق حين external_insert_ratio >= 0.3، أي أن قرابة ثلث الحروف المُدرَجة ظهرت دون ضغطة مفتاح مقابلة.
وهذه أعلى الإشارات المفردة قيمة. فاللصق والملء التلقائي والإملاء والحقن البرمجي تظهر كلها هنا، حتى حين تكبت الصفحة حدث اللصق نفسه. وهي تفعيل مباشر لما وصفه Asher وزملاؤه بأنه عدد ضغطات مفاتيح منخفض على نحو شاذ قياساً بطول الإجابة.
وتُكبَت على لوحات المفاتيح اللمسية (virtual_keyboard) وأثناء تأليف IME، حيث لا يصدر keydown بشكل موثوق ولولا ذلك لبدا كل إدراج صامتاً. والقاعدة تستخدم النسبة الواعية بالمصدر، فالاقتباس المشروع لا يُحسب.
transcription_rhythm
الخطورة: review. تُطلَق حين تتحقق الشروط الثلاثة كلها:
iki_log_cv <= 0.06، أي إيقاع طباعة رتيبrevision_ratio <= 0.02، أي ألا حذف عملياً- أقل من 0.5 توقف بطول ثانيتين أو أكثر لكل 100 حرف
اقترانية بالتصميم. فلكل شرط بمفرده قراءة بريئة. ومجتمعةً تكون بصمة النسخ بالطباعة التي يصفها Crossley وزملاؤه: خطية، قائمة على الدفقات، منخفضة التباين.
وتُتخطى تماماً في الإجابات دون 80 حرفاً أو 40 ضغطة مفتاح، حيث لا إيقاع يُذكر.
offscreen_composition
الخطورة: suspect. تُطلَق حين يلي إدراجٌ خارجي المصدر كبير (80 حرفاً أو أكثر) مباشرةً غياباً عن الصفحة مدته 10 ثوانٍ أو أكثر. وهذا نمط «انتقل إلى 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). فالحدّ الذي يصلح لتبرير من جملة واحدة خاطئ لمقالة من خمس فقرات.
وتضبط المعايرة كل عتبة عند مئين طرفي من جلسات مشروعك أنت.
# 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 وتبقى الافتراضيات سارية.
تحذير: حدّ المئين تعريف نسبي للقيم الشاذة. فهو بحكم بنائه يشير إلى نحو
tail_fraction(5% افتراضياً) من الجلسات حتى في مجتمع لا يخطئ فيه أحد. وهو يدلّك أين تنظر أولاً. وليس دليلاً. كما تُقيَّد العتبات المعايَرة ضمن 3 أضعاف الافتراضيات المدمجة، فلا يستطيع مجتمع متجانس أن يجرّ حدّاً إلى وسيطه هو ويبدأ بالإشارة إلى معلّقين نزهاء.
والتجاوز الصريح في thresholds: يغلب دائماً القيمة المعايَرة، والقيمة المعايَرة تغلب دائماً الافتراضي المدمج.
الطبقة 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، وهو يُستورد عند الحاجة وليس اعتمادية في Potato.
الحصول على تسميات دون دراسة خارجية
تستطيع مرحلة التدريب في Potato توليدها لك. اطلب من المعلّقين نسخ مقطع مُعطى كتمرين إحماء. فجلسات النسخ عندهم نماذج نسخ حقيقية، وإجاباتهم العادية نماذج مؤلَّفة، فتحصل على مجموعة موسومة من داخل مشروعك أنت، على مهمتك أنت، وبمعلّقيك أنت. وهذا يحاكي طريقة بناء Crossley وزملائه لمتنهم، ومثال المعايرة يهيّئه من أوله إلى آخره.
الإيجابيات الكاذبة
وضع الفشل في هذه الميزة هو اتهام معلّق نزيه. وهذه هي الحالات التي تشبه الأنماط أعلاه شبهاً مشروعاً.
| الحالة | القاعدة التي تشبهها | كيف يتعامل معها 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 | قواعد اقترانية؛ وreview لا suspect؛ والمعايرة |
| إجابات قصيرة جداً | transcription_rhythm | تُتخطى دون 80 حرفاً / 40 ضغطة |
| الإملاء أو تحويل الكلام إلى نص | silent_insertion | غير معالَج. ستُطلَق الإشارة. استبعد هؤلاء المعلّقين أو ارفع العتبة. |
| قارئات الشاشة وبعض التقنيات المساعِدة | synthetic_input | غير معالَج بالكامل. بعض الأدوات ينتج أحداثاً غير موثوقة. |
| التصحيح التلقائي على الهاتف | 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 ثم المراجعة أفضل عادةً.
لوحة تحكم المشرف
تعرض لوحة «عملية الكتابة» ضمن تبويب «السلوك» في لوحة تحكم المشرف وسائط كل معلّق، ومعدلات اللصق، ومعدلات الإدراج الصامت، وكل جلسة أُشير إليها مع دليلها.
وهي تبلّغ عن writing_process_risk، أي نصيب جلسات المستخدم التي أطلقت كل إشارة، موزوناً لصالح الإشارات الأقل احتمالاً لتفسير بريء. وهذا معين على الترتيب، أُبقي منفصلاً عمداً عن suspicion_score القائم كي لا يغيّر أي من الرقمين معنى الآخر في صمت.
الأساس البحثي
كل استشهاد أدناه محقَّق مقابل سجل Crossref أو DataCite.
جمع Crossley وTian وChoi وHolmes وMorris (2024) خمسمئة مقالة حجاجية، وطلبوا من عاملين آخرين نسخها، وفصلوا الأصيل عن المنسوخ بدقة 99% بغابة عشوائية (96-98% لنماذج أخرى). وعائلات سماتهم هي ما يلتقطه Potato: أزمنة التوقف قبل الجمل والكلمات، وأعداد الإدراج والحذف، ونسب الناتج إلى العملية، والدفقات، والمراجعة، وتباين العملية. ونتيجتهم هي هدف التصميم: الكتابة الأصيلة تُظهر توقفات أطول، وإدراجاً وحذفاً أكثر، وتبايناً أكبر؛ أما النسخ فخطّي وقائم على الدفقات.
ويؤكد Deane وZhang وHao وLi، ومن جهة أخرى Zhang وFeng وHe وLi وZhu، الفصل بين النسخ بالطباعة والكتابة الطبيعية على نحو مستقل، والأخيرون بنموذج تعلّم عميق. أما Asher وGold وChen وCarvalho فحالتهم هي الخاصة بالتعهيد الجماعي: أداة ضغطات مفاتيح على Prolific تشير إلى المشاركين الذين يلصقون في حقول الإجابة أو الذين يأتي عدد ضغطاتهم شاذاً في انخفاضه قياساً بطول إجابتهم.
ولمقاييس العملية الأساسية، انظر Leijten وVan Waes (Inputlog) لمقاييس السجل المعيارية، وChenoweth وHayes لمفهوم الدفقة، وConijn وRoeser وvan Zaanen لاعتماد سمات ضغطات المفاتيح على المهمة، وRoeser وDe Maeyer وLeijten وVan Waes لسبب تحيّز عتبات التوقف الثابتة.
المراجع
- 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، والموافقة، وحقوق المشاركين
- مراقبة الجودة - فحوصات الانتباه والمعايير الذهبية
- لوحة تحكم المشرف - لوحة «عملية الكتابة»
لمعرفة تفاصيل التنفيذ، انظر توثيق المصدر.