قم ببناء أداة مدقق النسخ الخاصة بك وتعرف على الإمكانات القوية لوحدة Difflib.
مع تزايد شعبية المحتوى الرقمي ، أصبح من المهم أكثر من أي وقت مضى حمايته من النسخ وإساءة الاستخدام. يمكن لأداة الكشف عن الانتحال أن تساعد المعلمين في تقييم عمل الطلاب ، وتقوم المؤسسات بفحص الأوراق البحثية ، ويكتشف الكتاب سرقة ملكيتهم الفكرية.
يمكن أن يساعدك إنشاء أداة الانتحال في فهم مطابقة التسلسل وعمليات الملفات وواجهات المستخدم. ستستكشف أيضًا تقنيات معالجة اللغة الطبيعية (NLP) لتحسين تطبيقك.
وحدة Tkinter و Difflib
لإنشاء جهاز كشف سرقة أدبية ، ستستخدم وحدة Tkinter ووحدة Difflib. Tkinter هي مكتبة بسيطة ومتعددة المنصات التي يمكنك استخدامها لإنشاء واجهات المستخدم الرسومية بسرعة.
تعد وحدة Difflib جزءًا من مكتبة Python القياسية التي توفر فئات ووظائف لمقارنة التسلسلات مثل السلاسل والقوائم والملفات. باستخدامه ، يمكنك إنشاء برامج مثل المصحح التلقائي للنص ، وملف نظام التحكم في الإصدار، أو أداة تلخيص النص.
كيفية بناء جهاز كشف السرقة الأدبية باستخدام بايثون
يمكنك العثور على الكود المصدري بأكمله لبناء كاشف سرقة أدبية باستخدام Python في هذا مستودع جيثب.
استيراد الوحدات المطلوبة. تحديد طريقة ، تحميل_ملف_أو_عرض_محتويات () أن يأخذ دخول و عنصر_نص كحجج. ستقوم هذه الطريقة بتحميل ملف نصي وعرض محتوياته في عنصر واجهة مستخدم نصي.
استخدم ال يحصل() طريقة لاستخراج مسار الملف. إذا لم يقم المستخدم بإدخال أي شيء ، فاستخدم askopenfilename () طريقة لفتح نافذة حوار ملف لتحديد الملف المطلوب لفحص الانتحال. إذا حدد المستخدم مسار الملف ، فامسح الإدخال السابق ، إن وجد ، من البداية إلى النهاية وأدخل المسار الذي حدده.
import tkinter as tk
from tkinter import filedialog
from difflib import SequenceMatcherdefload_file_or_display_contents(entry, text_widget):
file_path = entry.get()ifnot file_path:
file_path = filedialog.askopenfilename()
if file_path:
entry.delete(0, tk.END)
entry.insert(tk.END, file_path)
افتح الملف في وضع القراءة وقم بتخزين المحتويات في ملف نص عامل. امسح محتويات text_widget وأدخل النص الذي استخرجته سابقًا.
with open(file_path, 'r') as file:
text = file.read()
text_widget.delete(1.0, tk.END)
text_widget.insert(tk.END, text)
تحديد طريقة ، قارن_ نص () التي ستستخدمها لمقارنة جزأين من النص وحساب نسبة التشابه بينهما. استخدم Difflib's SequenceMatcher () فئة لمقارنة التسلسلات وتحديد التشابه. اضبط وظيفة المقارنة المخصصة على لا أحد لاستخدام المقارنة الافتراضية ، وتمرير النص الذي تريد مقارنته.
استخدم طريقة النسبة للحصول على التشابه في تنسيق الفاصلة العائمة الذي يمكنك استخدامه لحساب نسبة التشابه. استخدم ال get_opcodes () طريقة لاسترداد مجموعة من العمليات التي يمكنك استخدامها لتمييز أجزاء متشابهة من النص وإعادتها مع نسبة التشابه.
defcompare_text(text1, text2):
d = SequenceMatcher(None, text1, text2)
similarity_ratio = d.ratio()
similarity_percentage = int(similarity_ratio * 100)
diff = list(d.get_opcodes())
return similarity_percentage, diff
تحديد طريقة ، show_similarity (). استخدم ال يحصل() طريقة لاستخراج النص من كل من مربعات النص وتمريرها إلى ملف قارن_ نص () وظيفة. امسح محتويات مربع النص الذي سيعرض النتيجة وأدخل نسبة التشابه. مسح ال "نفس" علامة من التمييز السابق (إن وجد).
defshow_similarity():
text1 = text_textbox1.get(1.0, tk.END)
text2 = text_textbox2.get(1.0, tk.END)
similarity_percentage, diff = compare_text(text1, text2)
text_textbox_diff.delete(1.0, tk.END)
text_textbox_diff.insert(tk.END, f"Similarity: {similarity_percentage}%")
text_textbox1.tag_remove("same", "1.0", tk.END)
text_textbox2.tag_remove("same", "1.0", tk.END)
ال get_opcode () تقوم الطريقة بإرجاع خمس مجموعات: سلسلة كود التشغيل ، فهرس البداية للتسلسل الأول ، فهرس النهاية من التسلسل الأول ، فهرس بدء التسلسل الثاني ، ومؤشر نهاية التسلسل الثاني تسلسل.
يمكن أن تكون سلسلة شفرة التشغيل واحدة من أربع قيم محتملة: استبدال وحذف وإدراج ومساواة. ستحصل يستبدل عندما يكون جزء من النص في كلا التسلسلين مختلفًا ، وقام شخص ما باستبدال جزء بآخر. ستحصل يمسح عندما يوجد جزء من النص في التسلسل الأول وليس الثاني.
لقد حصلت إدراج عندما يكون جزء من النص غائبًا في التسلسل الأول ولكنه موجود في الثانية. تتساوى عندما تكون أجزاء النص متساوية. قم بتخزين كل هذه القيم في المتغيرات المناسبة. إذا كانت سلسلة كود التشغيل هي متساوي، أضف ال نفس علامة لتسلسل النص.
for opcode in diff:
tag = opcode[0]
start1 = opcode[1]
end1 = opcode[2]
start2 = opcode[3]
end2 = opcode[4]
if tag == "equal":
text_textbox1.tag_add("same", f"1.0+{start1}c", f"1.0+{end1}c")
text_textbox2.tag_add("same", f"1.0+{start2}c", f"1.0+{end2}c")
تهيئة نافذة الجذر Tkinter. عيّن عنوان النافذة وحدد إطارًا بداخلها. قم بتنظيم الإطار باستخدام حشوة مناسبة في كلا الاتجاهين. حدد تسميتين لعرضهما النص 1 و نص 2. عيّن العنصر الأصل الذي يجب أن يتواجد فيه والنص الذي يجب أن يعرضه.
حدد ثلاثة مربعات نصية ، اثنان للنصوص التي تريد مقارنتها وواحد لعرض النتيجة. قم بتعريف العنصر الأصل والعرض والارتفاع ، واضبط خيار الالتفاف على tk. كلمة للتأكد من أن البرنامج يلف الكلمات في أقرب حد ولا يقطع أي كلمة بينهما.
root = tk.Tk()
root.title("Text Comparison Tool")
frame = tk.Frame(root)
frame.pack(padx=10, pady=10)
text_label1 = tk.Label(frame, text="Text 1:")
text_label1.grid(row=0, column=0, padx=5, pady=5)
text_textbox1 = tk.Text(frame, wrap=tk.WORD, width=40, height=10)
text_textbox1.grid(row=0, column=1, padx=5, pady=5)
text_label2 = tk.Label(frame, text="Text 2:")
text_label2.grid(row=0, column=2, padx=5, pady=5)
text_textbox2 = tk.Text(frame, wrap=tk.WORD, width=40, height=10)
text_textbox2.grid(row=0, column=3, padx=5, pady=5)
حدد ثلاثة أزرار ، اثنان لتحميل الملفات والآخر للمقارنة. حدد العنصر الأصل ، والنص الذي يجب أن يعرضه ، والوظيفة التي يجب أن ينفذها عند النقر عليه. قم بإنشاء وحدتي إدخال لإدخال مسار الملف وتحديد العنصر الأصلي مع عرضه.
نظّم كل هذه العناصر في صفوف وأعمدة باستخدام مدير الشبكة. استخدم العبوة لتنظيم ملف قارن_زر و ال text_textbox_diff. أضف الحشو المناسب عند الضرورة.
file_entry1 = tk.Entry(frame, width=50)
file_entry1.grid(row=1, column=2, columnspan=2, padx=5, pady=5)
load_button1 = tk.Button(frame, text="Load File 1", command=lambda: load_file_or_display_contents(file_entry1, text_textbox1))
load_button1.grid(row=1, column=0, padx=5, pady=5, columnspan=2)
file_entry2 = tk.Entry(frame, width=50)
file_entry2.grid(row=2, column=2, columnspan=2, padx=5, pady=5)
load_button2 = tk.Button(frame, text="Load File 2", command=lambda: load_file_or_display_contents(file_entry2, text_textbox2))
load_button2.grid(row=2, column=0, padx=5, pady=5, columnspan=2)
compare_button = tk.Button(root, text="Compare", command=show_similarity)
compare_button.pack(pady=5)
text_textbox_diff = tk.Text(root, wrap=tk.WORD, width=80, height=1)
text_textbox_diff.pack(padx=10, pady=10)
قم بتمييز النص المميز بخلفية صفراء ولون خط أحمر.
text_textbox1.tag_configure("same", foreground="red", background="lightyellow")
text_textbox2.tag_configure("same", foreground="red", background="lightyellow")
ال mainloop () تخبر الوظيفة Python بتشغيل حلقة حدث Tkinter والاستماع إلى الأحداث حتى تغلق النافذة.
root.mainloop()
ضع كل ذلك معًا وقم بتشغيل الكود لاكتشاف الانتحال.
ناتج مثال لكاشف السرقة الأدبية
عند تشغيل البرنامج ، فإنه يعرض نافذة. عند ضرب تحميل الملف 1 الزر ، يفتح مربع حوار ملف ويطلب منك اختيار ملف. عند اختيار الملف ، يعرض البرنامج المحتويات داخل مربع النص الأول. عند دخول المسار والضرب تحميل الملف 2يعرض البرنامج المحتويات في مربع النص الثاني. عند ضرب يقارن الزر ، تحصل على تشابه بنسبة 100٪ ، وتبرز النص بالكامل للتشابه بنسبة 100٪.
إذا قمت بإضافة سطر آخر إلى أحد مربعات النص واضغط على يقارن، يسلط البرنامج الضوء على الجزء المماثل ويترك الباقي.
إذا كان هناك القليل من التشابه أو لا يوجد أي تشابه ، فإن البرنامج يبرز بعض الأحرف أو الكلمات ، لكن نسبة التشابه منخفضة جدًا.
استخدام البرمجة اللغوية العصبية لاكتشاف الانتحال
في حين أن Difflib هي طريقة فعالة لمقارنة النص ، فهي حساسة للتغييرات الطفيفة ، ولديها فهم محدود للسياق ، وغالبًا ما تكون غير فعالة بالنسبة للنصوص الكبيرة. يجب أن تفكر في استكشاف معالجة اللغة الطبيعية حيث يمكنها إجراء تحليل دلالي للنص ، واستخراج ميزات ذات مغزى ، وفهم سياقي.
علاوة على ذلك ، يمكنك تدريب النموذج الخاص بك على لغات مختلفة وتحسينه لتحقيق الكفاءة. تتضمن بعض الأساليب التي يمكنك استخدامها للكشف عن الانتحال تشابه Jaccard وتشابه جيب التمام وتضمينات الكلمات وتحليل التسلسل الكامن ونماذج التسلسل إلى التسلسل.