Package nltk_lite :: Package contrib :: Package mit :: Package six863 :: Package kimmo :: Module draw
[hide private]
[frames] | no frames]

Source Code for Module nltk_lite.contrib.mit.six863.kimmo.draw

  1  import Tkinter as tk 
  2  from morphology import KimmoMorphology 
  3  from fsa import FSA 
  4   
5 -class KimmoGUI(object):
6 - def __init__(self, ruleset, startTk=False):
7 import Tkinter as tk 8 if startTk: self._root = tk.Tk() 9 else: self._root = tk.Toplevel() 10 11 self.ruleset = ruleset 12 self.rules = ruleset.rules() 13 self.lexicon = ruleset.morphology() 14 15 frame = tk.Frame(self._root) 16 tk.Label(frame, text='Rules').pack(side=tk.TOP) 17 scrollbar = tk.Scrollbar(frame, orient=tk.VERTICAL) 18 self.listbox = tk.Listbox(frame, yscrollcommand=scrollbar.set, 19 exportselection=0) 20 scrollbar.config(command=self.listbox.yview) 21 scrollbar.pack(side=tk.RIGHT, fill=tk.Y) 22 self.listbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=1) 23 24 frame2 = tk.Frame(self._root) 25 tk.Label(frame2, text='Steps').pack(side=tk.TOP) 26 scrollbar2 = tk.Scrollbar(frame2, orient=tk.VERTICAL) 27 self.steplist = tk.Listbox(frame2, yscrollcommand=scrollbar2.set, 28 font='Sans 10', width='40', exportselection=0) 29 scrollbar2.config(command=self.steplist.yview) 30 scrollbar2.pack(side=tk.RIGHT, fill=tk.Y) 31 self.steplist.pack(side=tk.LEFT, fill=tk.BOTH, expand=1) 32 33 wordbar = tk.Frame(self._root) 34 self.genbox = tk.Entry(wordbar, width=30, font="Courier 14") 35 genbutton = tk.Button(wordbar, text="Generate ->", 36 command=self.generate) 37 recbutton = tk.Button(wordbar, text="<- Recognize", 38 command=self.recognize) 39 self.recbox = tk.Entry(wordbar, width=30, font="Courier 14") 40 self.resultlabel = tk.Label(wordbar, justify=tk.CENTER, text='') 41 42 self.genbox.pack(side=tk.LEFT) 43 genbutton.pack(side=tk.LEFT) 44 self.resultlabel.pack(side=tk.LEFT, fill=tk.X, expand=1) 45 self.recbox.pack(side=tk.RIGHT) 46 recbutton.pack(side=tk.RIGHT) 47 wordbar.pack(side=tk.TOP, fill=tk.X, expand=1) 48 frame.pack(side=tk.LEFT, fill=tk.Y, expand=1) 49 frame2.pack(side=tk.LEFT, fill=tk.Y, expand=1) 50 51 if self.lexicon: self.listbox.insert(tk.END, 'Lexicon') 52 else: self.listbox.insert(tk.END, '(no lexicon)') 53 for rule in self.rules: 54 self.listbox.insert(tk.END, rule.name()) 55 56 self.rframe = tk.Frame(self._root) 57 self.rframe.pack(side=tk.LEFT, fill=tk.BOTH, expand=1) 58 59 self.graph_widget = None 60 self.listbox.bind("<ButtonRelease-1>", self.graph_selected) 61 self.steplist.bind("<ButtonRelease-1>", self.step_selected) 62 63 self._root.bind('<Up>', self.select_up) 64 self._root.bind('<Down>', self.select_down) 65 66 self.widget_store = {} 67 self.steps = [] 68 for i in range(len(self.rules), -1, -1): # yes, including the last one. 69 self.draw_rule(i) 70 71 if startTk: 72 tk.mainloop()
73
74 - def step_selected(self, event):
75 values = self.steplist.curselection() 76 if len(values) == 0: return 77 index = int(values[0]) 78 self.highlight_states(self.steps[index][1], self.steps[index][2])
79 #self.draw_rule(index) 80
81 - def graph_selected(self, event):
82 values = self.listbox.curselection() 83 if len(values) == 0: return 84 index = int(values[0]) 85 self.draw_rule(index)
86
87 - def select_up(self, event):
88 values = self.steplist.curselection() 89 if len(values) == 0: values = [0] 90 index = int(values[0]) 91 if index == 0: return 92 self.steplist.selection_clear(0, tk.END) 93 self.steplist.selection_set(index-1) 94 self.step_selected(event)
95
96 - def select_down(self, event):
97 values = self.steplist.curselection() 98 if len(values) == 0: values = [0] 99 index = int(values[0]) 100 if index == len(self.steps) - 1: return 101 self.steplist.selection_clear(0, tk.END) 102 self.steplist.selection_set(index+1) 103 self.step_selected(event)
104
105 - def draw_rule(self, index):
106 if index == 0: 107 rule = self.lexicon 108 else: rule = self.rules[index-1] 109 if rule is None: return 110 if self.graph_widget is not None: 111 self.graph_widget.pack_forget() 112 if index-1 in self.widget_store: 113 self.graph, self.graph_widget = self.widget_store[index-1] 114 self.graph_widget.pack(side=tk.LEFT, fill=tk.BOTH, expand=1) 115 else: 116 self.graph_widget = self.wrap_pygraph(rule) 117 self.graph_widget.pack(side=tk.LEFT, fill=tk.BOTH, expand=1) 118 self.widget_store[index-1] = (self.graph, self.graph_widget)
119
120 - def wrap_pygraph(self, rule):
121 if isinstance(rule, KimmoMorphology): 122 title = 'Lexicon' 123 labels = False 124 else: 125 title = rule.name() 126 labels = True 127 frame = tk.Frame(self.rframe) 128 self.graph = rule.fsa().show_pygraph(title=title, labels=labels, root=frame) 129 return frame
130
131 - def highlight_states(self, states, morph):
132 select = self.listbox.curselection() or 0 133 self.listbox.delete(0, tk.END) 134 for (index, stored) in self.widget_store.items(): 135 graph, widget = stored 136 if index == -1: state = morph 137 else: state = states[index] 138 graph.deHighlightNodes() 139 graph.HighlightNode(state, None) 140 for index in range(-1, len(self.rules)): 141 if index == -1: 142 if self.lexicon: 143 state = morph 144 name = 'Lexicon' 145 text = '%s [%s]' % (name, state) 146 else: text = '(no lexicon)' 147 else: 148 state = states[index] 149 name = self.rules[index].name() 150 text = '%s [%s]' % (name, state) 151 self.listbox.insert(tk.END, text) 152 self.listbox.selection_clear(0, tk.END) 153 self.listbox.selection_set(select)
154
155 - def step(self, pairs, curr, rules, prev_states, states, morphology_state, 156 word):
157 lexical = ''.join(p.input() for p in pairs) 158 surface = ''.join(p.output() for p in pairs) 159 text = '%s<%s> | %s<%s>'%(lexical, curr.input(), surface, curr.output()) 160 blocked = [] 161 for rule, state in zip(rules, states): 162 if str(state).lower() in ['0', 'reject']: 163 blocked.append(rule.name()) 164 if blocked: 165 text +=' [%s failed]' % (', '.join(blocked)) 166 self.steplist.insert(tk.END, text) 167 self.steps.append((text, states, morphology_state, word))
168
169 - def generate(self):
170 if not self.genbox.get(): return 171 gentext = self.genbox.get().split()[0] 172 result = " ".join(self.ruleset.generate(gentext, self)) 173 self.recbox.delete(0, tk.END) 174 self.recbox.insert(0, result)
175
176 - def recognize(self):
177 if not self.recbox.get(): return 178 rectext = self.recbox.get().split()[0] 179 result = ", ".join('%s (%s)' % (word, feat) for (word, feat) in 180 self.ruleset.recognize(rectext, self)) 181 self.genbox.delete(0, tk.END) 182 self.genbox.insert(0, result)
183
184 - def succeed(self, pairs):
185 lexical = ''.join(p.input() for p in pairs) 186 surface = ''.join(p.output() for p in pairs) 187 self.steplist.insert(tk.END, 'SUCCESS: %s / %s' % (lexical, surface)) 188 self.num_results += 1 189 if self.num_results == 1: 190 self.resultlabel.configure(text='1 result') 191 else: 192 self.resultlabel.configure(text='%d results' % self.num_results) 193 self.steps.append((lexical, [None]*len(self.rules), None, ''))
194
195 - def reset(self):
196 self.steplist.delete(0, tk.END) 197 self.num_results = 0 198 self.steps = [] 199 self.resultlabel.configure(text='')
200 201 # vim:et:ts=4:sts=4:sw=4: 202