בנה כלי לבדיקת העתקות משלך ולמד על היכולות החזקות של מודול Difflib.
ככל שהתוכן הדיגיטלי גדל בפופולריותו, הפך חשוב מתמיד להגן עליו מפני העתקה ושימוש לרעה. כלי לזיהוי גניבת דעת יכול לעזור למורים להעריך את עבודתם של תלמידים, למוסדות לבדוק עבודות מחקר ולכותבים לזהות גניבה של הקניין הרוחני שלהם.
בניית כלי פלגיאט יכולה לעזור לך להבין התאמת רצף, פעולות קבצים וממשקי משתמש. אתה גם תחקור טכניקות לעיבוד שפה טבעית (NLP) כדי לשפר את היישום שלך.
מודול Tkinter ו-Difflib
כדי לבנות גלאי פלגיאט, תשתמש ב-Tkinter ובמודול Difflib. Tkinter היא ספרייה פשוטה, חוצת פלטפורמות שאתה יכול להשתמש בהם כדי ליצור ממשקי משתמש גרפיים בִּמְהִירוּת.
מודול Difflib הוא חלק מהספרייה הסטנדרטית של Python המספקת מחלקות ופונקציות להשוואת רצפים כמו מחרוזות, רשימות וקבצים. עם זה, אתה יכול לבנות תוכניות כמו מתקן טקסט אוטומטי, מפושט מערכת בקרת גרסאות, או כלי לסיכום טקסט.
כיצד לבנות גלאי פלגיאט באמצעות Python
אתה יכול למצוא את כל קוד המקור בונה גלאי גניבת עין באמצעות Python בזה מאגר GitHub.
ייבא את המודולים הדרושים. הגדירו שיטה, load_file_or_display_contents()
זה לוקח כְּנִיסָה ו text_widget כטיעונים. שיטה זו תטען קובץ טקסט ותציג את תוכנו בווידג'ט טקסט.להשתמש ב לקבל() שיטה לחלץ את נתיב הקובץ. אם המשתמש לא הזין דבר, השתמש ב- 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)
הגדירו שיטה, compare_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(). להשתמש ב לקבל() שיטה לחלץ את הטקסט משתי תיבות הטקסט ולהעביר אותן ל- compare_text() פוּנקצִיָה. נקה את תוכן תיבת הטקסט שתציג את התוצאה והכנס את אחוז הדמיון. הסר את "אותו" תג מההדגשה הקודמת (אם יש).
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() השיטה מחזירה חמישה tuples: מחרוזת opcode, אינדקס ההתחלה של הרצף הראשון, אינדקס הסיום של הרצף הראשון, אינדקס ההתחלה של הרצף השני ואינדקס הסיום של השני סדר פעולות.
מחרוזת ה-opcode יכולה להיות אחד מארבעה ערכים אפשריים: replace, delete, insert ושווה. אתה תקבל החלף כאשר חלק מהטקסט בשני הרצפים שונה, ומישהו החליף חלק אחד באחר. אתה תקבל לִמְחוֹק כאשר חלק מהטקסט קיים ברצף הראשון אך לא השני.
אתה מקבל לְהַכנִיס כאשר חלק מהטקסט נעדר ברצף הראשון אך קיים בשני. אתה מקבל שווה כאשר חלקי הטקסט זהים. אחסן את כל הערכים הללו במשתנים מתאימים. אם מחרוזת 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() הפונקציה אומרת לפייתון להפעיל את לולאת האירועים של Tkinter ולהקשיב לאירועים עד שתסגור את החלון.
root.mainloop()
חבר את הכל יחד והפעל את הקוד כדי לזהות גניבת עין.
פלט דוגמה של גלאי פלגיאט
כאשר אתה מפעיל את התוכנית, היא מציגה חלון. על פגיעה ב טען קובץ 1 כפתור, תיפתח דו-שיח של קובץ ומבקש ממך לבחור קובץ. בבחירת קובץ, התוכנית מציגה את התוכן בתוך תיבת הטקסט הראשונה. בכניסה לשביל ומכה טען קובץ 2, התוכנית מציגה את התוכן בתיבת הטקסט השנייה. על פגיעה ב לְהַשְׁווֹת כפתור, אתה מקבל את הדמיון כ-100%, והוא מדגיש את הטקסט כולו עבור 100% דמיון.
אם תוסיף שורה נוספת לאחת מתיבות הטקסט ותלחץ לְהַשְׁווֹת, התוכנית מדגישה את החלק הדומה ומשאירה את השאר.
אם יש מעט דמיון, התוכנית מדגישה כמה אותיות או מילים, אבל אחוז הדמיון די נמוך.
שימוש ב-NLP לזיהוי פלגיאט
בעוד ש-Difflib היא שיטה רבת עוצמה להשוואת טקסט, היא רגישה לשינויים מינוריים, בעלת הבנת הקשר מוגבלת, ולעתים קרובות אינה יעילה עבור טקסטים גדולים. כדאי לשקול לחקור את עיבוד השפה הטבעית מכיוון שהוא יכול לבצע ניתוח סמנטי של הטקסט, לחלץ תכונות משמעותיות ויש לו הבנה הקשרית.
יתר על כן, אתה יכול לאמן את המודל שלך לשפות שונות ולמטב אותו ליעילות. כמה מהטכניקות שבהן אתה יכול להשתמש לזיהוי גניבת עין כוללות דמיון ג'קארד, דמיון קוסינוס, הטבעת מילים, ניתוח רצף סמוי ומודלים של רצף לרצף.