# -*- coding: UTF-8 -*- # Editierdistanz wird auf Basis der Levenshtein-Distanz ermittelt. # Quelle: Source: http://code.activestate.com/recipes/576874-levenshtein- # distance/http://stackoverflow.com/questions/5306756/how-to-show-percentage- # in-python # # Jede Operation wird mit einem Punkt bewertet from Tkinter import * from ScrolledText import * #input von raw nach Textfeld ändern s1 = "dummy" s2 = "dummy" global distance def printMatrix(m): print ' ' for line in m: spTupel = () breite = len(line) for column in line: spTupel = spTupel + (column, ) print "%3i"*breite % spTupel def Prozentzahl(): global d global x len1 = len(s1) len2 = len(s2) if len1 > len2: x = len1 else: x = len2 distance = levenshtein(s1, s2) d = x - distance print "Der Fuzzy Match liegt bei: {0:.0f}%".format(float(d)/x * 100) def levenshtein(s1, s2): l1 = len(s1) l2 = len(s2) matrix = [range(l1 + 1)] * (l2 + 1) for zz in range(l2 + 1): matrix[zz] = range(zz,zz + l1 + 1) for zz in range(0,l2): for sz in range(0,l1): if s1[sz] == s2[zz]: matrix[zz+1][sz+1] = min(matrix[zz+1][sz] + 1, matrix[zz][sz+1] + 1, matrix[zz][sz]) else: matrix[zz+1][sz+1] = min(matrix[zz+1][sz] + 1, matrix[zz][sz+1] + 1, matrix[zz][sz] + 1) #print "Die Levenshtein-Matrix beider Strings sieht wie folgt aus:" #printMatrix(matrix) return matrix[l2][l1] def Compare(): print "def Compare" global s1 global s2 s1 = Textfeld1.get("0.0", END).encode('utf-8') s2 = Textfeld2.get("0.0", END).encode('utf-8') levenshtein(s1, s2) distance = levenshtein(s1, s2) print 'Die Levenshtein-Distanz von ',s1, ' und ', s2, ' ist ', distance Prozentzahl() Ergebnisfeld.config(text= "Fuzzy Match: {0:.0f}%".format(float(d)/x * 100)) def Clear(): Textfeld1.delete("0.0", END) Textfeld2.delete("0.0", END) #GUI tkFenster = Tk() tkFenster.wm_title = "EditDistance" Textfeld1 = ScrolledText(tkFenster, width = 80, height = 10) Textfeld1.pack(fill="both", expand=True) Textfeld2 = ScrolledText(tkFenster, width = 80, height = 10) Textfeld2.pack(fill="both", expand=True) Ergebnisfeld = Label(tkFenster, text = "Fuzzy match: 0%", anchor=N) Ergebnisfeld.pack() Button1 = Button(tkFenster, text = "Check", command = Compare) Button1.pack(fill="both", expand=True) Button2 = Button(tkFenster, text = "Clear", command = Clear) Button2.pack(fill="both", expand=True) tkFenster.mainloop()