June 10, 2014 Kommentierte Abgabe: ex4.py Vorlesung: Autor: Übung: 1 Texttechnologie 2, Prof. Mehler, Uni Frankfurt im Sommersemester 2014 Sven Köppel Übung 4 String-Kernel 1 Parameter 1 2 Algorithmus 1 3 Test 2 1 Parameter Dependencies: • Python (Getestet mit Version 2.7.6 bzw. iPython 1.2) • optional Numpy (Lineare Algebra, Version 1.8.1 verwendet) • optional Matplotlib/Pylab (internes Graph-Plotting, gleiche Version wie numpy) 20 21 from math import sqrt Wert für λ 23 lambd = 0.2 Soll geplottet werden? 26 do_plotting = True Sollen CSV-Ausgaben der Testwortpaare in stdout geschrieben werden? 29 do_csv = True 2 Algorithmus Hilfsfunktion von gemeinsamen Code 35 36 37 38 39 40 41 def Khilf (s , t ): # Notation im Paper " Haskell - Artig " letztes Zeichen abstrippen x , s = s[ -1 ] , s [ 0: -1 ] # Liste von Indizes wo t [j ] = = x # ** AChtung ** : Die Indizes werden im Paper von 1 gezaehlt , bei Python ⤦ Ç von 0. jList = [ j for j , c in enumerate ( t ) if c = = x ] return x ,s , jList K_ = Ki′ (s, t) 44 45 46 47 48 49 def K_ (i , s , t ) : # print " K_ (% d , if i = = 0 : return if min ( len ( s ) , return %s , % s ) " % (i ,s , t ) 1 len ( t ) ) < i : 0 STRING-KERNEL 2 50 x ,s , jList = Khilf (s , t ) 51 52 return lambd * K_ (i , s , t ) + Ç lambd **( len ( t ) -j +2) for j in jList ] ) 53 sum ([ K_ (i -1 , s , t [0 :j ] ) * ⤦ Die (ungenormte) Funktion Kn (s, t) 57 58 59 60 def K (n , s , t ) : # print " K (% d , %s , % s ) " % (n ,s , t ) if min ( len ( s ) , len ( t ) ) < n : return 0 61 x ,s , jList = Khilf (s , t ) 62 63 return K (n , s , t ) + Ç for j in jList ] ) 64 Die genormte Funktion K̂n (s, t) = ⌈︂ sum ( [ K_ (n -1 , s , t [0 : j] ) * lambd **2 ⤦ Kn (s,t) . Kn (s,s)Kn (t,t) Ich habe noch die Cutoff-Bedingung dazugepackt, weil zu kurze Strings bei zu großen n sonst im Normierungsprozess zu einer Division durch 0 führen. 74 75 76 def Knorm (n , s , t ): if min ( len ( s ) , len ( t ) ) < n : return 0 77 return K (n , s , t ) / sqrt ( K (n ,s , s ) * K (n ,t , t ) ) 78 3 Test Mit diesen vier Wortpaaren wird getestet 80 81 wortpaare = [" Gawain Gawan " , " Auto Auto " , " groß klein " , " Auto Autoschloss "] wortpaare = [ paar . lower () . split ( " " ) for paar in wortpaare ] Diese Werte für n in K̂n (s, t) werden verwendet: 84 85 n = range (1 ,7) data = [ [ Knorm (i ,s , t ) for i in n ] for s , t in wortpaare ] Als "CSV" auf die Standardausgabe ausgeben: 94 95 96 97 98 99 100 if do_csv : def print_csv ( data ) : for line in data : for x in line : print " % -9 s " % x , print " " csv = [ [" WortA " , " WortB " ]+ [ " n= % d " % i for i in n ] ] + Ç [ [s , t]+ [ " %.3 f " % x for x in data [i ] ] for i ,( s , t ) in ⤦ Ç enumerate ( wortpaare ) ] print_csv ( csv ) WortA gawain auto groß auto WortB n= 1 gawan 0.935 auto 1.000 klein 0.000 autoschloss 0.574 Als Plot anzeigen n =2 0.709 1.000 0.000 0.483 n=3 0.620 1.000 0.000 0.454 n =4 0.466 1.000 0.000 0.327 n=5 0.136 0.000 0.000 0.000 ⤦ n =6 0.000 0.000 0.000 0.000 STRING-KERNEL 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 if do_plotting : from pylab import * from unidecode import unidecode ion () ; clf () for i ,( s , t ) in enumerate ( wortpaare ) : # matplotlib hat Probleme mit UTF -8 - Transliterate it . label = unidecode ( ( " % s - % s " %( s , t ) ) . decode ( ’utf -8 ’) ) plot ( data [ i] , "o - " , label = label , markersize = 10 ) legend () ylabel ( " K̂n (s, t)" ) xlabel ( "n" ) title ( " Texttechnologie 2 , Blatt 4: String Kernel " ) xticks ( range (0 , len ( n ) ) , n ) eps = 0.05 ylim (0 - eps , 1+ eps ) show () Texttechnologie 2, Blatt 4: String Kernel gawain - gawan auto - auto gross - klein auto - autoschloss 1.0 0.8 0.6 K̂n (s,t) 102 3 0.4 0.2 0.0 1 2 3 n 4 5 6