Kendi kopya denetleyici aracınızı oluşturun ve Difflib modülünün güçlü yetenekleri hakkında bilgi edinin.
Dijital içeriğin popülaritesi arttıkça, onu kopyalamaya ve kötüye kullanıma karşı korumak her zamankinden daha önemli hale geldi. Bir intihal tespit aracı, öğretmenlerin öğrencilerin çalışmalarını değerlendirmesine, kurumların araştırma kağıtlarını kontrol etmesine ve yazarların fikri mülkiyetlerinin çalınmasını tespit etmesine yardımcı olabilir.
Bir intihal aracı oluşturmak, dizi eşleştirmeyi, dosya işlemlerini ve kullanıcı arabirimlerini anlamanıza yardımcı olabilir. Uygulamanızı geliştirmek için doğal dil işleme (NLP) tekniklerini de keşfedeceksiniz.
Tkinter ve Difflib Modülü
Bir intihal detektörü oluşturmak için Tkinter ve Difflib modülünü kullanacaksınız. Tkinter basit, platformlar arası bir kitaplıktır oluşturmak için kullanabileceğiniz grafiksel kullanıcı arayüzleri hızlıca.
Difflib modülü, dizeler, listeler ve dosyalar gibi dizileri karşılaştırmak için sınıflar ve işlevler sağlayan Python standart kitaplığının bir parçasıdır. Bununla birlikte, otomatik metin düzeltici, basitleştirilmiş bir metin düzeltici gibi programlar oluşturabilirsiniz.
sürüm kontrol sistemiveya bir metin özetleme aracı.Python Kullanarak Bir İntihal Dedektörü Nasıl Oluşturulur
Python kullanarak bir intihal detektörü oluşturan kaynak kodun tamamını burada bulabilirsiniz. GitHub deposu.
Gerekli modülleri içe aktarın. Bir yöntem tanımlayın, load_file_or_display_contents() bu alır giriş Ve metin_widget'ı argümanlar olarak. Bu yöntem bir metin dosyası yükler ve içeriğini bir metin parçacığında görüntüler.
Kullan elde etmek() dosya yolunu ayıklama yöntemi. Kullanıcı herhangi bir şey girmediyse, askopenfilename() intihal kontrolü için istenen dosyayı seçmek üzere bir dosya iletişim penceresi açma yöntemi. Kullanıcı dosya yolunu seçerse, varsa önceki girişi baştan sona temizleyin ve seçtikleri yolu ekleyin.
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)
Dosyayı okuma modunda açın ve içindekileri metin değişken. text_widget içeriğini temizleyin ve daha önce ayıkladığınız metni ekleyin.
with open(file_path, 'r') as file:
text = file.read()
text_widget.delete(1.0, tk.END)
text_widget.insert(tk.END, text)
Bir yöntem tanımlayın, metin_karşılaştır() iki metni karşılaştırmak ve benzerlik yüzdesini hesaplamak için kullanacağınız. Difflib'leri kullanın Sıra Eşleştirici() dizileri karşılaştırmak ve benzerliği belirlemek için sınıf. Özel karşılaştırma işlevini şu şekilde ayarlayın: Hiçbiri varsayılan karşılaştırmayı kullanmak ve karşılaştırmak istediğiniz metni iletmek için.
Benzerlik yüzdesini hesaplamak için kullanabileceğiniz bir kayan nokta biçiminde benzerliği elde etmek için oran yöntemini kullanın. Kullan get_opcodes() Metnin benzer bölümlerini vurgulamak ve benzerlik yüzdesiyle birlikte döndürmek için kullanabileceğiniz bir dizi işlem alma yöntemi.
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
Bir yöntem tanımlayın, show_similarity(). Kullan elde etmek() Metni her iki metin kutusundan çıkarmak ve bunları metin_karşılaştır() işlev. Sonucu gösterecek metin kutusunun içeriğini temizleyin ve benzerlik yüzdesini ekleyin. Kaldır "Aynı" önceki vurgulamadan etiket (varsa).
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)
bu get_opcode() yöntem beş demet döndürür: işlem kodu dizesi, ilk dizinin başlangıç dizini, bitiş dizini birinci dizinin başlangıç dizini, ikinci dizinin başlangıç dizini ve ikinci dizinin bitiş dizini sekans.
İşlem kodu dizesi dört olası değerden biri olabilir: değiştir, sil, ekle ve eşitle. Alacaksın yer değiştirmek her iki dizideki metnin bir kısmı farklı olduğunda ve birisi bir kısmı diğeriyle değiştirdiğinde. Alacaksın silmek metnin bir kısmı birinci sekansta varken ikinci sekansta yokken.
sen alırsın sokmak metnin bir kısmı birinci sekansta yokken ikinci sekansta mevcut olduğunda. Metnin bölümleri aynı olduğunda eşit olursunuz. Tüm bu değerleri uygun değişkenlerde saklayın. işlem kodu dizesi ise eşit, ekle Aynı metin dizisine etiketleyin.
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 kök penceresini başlatın. Pencerenin başlığını ayarlayın ve içinde bir çerçeve tanımlayın. Çerçeveyi her iki yönde de uygun dolguyla düzenleyin. Görüntülenecek iki etiket tanımlayın Metin 1 Ve Metin 2. İçinde bulunması gereken üst öğeyi ve göstermesi gereken metni ayarlayın.
İkisi karşılaştırmak istediğiniz metinler için ve biri sonucu görüntülemek için olmak üzere üç metin kutusu tanımlayın. Ana öğeyi, genişliği ve yüksekliği bildirin ve sarma seçeneğini olarak ayarlayın. tk. KELİME programın kelimeleri en yakın sınırda sarması ve aradaki herhangi bir kelimeyi kırmaması için.
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)
İkisi dosyaları yüklemek ve biri karşılaştırma için olmak üzere üç düğme tanımlayın. Üst öğeyi, görüntülemesi gereken metni ve tıklandığında yürütmesi gereken işlevi tanımlayın. Dosya yolunu girmek ve ana öğeyi genişliğiyle birlikte tanımlamak için iki giriş widget'ı oluşturun.
Izgara yöneticisini kullanarak tüm bu öğeleri satırlar ve sütunlar halinde düzenleyin. düzenlemek için paketi kullanın. karşılaştır düğmesi ve text_textbox_diff. Gerektiğinde uygun dolgu ekleyin.
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)
Aynı olarak işaretlenen metni sarı bir arka plan ve kırmızı yazı tipi rengiyle vurgulayın.
text_textbox1.tag_configure("same", foreground="red", background="lightyellow")
text_textbox2.tag_configure("same", foreground="red", background="lightyellow")
bu Ana döngü() işlevi, Python'a Tkinter olay döngüsünü çalıştırmasını ve siz pencereyi kapatana kadar olayları dinlemesini söyler.
root.mainloop()
Hepsini bir araya getirin ve intihali tespit etmek için kodu çalıştırın.
İntihal Dedektörünün Örnek Çıktısı
Programı çalıştırdığınızda, bir pencere görüntüler. vurulduğunda Dosya 1'i Yükle düğmesine bastığınızda, bir dosya iletişim kutusu açılır ve sizden bir dosya seçmenizi ister. Bir dosya seçildiğinde, program içeriği ilk metin kutusunun içinde görüntüler. Yola girerken ve vururken Dosya 2'yi Yükle, program içeriği ikinci metin kutusunda görüntüler. vurulduğunda Karşılaştırmak butonu ile %100 benzerlik elde edersiniz ve %100 benzerlik için metnin tamamını vurgular.
Metin kutularından birine başka bir satır eklerseniz ve Karşılaştırmak, program benzer kısmı vurgular ve gerisini dışarıda bırakır.
Çok az benzerlik varsa veya hiç benzerlik yoksa, program bazı harfleri veya kelimeleri vurgular, ancak benzerlik yüzdesi oldukça düşüktür.
İntihal Tespiti için NLP Kullanımı
Difflib, metin karşılaştırması için güçlü bir yöntem olsa da, küçük değişikliklere karşı duyarlıdır, sınırlı bağlam anlayışına sahiptir ve genellikle büyük metinler için etkisizdir. Metnin anlamsal analizini yapabildiğinden, anlamlı özellikler çıkarabildiğinden ve bağlamsal anlama sahip olduğundan Doğal Dil İşleme'yi keşfetmeyi düşünmelisiniz.
Ayrıca modelinizi farklı diller için eğitebilir ve verimlilik için optimize edebilirsiniz. İntihal tespiti için kullanabileceğiniz tekniklerden birkaçı, Jaccard benzerliği, kosinüs benzerliği, kelime gömme, gizli dizi analizi ve diziden diziye modelleri içerir.