Zbuduj własne narzędzie do sprawdzania kopii i poznaj potężne możliwości modułu Difflib.
Wraz ze wzrostem popularności treści cyfrowych ochrona ich przed kopiowaniem i niewłaściwym wykorzystaniem stała się ważniejsza niż kiedykolwiek. Narzędzie do wykrywania plagiatu może pomóc nauczycielom w ocenie pracy uczniów, instytucjom w sprawdzaniu prac naukowych, a pisarzom w wykrywaniu kradzieży ich własności intelektualnej.
Zbudowanie narzędzia antyplagiatowego może pomóc w zrozumieniu dopasowywania sekwencji, operacji na plikach i interfejsów użytkownika. Poznasz również techniki przetwarzania języka naturalnego (NLP) w celu udoskonalenia aplikacji.
Moduł Tkinter i Difflib
Aby zbudować wykrywacz plagiatu, użyjesz Tkintera i modułu Difflib. Tkinter to prosta, wieloplatformowa biblioteka których możesz użyć do stworzenia graficzne interfejsy użytkownika szybko.
Moduł Difflib jest częścią standardowej biblioteki Pythona, która udostępnia klasy i funkcje do porównywania sekwencji, takich jak ciągi znaków, listy i pliki. Dzięki niemu można budować programy typu autokorekta tekstu, uproszczone
system kontroli wersjilub narzędzie podsumowujące tekst.Jak zbudować wykrywacz plagiatu za pomocą Pythona
Możesz znaleźć cały kod źródłowy budujący wykrywacz plagiatu za pomocą Pythona w tym Repozytorium GitHub.
Zaimportuj wymagane moduły. Zdefiniuj metodę, load_file_or_display_contents() to trwa wejście I tekst_widżet jako argumenty. Ta metoda załaduje plik tekstowy i wyświetli jego zawartość w widgecie tekstowym.
Użyj Dostawać() metoda wyodrębniania ścieżki do pliku. Jeśli użytkownik nic nie wprowadził, użyj metody askopenfilename() metodę otwierania okna dialogowego pliku w celu wybrania żądanego pliku do sprawdzenia pod kątem plagiatu. Jeśli użytkownik wybierze ścieżkę do pliku, wyczyść poprzedni wpis, jeśli taki istnieje, od początku do końca i wstaw wybraną ścieżkę.
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)
Otwórz plik w trybie odczytu i zapisz zawartość w formacie tekst zmienny. Wyczyść zawartość text_widget i wstaw wyodrębniony wcześniej tekst.
with open(file_path, 'r') as file:
text = file.read()
text_widget.delete(1.0, tk.END)
text_widget.insert(tk.END, text)
Zdefiniuj metodę, porównaj_tekst() którego użyjesz do porównania dwóch fragmentów tekstu i obliczenia ich procentowego podobieństwa. Użyj Diffliba Dopasowywanie sekwencji() class do porównywania sekwencji i określania podobieństwa. Ustaw niestandardową funkcję porównania na Nic, aby użyć porównania domyślnego, i przekaż tekst, który chcesz porównać.
Użyj metody proporcji, aby uzyskać podobieństwo w formacie zmiennoprzecinkowym, którego możesz użyć do obliczenia procentu podobieństwa. Użyj get_opcodes() metoda pobierania zestawu operacji, których można użyć do wyróżnienia podobnych fragmentów tekstu i zwrócenia ich wraz z procentem podobieństwa.
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
Zdefiniuj metodę, pokaż_podobieństwo(). Użyj Dostawać() metodę wyodrębniania tekstu z obu pól tekstowych i przekazywania ich do porównaj_tekst() funkcjonować. Wyczyść zawartość pola tekstowego, w którym zostanie wyświetlony wynik i wstaw procent podobieństwa. Usunąć "To samo" tag z poprzedniego podświetlenia (jeśli istnieje).
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)
The get_opcode() Metoda zwraca pięć krotek: ciąg opcode, indeks początkowy pierwszej sekwencji, indeks końcowy pierwszej sekwencji, indeks początkowy drugiej sekwencji i indeks końcowy drugiej sekwencja.
Ciąg opcode może mieć jedną z czterech możliwych wartości: zastąp, usuń, wstaw i wyrównaj. Dostaniesz zastępować gdy część tekstu w obu sekwencjach jest inna i ktoś zastąpił jedną część inną. Dostaniesz usuwać gdy część tekstu występuje w pierwszej sekwencji, ale nie w drugiej.
Dostajesz wstawić gdy część tekstu jest nieobecna w pierwszej sekwencji, ale obecna w drugiej. Otrzymujesz równe, gdy części tekstu są takie same. Zapisz wszystkie te wartości w odpowiednich zmiennych. Jeśli ciąg opcode jest równy, Dodaj To samo tag do sekwencji tekstu.
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")
Zainicjuj okno główne Tkintera. Ustaw tytuł okna i zdefiniuj w nim ramkę. Uporządkuj ramę z odpowiednią wyściółką w obu kierunkach. Zdefiniuj dwie etykiety do wyświetlenia Tekst 1 I Tekst 2. Ustaw element nadrzędny, w którym powinien się znajdować, oraz tekst, który powinien wyświetlać.
Zdefiniuj trzy pola tekstowe, dwa dla tekstów, które chcesz porównać, i jedno, aby wyświetlić wynik. Zadeklaruj element nadrzędny, szerokość i wysokość oraz ustaw opcję zawijania na tk. SŁOWO aby upewnić się, że program zawija słowa na najbliższej granicy i nie łamie żadnego słowa pomiędzy.
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)
Zdefiniuj trzy przyciski, dwa do ładowania plików i jeden do porównania. Zdefiniuj element nadrzędny, tekst, który ma wyświetlać, oraz funkcję, którą ma wykonać po kliknięciu. Utwórz dwa widżety wpisów, aby wprowadzić ścieżkę do pliku i zdefiniować element nadrzędny wraz z jego szerokością.
Uporządkuj wszystkie te elementy w wierszach i kolumnach za pomocą menedżera siatki. Użyj pakietu, aby uporządkować porównaj_przycisk i text_textbox_diff. W razie potrzeby dodaj odpowiednią wyściółkę.
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)
Zaznacz tekst oznaczony jako taki sam żółtym tłem i czerwonym kolorem czcionki.
text_textbox1.tag_configure("same", foreground="red", background="lightyellow")
text_textbox2.tag_configure("same", foreground="red", background="lightyellow")
The główna pętla() mówi Pythonowi, aby uruchomił pętlę zdarzeń Tkinter i nasłuchiwał zdarzeń, dopóki nie zamkniesz okna.
root.mainloop()
Złóż to wszystko razem i uruchom kod, aby wykryć plagiat.
Przykładowe dane wyjściowe detektora plagiatu
Po uruchomieniu programu wyświetla się okno. Na trafieniu Załaduj plik 1 otwiera się okno dialogowe pliku i prosi o wybranie pliku. Po wybraniu pliku program wyświetla zawartość w pierwszym polu tekstowym. Przy wejściu na ścieżkę i uderzeniu Załaduj plik 2, program wyświetla zawartość w drugim polu tekstowym. Na trafieniu Porównywać przycisk, otrzymasz podobieństwo jako 100% i podświetli cały tekst dla 100% podobieństwa.
Jeśli dodasz kolejną linię do jednego z pól tekstowych i trafisz Porównywać, program podświetli podobną część i pominie resztę.
Jeśli podobieństwo jest niewielkie lub żadne, program podświetla niektóre litery lub słowa, ale procent podobieństwa jest dość niski.
Wykorzystanie NLP do wykrywania plagiatu
Chociaż Difflib to potężna metoda porównywania tekstów, jest wrażliwa na drobne zmiany, ma ograniczone zrozumienie kontekstu i często jest nieskuteczna w przypadku dużych tekstów. Powinieneś rozważyć zapoznanie się z przetwarzaniem języka naturalnego, ponieważ może ono przeprowadzać semantyczną analizę tekstu, wydobywać znaczące funkcje i ma zrozumienie kontekstowe.
Co więcej, możesz trenować swój model dla różnych języków i optymalizować go pod kątem wydajności. Niektóre techniki, których można użyć do wykrywania plagiatu, obejmują podobieństwo Jaccarda, podobieństwo kosinusowe, osadzanie słów, analizę sekwencji ukrytych i modele sekwencja-sekwencja.