Texttechnologie 1 Doku from Python

Werbung
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
Herunterladen