1
2
3
4
5
6
7
8
9
10 from tkFont import Font
11
12 from nltk.draw import *
13 from nltk.tag import RegexpTagger
14 from nltk.parse.malt import MaltParser
15 from logic import Variable
16 from drt import DrsDrawer, DrtVariableExpression
17 from glue import DrtGlue
18
56
57
58
59
60
62 tagger = RegexpTagger(
63 [('^(David|Mary|John)$', 'NNP'),
64 ('^(walks|sees|eats|chases|believes|gives|sleeps|chases|persuades|tries|seems|leaves)$', 'VB'),
65 ('^(go|order|vanish|find|approach)$', 'VB'),
66 ('^(a)$', 'ex_quant'),
67 ('^(every)$', 'univ_quant'),
68 ('^(sandwich|man|dog|pizza|unicorn|cat|senator)$', 'NN'),
69 ('^(big|gray|former)$', 'JJ'),
70 ('^(him|himself)$', 'PRP')
71 ])
72
73 depparser = MaltParser(tagger=tagger)
74 self._glue = DrtGlue(depparser=depparser, remove_duplicates=False)
75
77
78 self._sysfont = Font(font=Button()["font"])
79 root.option_add("*Font", self._sysfont)
80
81
82 self._size = IntVar(root)
83 self._size.set(self._sysfont.cget('size'))
84
85 self._boldfont = Font(family='helvetica', weight='bold',
86 size=self._size.get())
87 self._font = Font(family='helvetica',
88 size=self._size.get())
89 if self._size.get() < 0: big = self._size.get()-2
90 else: big = self._size.get()+2
91 self._bigfont = Font(family='helvetica', weight='bold',
92 size=big)
93
95 self._exampleFrame = listframe = Frame(parent)
96 self._exampleFrame.pack(fill='both', side='left', padx=2)
97 self._exampleList_label = Label(self._exampleFrame, font=self._boldfont,
98 text='Examples')
99 self._exampleList_label.pack()
100 self._exampleList = Listbox(self._exampleFrame, selectmode='single',
101 relief='groove', background='white',
102 foreground='#909090', font=self._font,
103 selectforeground='#004040',
104 selectbackground='#c0f0c0')
105
106 self._exampleList.pack(side='right', fill='both', expand=1)
107
108 for example in self._examples:
109 self._exampleList.insert('end', (' %s' % example))
110 self._exampleList.config(height=min(len(self._examples), 25), width=40)
111
112
113 if len(self._examples) > 25:
114 listscroll = Scrollbar(self._exampleFrame,
115 orient='vertical')
116 self._exampleList.config(yscrollcommand = listscroll.set)
117 listscroll.config(command=self._exampleList.yview)
118 listscroll.pack(side='left', fill='y')
119
120
121 self._exampleList.bind('<<ListboxSelect>>', self._exampleList_select)
122
124 self._readingFrame = listframe = Frame(parent)
125 self._readingFrame.pack(fill='both', side='left', padx=2)
126 self._readingList_label = Label(self._readingFrame, font=self._boldfont,
127 text='Readings')
128 self._readingList_label.pack()
129 self._readingList = Listbox(self._readingFrame, selectmode='single',
130 relief='groove', background='white',
131 foreground='#909090', font=self._font,
132 selectforeground='#004040',
133 selectbackground='#c0f0c0')
134
135 self._readingList.pack(side='right', fill='both', expand=1)
136
137
138 listscroll = Scrollbar(self._readingFrame,
139 orient='vertical')
140 self._readingList.config(yscrollcommand = listscroll.set)
141 listscroll.config(command=self._readingList.yview)
142 listscroll.pack(side='right', fill='y')
143
144 self._populate_readingListbox()
145
147
148 self._readingList.delete(0, 'end')
149 for i in range(len(self._readings)):
150 self._readingList.insert('end', (' %s' % (i+1)))
151 self._readingList.config(height=min(len(self._readings), 25), width=5)
152
153
154 self._readingList.bind('<<ListboxSelect>>', self._readingList_select)
155
165
176
183
185 self._cframe = CanvasFrame(parent, background='white',
186
187 closeenough=10,
188 border=2, relief='sunken')
189 self._cframe.pack(expand=1, fill='both', side='top', pady=2)
190 canvas = self._canvas = self._cframe.canvas()
191
192
193 self._tree = None
194 self._textwidgets = []
195 self._textline = None
196
198 menubar = Menu(parent)
199
200 filemenu = Menu(menubar, tearoff=0)
201 filemenu.add_command(label='Exit', underline=1,
202 command=self.destroy, accelerator='q')
203 menubar.add_cascade(label='File', underline=0, menu=filemenu)
204
205 actionmenu = Menu(menubar, tearoff=0)
206 actionmenu.add_command(label='Next', underline=0,
207 command=self.next, accelerator='n, Space')
208 actionmenu.add_command(label='Previous', underline=0,
209 command=self.prev, accelerator='p, Backspace')
210 menubar.add_cascade(label='Action', underline=0, menu=actionmenu)
211
212 optionmenu = Menu(menubar, tearoff=0)
213 optionmenu.add_checkbutton(label='Remove Duplicates', underline=0,
214 variable=self._glue.remove_duplicates,
215 command=self._toggle_remove_duplicates,
216 accelerator='r')
217 menubar.add_cascade(label='Options', underline=0, menu=optionmenu)
218
219 viewmenu = Menu(menubar, tearoff=0)
220 viewmenu.add_radiobutton(label='Tiny', variable=self._size,
221 underline=0, value=10, command=self.resize)
222 viewmenu.add_radiobutton(label='Small', variable=self._size,
223 underline=0, value=12, command=self.resize)
224 viewmenu.add_radiobutton(label='Medium', variable=self._size,
225 underline=0, value=14, command=self.resize)
226 viewmenu.add_radiobutton(label='Large', variable=self._size,
227 underline=0, value=18, command=self.resize)
228 viewmenu.add_radiobutton(label='Huge', variable=self._size,
229 underline=0, value=24, command=self.resize)
230 menubar.add_cascade(label='View', underline=0, menu=viewmenu)
231
232 helpmenu = Menu(menubar, tearoff=0)
233 helpmenu.add_command(label='About', underline=0,
234 command=self.about)
235 menubar.add_cascade(label='Help', underline=0, menu=helpmenu)
236
237 parent.config(menu=menubar)
238
239
240
241
242
244 canvas = self._canvas
245
246
247 if self._drsWidget is not None:
248 self._drsWidget.clear()
249
250 if self._drs:
251 self._drsWidget = DrsWidget( self._canvas, self._drs )
252 self._drsWidget.draw()
253
254 if self._error:
255 self._drsWidget = DrsWidget( self._canvas, self._error )
256 self._drsWidget.draw()
257
258
259
260
261
263 self._autostep = 0
264 if self._top is None: return
265 self._top.destroy()
266 self._top = None
267
268 - def prev(self, *e):
290
291
299
300 - def next(self, *e):
322
330
331
333 ABOUT = ("NLTK Discourse Representation Theory (DRT) Glue Semantics Demo\n"+
334 "Written by Daniel H. Garrette")
335 TITLE = 'About: NLTK DRT Glue Demo'
336 try:
337 from tkMessageBox import Message
338 Message(message=ABOUT, title=TITLE).show()
339 except:
340 ShowText(self._top, TITLE, ABOUT)
341
342 - def postscript(self, *e):
343 self._autostep = 0
344 self._cframe.print_to_file()
345
346 - def mainloop(self, *args, **kwargs):
347 """
348 Enter the Tkinter mainloop. This function must be called if
349 this demo is created from a non-interactive program (e.g.
350 from a secript); otherwise, the demo will close as soon as
351 the script completes.
352 """
353 if in_idle(): return
354 self._top.mainloop(*args, **kwargs)
355
364
366 self._glue.remove_duplicates = not self._glue.remove_duplicates
367
368 self._exampleList.selection_clear(0, 'end')
369 self._readings = []
370 self._populate_readingListbox()
371 self._readingCache = [None for ex in self._examples]
372 self._curExample = -1
373 self._error = None
374
375 self._drs = None
376 self._redraw()
377
378
383
419
420
425
436
437
452
454 examples = ['John walks',
455 'David sees Mary',
456 'David eats a sandwich',
457 'every man chases a dog',
458
459
460 'John chases himself',
461
462
463
464
465
466
467
468
469
470
471
472
473
474 ]
475 DrtGlueDemo(examples).mainloop()
476
477 if __name__ == '__main__': demo()
478